为什么不能使用索引访问此数组?

时间:2016-09-10 16:05:00

标签: javascript arrays object

为什么此数组的length属性为0?作为对该问题的跟进,为什么不能使用索引值访问此数组中的项?

请考虑以下事项:

var box = [];

box['material'] = 'cardboard';
box['size'] = 'small';

box.length; //0
console.log(box);
//[ material: 'cardboard', size: 'small' ]

box[0]; //undefined

但是,当我执行以下操作时:

var box = [];
box['0'] = true;
box['1'] = 'cardboard';
box['2'] = 'some value';

box.length; //3
box[0];// true

为什么在这种情况下输出正确的长度,因为' 0'是字符串而不是数字并使用0索引访问正确的项目?

3 个答案:

答案 0 :(得分:2)

在JavaScript中,数组的长度总是比最大​​的数字(整数)属性名称多一个。数组可以具有名称不是数字的属性,但它们不计入数组的长度(在其他一些重要情况下它们会被忽略)。

对象属性名称​​始终是字符串,但在解释为数字时为非负整数值的字符串在数组中是特殊的。使用数值访问属性是有效的,因为数字首先转换为字符串;因此box[0]box['0']完全相同。

答案 1 :(得分:0)

设置框[' material']时会创建一个名为' material'的属性。有价值的'纸板'。这不会在列表中添加元素!

您需要使用.push()或指定所需的索引。

另外,' 0'字符串是一个数字,所以obj [' 0']和obj [0]是相同的(不只是0,所有数字都会发生这种情况)

答案 2 :(得分:0)

我认为你把对象与数组混淆了。虽然数组确实是javascript中的对象,但这对我们没有帮助。

您尝试实例化的是具有键值对“material”->“cardboard”, “size”->“small”的关联数组。但是,javascript中不存在这样的数据结构。数组必须只有整数作为索引,如

box = [];
box[0] = 'material';
box[1] = 'someValue';

您的代码(仅似乎成为关联数组)的原因

box = [];
box['0'] = true;
box['1'] = 'cardboard';

工作是因为隐式类型转换。因为您已将box声明为数组,所以字符串在此位置无效,因此javascript会将其静静地转换为整数,因此您再次获得一个简单,无聊,整数索引的数组,如上所述。 / p>

但是,您可以创建一个带有属性的object。例如,您可以说明

box = {};           // box is now an object
box.size = 'small'; // box now has an attribute called “size”
                    // which has the (string) value “'small'”
box.material = 'cardboard';

或者一次性使用对象文字的表示法:

box = {
    size: 'small',
    material: 'cardboard'
};

这是你在javascript中最接近关联数组的方法。请注意,对象没有长度。如果您想访问他们拥有的属性的数量,您必须使用Object.keys(box).length。要迭代密钥,请使用

for(var key in box){
    console.log('value of ' + key + ' is ' + box[key])
}

请注意这里类似数组的表示法,但请记住:您处理的是对象,而不是数组,尽管处理它们看起来很相似。由于box是object类型,因此您不仅可以获得自己定义的属性,还可以获取为每个对象定义的任何属性。要仅获取您自己放置的按键,请使用

for (var key in box) {
    if (box.hasOwnProperty(key)) {
        // do stuff
    }
}

如果您需要在运行时添加键,即属性,请使用(例如)

//supposing that box was instantiated as above
var listOfBoxAttributes = ['shape', 'color', 'weight'];
for(var i in listOfBoxAttributes)
    box[listOfBoxAttributes[i]] = undefined;