八股 JS

JavaScript 数据类型

值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、空(Null)、未定义(Undefined)、Symbol。

引用数据类型(对象类型):对象(Object)、数组(Array)、函数(Function),还有两个特殊的对象:正则(RegExp)和日期(Date)。

数据类型判断 instanceof 和 typeof 的区别

  • typeof
    优点:能够快速区分基本数据类型
    缺点:不能将Object、Array和Null区分,都返回object

  • instanceof
    优点:能够区分Array、Object和Function,适合用于判断自定义的类实例对象
    缺点:Number,Boolean,String基本数据类型不能判断

  • Object.prototype.toString.call()
    优点:精准判断数据类型
    缺点:写法繁琐不容易记,推荐进行封装后使用

var toString = Object.prototype.toString;
console.log(toString.call(1));      //[object Number]
console.log(toString.call(true));   //[object Boolean]
console.log(toString.call('mc'));   //[object String]
console.log(toString.call([]));     //[object Array]
console.log(toString.call({}));     //[object Object]
console.log(toString.call(function(){})); //[object Function]
console.log(toString.call(undefined));  //[object Undefined]
console.log(toString.call(null)); //[object Null]

var, const, let 三者之间的区别

ES6之前创建变量用的是var,之后创建变量用的是let/const

var 存在变量提升,而const和let不存在变量提升;
let 不能重复定义 ; 关键字允许值的修改;
const 不能重复定义 ; 关键字不允许的修改;

深拷贝浅拷贝的区别

  • 【浅拷贝】: 如果属性是基本类型,拷贝的就是基本类型的值。如果属性是引用类型,拷贝的就是内存地址。即浅拷贝是拷贝一层,深层次的引用类型则共享内存地址
    ① Object.assign
    ② Array.prototype.slice(), Array.prototype.concat()
    ③ 使用拓展运算符实现的复制

  • 【深拷贝】: 深拷贝开辟一个新的栈,两个对象属完成相同,但是对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性
    常见的深拷贝方式有:
    ① _.cloneDeep()
    ② jQuery.extend()
    ③ JSON.stringify()
    ④ 手写循环递归

JS 中 this 的情况

1、普通函数调用:通过函数名()直接调用:this指向全局对象window(注意let定义的变量不是window属性,只有window.xxx定义的才是。即let a =’aaa’; this.a是undefined)

2、构造函数调用:函数作为构造函数,用new关键字调用时:this指向新new出的对象

3、对象函数调用:通过对象.函数名()调用的:this指向这个对象

4、箭头函数调用:箭头函数里面没有 this ,所以永远是上层作用域this(上下文)

5、apply和call调用:函数体内 this 的指向的是 call/apply 方法第一个参数,若为空默认是指向全局对象window。

6、函数作为数组的一个元素,通过数组下标调用的:this指向这个数组

7、函数作为window内置函数的回调函数调用:this指向window(如setInterval setTimeout 等)

列举 ES6 的新特性

let 和 const
Promise
Class
箭头函数
函数参数默认值
模版字符串
解构赋值
展开语法
构造数组,调用函数时,将 数组表达式 或 string 在语法层面展开
对象属性缩写
键名和键值相同
函数省略 function
模块化

GC 垃圾回收机制

项目中,如果存在大量不被释放的内存(堆/栈/上下文),页面性能会变得很慢。造成内存泄漏。我们尽可能减少使用闭包,因为它会消耗内存。常见的内存泄露:全局变量、闭包、DOM 元素的引用、定时器。

Javascript 具有自动垃圾回收机制 (GC:Garbage Collecation),垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存。

① 标记清除:当变量进入执行环境时,被标记为“进入环境”,当变量离开执行环境时,会被标记为“离开环境”。垃圾回收器会销毁那些带标记的值并回收它们所占用的内存空间。

② 谷歌浏览器:“查找引用”,浏览器不定时去查找当前内存的引用,如果没有被占用了,浏览器会回收它;如果被占用,就不能回收。

③ IE 浏览器:“引用计数法”,当前内存被占用一次,计数累加1次,移除占用就减1,减到0时,浏览器就回收它。

常见的兼容性问题

  1. 不同浏览器的标签默认的margin和padding不一样。*{margin:0;padding:0;}

  2. IE6 双边距 bug:块属性标签float后,又有横行的margin情况下,在IE6显示margin比设置的大。hack:display:inline; 将其转化为行内属性。

  3. 设置较小高度标签(一般小于 10 px),在 IE6,IE7 中高度超出自己设置高度。hack:给超出高度的标签设置overflow:hidden; 或者设置行高 line-height 小于你设置的高度。

  4. Chrome 中文界面下默认会将小于 12px 的文本强制按照 12px 显示,可通过加入 CSS 属性 -webkit-text-size-adjust: none; 解决。

  5. 超链接访问过后 hover 样式就不出现了,被点击访问过的超链接样式不再具有 hover 和 active 了。解决方法是改变 CSS 属性的排列顺序 :L-V-H-A ( love hate ): a:link {} a:visited {} a:hover {} a:active {}

闭包

### JavaScript逆向工程常见面试题及答案 #### 1. 反射机制的理解及其应用 反射是指在程序运行期间能够动态获取对象的信息并操作这些信息的能力。这意味着可以在运行时检查或“自省”对象的结构,以及修改内部属性或调用方法。 ```javascript // 获取类的所有属性和方法 class Example { constructor() { this.property = 'value'; } method() {} } const exampleInstance = new Example(); console.log(Object.getOwnPropertyNames(Example.prototype)); // 输出 ['constructor', 'method'] ``` 优点在于灵活性高,允许编写更通用的代码;缺点则是可能导致性能下降,并且容易引发安全风险[^2]。 #### 2. Webpack打包后的代码理解 当面对经过Webpack处理过的混淆代码时,识别原始逻辑变得复杂。例如,在给定的一段由Webpack编译出来的匿名立即执行函数表达式(IIFE),其中包含了多个闭包形式定义的小型模块化功能单元: ```javascript var func; (function (modules) { function require(moduleId) { modules[moduleId].call(func); } func = require; })({ "0": function(require, module, exports) {}, "1": function(require, module, exports) {}, }); func('0'); ``` 这段代码展示了如何通过`require()`来加载不同的模块实例[^3]。 #### 3. 模糊测试与漏洞挖掘 为了检测潜在的安全隐患如缓冲区溢出等问题,可以通过模糊测试工具(比如AFL、Hydra等),自动产生大量随机化的输入数据去尝试触发异常情况。一旦发现了崩溃或者其他不正常行为,则可能意味着存在未被发现的安全缺陷[^1]。 #### 4. 动态分析技术的应用场景 除了静态反汇编外,还可以利用调试器设置断点等方式来进行动态跟踪应用程序的行为模式。这对于理解和破解加密算法或是绕过某些保护措施特别有用。然而需要注意的是合法性和道德边界的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值