为什么javascript数组接受字符串值索引

时间:2019-05-27 11:45:27

标签: javascript node.js

为什么Javascript数组接受字符串作为索引,而当它接受任何字符串值作为索引时,为什么不改变其长度呢?

我是Java的新手,遇到了这个问题。

var newArr = [];
newArr[0] = 0;
newArr[1] = 1;
newArr["2"] = 3;
newArr[3] = 3;
newArr[4] = 4;
newArr["a"] = "a";
console.log(newArr);

(5) [0, 1, 3, 3, 4, a: "a"]
length: 5
__proto__: Array(0)

2 个答案:

答案 0 :(得分:4)

因为

typeof Array() === 'object'

因此,可以像在任何普通对象上一样向数组添加新属性,该属性不会更改数组长度,因为它与实际向数组中添加(推入)元素不同。

Ref

答案 1 :(得分:1)

  

为什么javscript数组接受字符串作为索引

如果所有(普通)属性键还不是字符串,则它们在赋值期间会被强制转换为字符串。

newArr["2"] = 3;

相同
newArr[2] = 3;

数组是对象,对象接受任意键值对,所以

newArr["a"] = "a";

是合法的,这很奇怪。

数组的length仅检查数字属性,请参见here

  

此Array对象的length属性是一个数据属性,其值始终在数值上大于每个名称为数组索引的可删除属性的名称。

“数组索引”表示属性键是数字。

请注意,也可能有一个符号键,这是一种情况,其中属性键不是字符串:

const sym = Symbol();
const obj = {};
obj[sym] = 'foo';

console.log(typeof sym);
console.log(obj);