天真的困惑:
var arr1 = new Array();
var arr2 = Object.create(Array.prototype);
//Inserting elements in "both arrays"
arr1[0] =0;
arr1[9] =9;
arr2[0] =0;
arr2[9] =9;
arr1.push(10);
arr2.push(10);
console.log(arr1.length); // prints 11
console.log(arr2.length); // prints 1
两个对象都继承了Array.prototype,但它们与[]运算符的行为不同。为什么呢?
答案 0 :(得分:8)
在第一种情况下,您创建一个数组对象,在访问整数非负属性(索引)时维护length
属性。
在第二种情况下,您创建了一个继承Array
原型的常规对象。在该对象上使用[]
与任何对象相同,只需在其上设置常规属性即可。
var arr1 = new Array(); // or var arr1 = [];
arr1[0] = 0;
arr1['foo'] = 3;
// arr1 has a length of 1 because 0 is an array index and 'foo' is a regular property.
var arr2 = Object.create(Array.prototype);
arr2[0] = 0;
arr2['foo'] = 3;
// arr2 has a length of 0 because both 0 and 'foo' are regular properties.
ECMAScript 5语言规范描述了section 15.4中length
的维护方式。
数组对象对某类属性进行特殊处理 名。属性名称 P (以String值的形式)是数组索引当且仅当ToString(ToUint32( P ))是等于 P 和 ToUint32( P )不等于2 ^(32-1)。
[...]
具体来说,每当一个 添加的属性名称是数组索引,长度属性是 如有必要,更改为比该数值更多的值 数组索引;
答案 1 :(得分:-2)
var arr1 = new Array();
是实例化数组的正确方法。它与使用数组文字相同:var arr1 = [];