带点分配的数组

时间:2017-09-18 21:13:41

标签: javascript arrays javascript-objects

我为我正在处理的项目继承了一些代码,我经常看到使用这种语法

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显然不是一个数组之外,从一种方式做到另一种方式有什么好处。我倾向于使用对象,因为这就是我一直这样做并看到它完成的方式,这是我第一次看到他们所使用的数组。

1 个答案:

答案 0 :(得分:5)

JavaScript中的通用数组根本不是数组(除非优化),它们是从Array.prototype继承的对象,特别处理一类属性名称(“数组索引”*)(好吧,排序) of),并有一个特殊的length属性。而已。 (JavaScript现在,typed arrays的形式拥有真正的数组,但我们在这里谈论通用的[...]数组。)

  

除了pojo显然不是一个数组之外,以一种方式与另一种方式相比,是否有任何好处。

将非索引属性添加到数组是正常的(毕竟,它们是对象),但是:

  1. 可能(或可能不会)导致JavaScript引擎对阵列进行去优化。这仅适用于阵列查找性能很重要的极少数情况。

  2. 在您之后对代码进行维护的人可能会感到惊讶。

  3. 虽然它分配的对象数量增加了一倍,但为了避免这些问题但仍然带有额外的信息,你可以考虑一个带有数组作为属性的对象:

    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。