我为我正在处理的项目继承了一些代码,我经常看到使用这种语法
let arrayAsObject = [];
arrayAsObject.foo = 'bar';
console.log(arrayAsObject.foo); //bar
console.log(Array.isArray(arrayAsObject)); //true
我以前从未见过像对象那样对待的数组,我在功能上想知道上面的代码和这个有什么区别
let pojo = {};
pojo.foo = 'bar';
console.log(pojo.foo); //'bar'
console.log(Array.isArray(pojo)); //false
除了pojo显然不是一个数组之外,从一种方式做到另一种方式有什么好处。我倾向于使用对象,因为这就是我一直这样做并看到它完成的方式,这是我第一次看到他们所使用的数组。
答案 0 :(得分:5)
JavaScript中的通用数组根本不是数组(除非优化),它们是从Array.prototype
继承的对象,特别处理一类属性名称(“数组索引”*)(好吧,排序) of),并有一个特殊的length
属性。而已。 (JavaScript现在,也以typed arrays的形式拥有真正的数组,但我们在这里谈论通用的[...]
数组。)
除了pojo显然不是一个数组之外,以一种方式与另一种方式相比,是否有任何好处。
将非索引属性添加到数组是正常的(毕竟,它们是对象),但是:
可能(或可能不会)导致JavaScript引擎对阵列进行去优化。这仅适用于阵列查找性能很重要的极少数情况。
在您之后对代码进行维护的人可能会感到惊讶。
虽然它分配的对象数量增加了一倍,但为了避免这些问题但仍然带有额外的信息,你可以考虑一个带有数组作为属性的对象:
let obj = {
foo: "bar",
data: []
};
console.log(obj.foo); //bar
console.log(Array.isArray(obj.data)); //true
这允许数组是一个没有无关信息的数组,同时仍然用它对额外信息(foo
)进行分组。
或者你可以对具有非索引属性的数组感到满意。这取决于你。
*“数组索引” - 来自the specification:
整数索引是一个字符串值属性键,它是一个规范数字字符串(请参阅7.1.16),其数值为+0或正整数≤2 53 -1。 数组索引是整数索引,其数值 i 在+0≤i<1的范围内。 2 32 -1。