关于数组的前端面试题
1、如何判断一个变量是否为数组?
(1)为什么不用typeof?
var list = [1,2,3];
typeof list //"object"
Array继承与Object,所以typeof 会直接返回object,所以不可以用typeof方法来检测
(2)为什么不用instanceof?
var list = [1,2,3];
list instanceof Array //true
instanceof 表面上看确实是返回了true,但其实并不可靠。原因是Array实质是一个引用,用instanceof方法(包括下面的constructor方法)都是利用和引用地址进行比较的方法来确定的,但是在frame嵌套的情况下,每一个Array的引用地址都是不同的,比较起来结果也是不确定的,所以这种方法有其局限性。
(3)为什么不用constructor方法?
var list = [1,2,3];
list.constructor === Array; //true
原因已经解释过了,不再赘述。
可靠的检测数组方式
(1)利用Object的toString方法
var list = [1,2,3];
Object.prototype.toString.call(list); //[object Array]
(2)利用ES6的Array.isArray()方法
var list = [1,2,3];
Array.isArray(list); //true
2、数组的原生方法有哪些?
一是考察面试者平时使用的是否足够平凡;二是观察面试者是否对于日常的知识有所归纳。
可以用MDN中给出的方式来回答:
(1)会改变自身的方法
Array.prototype.copyWithin() 在数组内部,将一段元素序列拷贝到另一段元素序列上,覆盖原有的值。
Array.prototype.fill() 将数组中指定区间的所有元素的值,都替换成某个固定的值。
Array.prototype.pop()删除数组的最后一个元素,并返回这个元素。
Array.prototype.push()在数组的末尾增加一个或多个元素,并返回数组的新长度。
Array.prototype.reverse()颠倒数组中元素的排列顺序,即原先的第一个变为最后一个,原先的最后一个变为第一个。