Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js数组实际上是hashmaps吗?_Javascript_Arrays_Node.js_Hashmap_V8 - Fatal编程技术网

Javascript node.js数组实际上是hashmaps吗?

Javascript node.js数组实际上是hashmaps吗?,javascript,arrays,node.js,hashmap,v8,Javascript,Arrays,Node.js,Hashmap,V8,令我惊讶的是,这段代码实际上在node.js中工作: var arr = new Array(); // also works: var arr = []; arr[0] = 123; arr['abc'] = 456; arr; // node.js: [ 123, abc: 456 ], chrome: [123] 我一直认为数组按顺序存储对象,只能用一个整数键访问,就像一个STD::C++中的向量。然而,在这里,它的行为就像一个地图或一个对象。更令人困惑的是,同样的代码在chrome中也

令我惊讶的是,这段代码实际上在node.js中工作:

var arr = new Array();
// also works: var arr = [];
arr[0] = 123;
arr['abc'] = 456;
arr; // node.js: [ 123, abc: 456 ], chrome: [123]

<>我一直认为数组按顺序存储对象,只能用一个整数键访问,就像一个STD::C++中的向量。然而,在这里,它的行为就像一个地图或一个对象。更令人困惑的是,同样的代码在chrome中也能正常工作,返回一个带有单个条目123的数组。我认为node.js和chrome javascript使用相同的内部引擎V8。这是怎么回事?

Javascript允许您动态扩展对象,而作为
数组,您可以这样做

您要做的是向数组中添加一个名为
abc
的新属性,并为其赋值
456

因此,可以说Javascript中的每个对象都可以作为hashmap使用

编辑

Chrome似乎在转储时过滤
数组
对象的非数字属性,而节点转储每个用户定义的属性。在我看来,Node的方式更好,因为字母数字属性在
for In
语句中可用:

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

当您只需输入
arr
时,chrome不会在控制台中显示
456
arr.abc
仍将显示
456

除非您显式访问变量或
console.log(arr)
,否则它不会显示在控制台中,该变量记录为:
[123,abc:456]


基本上,这只是一个表面问题。Node.js只在控制台中输入变量时,会显示数组对象的键/值属性,而chrome只显示“普通”数组条目,即使两个数组实际上具有相同的内容。

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

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

不,它们实际上是javascript数组,具有“对象”类型!虽然chrome不会在控制台中显示
456
arr.abc
仍将显示
456
。除非您显式访问变量,或者
console.log(arr)
,它记录:
[123,abc:456]
,否则它不会显示在控制台中。基本上,这只是一个表面问题。如果它将它存储在
abc
下,那就不是真正的哈希映射。只是一个键/值数组。是的,每个对象都可以用作hashmap,但这不是问题所在。这只是变量显示的不一致。这也是我恢复编辑的原因:这个“问题”实际上是特定于节点的。js@Cerbrus在我看来,问题的关键不在于它是否通过
console.log()
显示,但是数组/对象的行为在Javascript中是哈希映射。你仍然没有解决这样一个事实,即node和chrome的行为似乎不同,而事实上,对象包含相同的键/值对。因此,介意删除对我答案的否决票吗?现在你将我的答案添加到你的答案中了吗?@Joel:这回答了你的问题吗,还是有些事情还不清楚?