node.js数组实际上hashmaps?

令我惊讶的是,这段代码实际上在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。 这里发生了什么?

Javascript允许您随时扩展对象,而Array则是您可以这样做的一个对象。

你正在做的是在你的数组中添加一个名为abc的新属性,并赋值456

所以你可以说Javascript中的每个对象都可以用作hashmap。

编辑

看起来Chrome在转储时过滤了Array对象的非数字属性,而Node则转储了每个用户定义的属性。 在我看来,Node的方式更好,因为在for in语句中可以使用字母数字属性:

 var a = [1]; a['abc'] = 2; for (var i in a) { console.log(i); } // Prints: // 0 // abc 

答案是正确的,如果您尝试显示数组的长度 ,行为可能更容易理解。

 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 

虽然chrome在控制台中不显示456 ,但是只需inputarrarr.abc仍然是456

它只是不显示在控制台,除非你明确地访问variables,或console.log(arr) ,它logging: [123, abc: 456]

基本上,这只是一个整容问题。 当你在控制台中inputvariables时,Node.js确实显示了数组对象的键/值属性,而chrome只显示“正常”数组条目,即使两个数组实际上具有相同的内容。