令我惊讶的是,这段代码实际上可以在node.js中使用:
var arr = new Array();
// also works: var arr = [];
arr[0] = 123;
arr['abc'] = 456;
arr; // node.js: [ 123, abc: 456 ], chrome: [123]
我一直以为数组按顺序存储它的对象,只能通过整数键访问,比如C ++中的std :: vector。但是,这里它的作用就像一张地图或一个物体。更令人困惑的是,相同的代码在chrome中按预期工作,返回一个带有单个条目的数组,123。我认为node.js和chrome javascript使用相同的内部引擎V8。这是怎么回事?
答案 0 :(得分:8)
Javascript允许您动态扩展对象 ,因为Array
是一个对象,您可以这样做。
您正在做的是向数组中添加一个名为abc
的新属性,并为其指定值456
。
所以你可以说Javascript中的每个对象都可以以某种方式用作哈希映射。
修改强>
Chrome似乎会在转储时过滤Array
对象的非数字属性,而Node会转储每个用户定义的属性。在我看来,Node的方式更好,因为在for in
语句中可以使用字母数字属性:
var a = [1];
a['abc'] = 2;
for (var i in a) {
console.log(i);
}
// Prints:
// 0
// abc
答案 1 :(得分:5)
答案是正确的,如果您尝试显示数组的 length ,行为可能更容易理解。
var ar = []
ar[0] = 42
console.log(ar.length) // 1
ar[12] = 21
console.log(ar.length) // 13
ar['ab'] = 1
console.log(ar.length) // 13 (separate property, not in array)
ar[ar.length] = 33
console.log(ar.length) // 14
ar.push(55)
console.log(ar.length) // 15
console.log(ar) // display all items specified above
//[ 42, , , , , , , , , , , , 21, 33, 55, ab: 1 ]
// which in fact really is:
// [ 42, , , , , , , , , , , , 21, 33, 55] as array and
// special property of array object - 'ab':1
答案 2 :(得分:3)
当您输入456
时,Chrome在控制台中未显示arr
,arr.abc
仍为456
。
除非您明确访问变量,否则它不会在控制台中显示它,或者console.log(arr)
,它们会记录:[123, abc: 456]
。
基本上,这只是一个美容问题。当您只在控制台中输入变量时,Node.js确实显示数组对象的键/值属性,而chrome仅显示“普通”数组条目,即使两个数组实际上具有相同的内容。