为什么此数组的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索引访问正确的项目?
答案 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;