带点分配的数组

ric*_*i90 0 javascript arrays javascript-objects

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

let arrayAsObject = [];
arrayAsObject.foo = 'bar';
console.log(arrayAsObject.foo); //bar
console.log(Array.isArray(arrayAsObject)); //true
Run Code Online (Sandbox Code Playgroud)

我以前从未见过像对象一样对待的数组,我在功能上想知道上面代码和这个代码有什么区别

let pojo = {};
pojo.foo = 'bar';
console.log(pojo.foo); //'bar'
console.log(Array.isArray(pojo)); //false
Run Code Online (Sandbox Code Playgroud)

除了pojo显然不是一个数组之外,从一种方式到另一种方式做它有什么好处.我倾向于使用对象,因为这是我一直这样做并看到它完成的方式,这是我第一次看到在他们的位置使用的数组.

T.J*_*der 5

JavaScript中的通用数组根本不是数组(除非优化),它们是继承的对象Array.prototype,特别处理一类属性名称("数组索引"*)(具体而言),并具有特殊length属性.而已.(JavaScript现在类型化数组形式的真实数组,但我们在这里讲的是通用[...]数组.)

除了pojo显然不是一个数组之外,从一种方式到另一种方式做它有什么好处.

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

  1. 可能(或可能不会)导致JavaScript引擎对数组进行去优化.这仅在阵列查找性能很重要的极少数情况下才有意义.

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

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

let obj = {
    foo: "bar",
    data: []
};
console.log(obj.foo); //bar
console.log(Array.isArray(obj.data)); //true
Run Code Online (Sandbox Code Playgroud)

这允许数组是一个没有无关信息的数组,同时仍然foo用它来分组额外的信息().

或者你可以使用具有非索引属性的数组.由你决定.


*"数组索引" - 来自规范:

一个整数指数是一个字符串值属性密钥是一个规范的数字串(见7.1.16),并且其数字值是0或正整数2≤ 53 -1.一个数组索引是一个整数指数,其数值的范围是从0≤I <2 32 -1.