见下面给出的情景
var x = [];
x['abc'] = "hello";
console.log(x.length); //returns 0
var x = [1,2];
x['abc'] = "hello";
console.log(x.length); //returns 2
这背后的原因还是我错过了什么?
答案 0 :(得分:5)
根据spec
length属性的值在数值上大于名称 每个属性,其名称是数组索引;每当一个 其他是创建或更改Array对象的自有属性 根据需要调整属性以保持这种不变性。
另外
具体来说,每当添加名称为数组的属性时 index,length属性的值被改变。
因此,当创建名称为数组索引的属性时,仅调整长度属性,只有长度属性更改。
'abc'
在添加到数组时是非数字(因此不是数组的索引),不会反映length
属性的任何更改。
答案 1 :(得分:2)
写作
var x = [ ];
您正在定义一个标准数组,其中索引只能是integers
。
x['abc'] = "hello";
当你执行x["abc"]
abc
时(你用作索引)不是一个整数,你基本上是为arr
对象定义一个属性(一切都是javascript中的对象) )但您没有在标准数组中添加元素。因此你的阵列保持原样。
var x = [];
x["abc"] = "hello";
console.log(x);
这就是第一种情况下数组大小为0
而第二种情况为2
的原因
如果您希望使用x
向string keys
添加属性,则需要将变量定义为对象。
var x = {}
x['abc'] = "hello";
然后您可以通过
获取对象的大小(实际上是对象中的键数)Object.keys(x).length
答案 2 :(得分:0)
您所做的是将数组转换为关联数组,其中索引是对指定值的引用。这类似于Javascript中的对象概念。
长度为0,因为真实数组从索引0开始。所以如果检查数组
console.log(x [0])// undefined
因此,长度为0.
答案 3 :(得分:0)
你不能在JavaScript中附加不是数字的用户定义键,就像在Python或Php中那样。在JavaScript中,数组的键只能是数字。
这样做:
var x = [];
x['abc'] = "hello";
console.log(x.length);
将x的长度返回为0.因为没有任何内容被推送到数组中。如果你执行console.log(x),你会发现数组没有值或是空的。
这样做:
var x = [1, 2];
x['abc'] = "hello";
console.log(x.length); //returns 2
将长度返回为0,因为数组由索引1
处的数字0
和该数组的索引/位置2
处的数字1
组成。数组中只有这些值,如果你想推动"hello"
推送它,x.push("hello")
将它推到数组的索引2
。
如果您仍想使用字母索引,请改用Objects
。