面试 三
闭包是什么
本质,闭包是个引用其他函数作用域变量的函数
对类数组对象的理解,如何转为数组
类数组也叫伪数组,但是不能调用数组的方法,常见的有arguments,通过document.getElement获取到的内容等,这些类数组具有length属性
转换方法
1.Array.from(arrayLike)
2.调用数组的 slice || splice || apply方法
Array.prototype.slice.call(arrayLike)
Array.prototype.slice.splice(arrayLike,0)
Array.prototype.slice.apply(arrayLike)
Array.propotype.slice.call()是什么
比如Array.prototype.slice.call(arguments)这句里,就是把 arguments 当做当前对象。 也就是说 要调用的是 arguments 的 slice 方法,而typeof arguments="Object" 而不是 Array 它没有slice这个方法,通过这么Array.prototype.slice.call调用,JS的内部机制应该是 把arguments对象转化为Array
typeof和instanceof区别
区别如下
1.语法不同typeof(typeof(123))会返回一个基本类型,instanceof([1,2,3] instanceof Array)返回的是布尔值
2.instanceof可以准确判断引用数据类型,但是不能正确判断原始数据类型 typeof虽然可以判断原始数据类型(null除外!!),但是无法判断引用数据类型()(function除外!!)
为什么typeof判断null为object?
js历史遗留问题,在第一版js代码中用32位比特来存储值,1-3位来识别类型,前三位000表示对象类型。而null是一个空值,二进制都为0,所以前三位也是000.
new操作符实现原理
new操作符创建一个对象,并将对象绑定到构造函数的this上 new操作符的执行过程:
- 创建一个空对象
- 设置原型,将构造函数的原型指向空对象的prototype属性
- 将this指向这个对象,通过apply执行构造函数
- 判断函数的返回值类型,如果是值类型,返回创建的对象。如果是引用类型,就返回这个引用类型的对象
for in和for of的区别
for...in和for...of都是JavaScript中的循环语句,而for…of 是ES6新增的遍历方式,允许遍历一个含有iterator接口的数据结构(数组、对象等)并且返回各项的值,和ES3中的for…in的区别如下
- for…of 遍历获取的是对象的键值,for…in 获取的是对象的键名;
- for… in 会遍历对象的整个原型链,性能非常差不推荐使用,而 for … of 只遍历当前对象不会遍历原型链;
- 对于数组的遍历,for…in 会返回数组中所有可枚举的属性(包括原型链上可枚举的属性),for…of 只返回数组的下标对应的属性值;
总结:for...in 循环主要是为了遍历对象而生,不适用于遍历数组;for...of 循环可以用来遍历数组、类数组对象,字符串、Set、Map 以及 Generator 对象。