Array知识梳理

Array的创建

注意点

Array的属性和方法

Array的类型

Array是JavaScript中的一种引用类型对象,所以追溯到根源Array也是继承自Object。

如何判断一个对象是否是数组

var arr = [1, 2, 3];
var obj = {pro: 1};

虽然上面两种方法在大多数场合用来判断实例是否为数组类型已经够用了,但是它们还是不够靠谱。因为跨页面的环境是不共享原型链的,如果在一个父页面的环境里用instanceof或者constructor去检测一个子页面的实例,得到的结果是不准确的。

var iframe = document.createElement('iframe');   
document.body.appendChild(iframe);   
xArray = window.frames[window.frames.length-1].Array;   
var arr = new xArray(1,2,3); // [1,2,3]    
arr instanceof Array; // false     
arr instanceof xArray; // true
arr.constructor === Array; // false  
arr.constructor === xArray; // true  

如上所示,Array是处于父页面的环境中的,xArray才是子页面环境中的Array。

Array的循环

注意点

类数组对象

顾名思义,类数组对象就是类似数组的对象。首先,它是个对象;其次,它只是类似数组,所以并没有所有数组的特性。

类数组对象需要满足两个条件:

它不具有数组的方法。并且添加元素并不会自动修改length属性的值。

var arr = ['a', 'b', 'c'];
var obj = {
    0: 'a',
    1: 'b',
    2: 'c',
    length: 3
};
for(var i=0;i<arr.length;i++) {
    console.log(i, arr[i]);
}
for(var j=0;j<obj.length;j++) {
    console.log(j, obj[j]);
}    

最终的输出结果是一样的,这就是类数组对象跟数组类似的地方。
但是,如果此时给obj添加元素,length属性并不会自动的增加,并且使用数组的方法会报错。

arr[3] = 'd';
console.log(arr.length);  // 4
obj[3] = 'd';
console.log(obj.length);  // 3  

obj.push('e');  // 报错  

当然,如果要让类数组对象使用数组的方法,也并不是没有办法,可以通过call或者apply方法间接达到这样的目的。

Array.prototype.slice.call(obj, eleList);  

但是要记住类数组对象它始终不是正宗的数组,所以有一些数组方法对它并不适用,如push等。

数组的空位

数组的空位是指,在数组中存在这样一个位置,但是该位置上并没有任何值(这里的任何值包括undefined,位置上的值为undefined说明该位置上依然是有值的,并不能算空位)。
在ES5中,对空位的处理并不是非常一致,所以应该避免使用空位。而在ES6中,统一将空位处理成undefined。

需要注意的是,有一种情况并不会产生空位。如下所示,最后的那个逗号会被忽略,并不会产生多余的空位。

var a = [1, 2,];  
console.log(a);  // [1, 2]    

数组的推导

数组推导提供一种简洁的写法,使能够通过现有的数组直接生成新的数组。目前被推迟到ES7中。

var arr = [1, 2, 3];
var newArr = [for (i of arr) i * 2];  // [2, 4, 6]    

参考链接