node.js 数组实际上是哈希图吗?

Posted

技术标签:

【中文标题】node.js 数组实际上是哈希图吗?【英文标题】:Are node.js arrays actually hashmaps? 【发布时间】:2014-06-29 21:05:43 【问题描述】:

令我惊讶的是,这段代码实际上在 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 数组,类型为“对象”! 虽然 chrome 不会在控制台中显示 456,但 arr.abc 仍将是 456。除非您显式访问变量或console.log(arr),否则它不会在控制台中显示它,它会记录:[123, abc: 456] 基本上,这只是一个外观问题。 如果将其存储在abc 下,那并不是真正的哈希映射。只是一个键/值数组。 【参考方案1】:

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

【讨论】:

是的,每个对象都可以用作 hashmap,但这不是问题。这只是变量显示的不一致。这也是我恢复编辑的原因:这个“问题”实际上特定于 node.js @Cerbrus 在我看来,问题的关键不是console.log() 如何显示它,而是数组/对象作为 Javascript 中的哈希图的行为。 您仍然没有解决 node 与 chrome 中的行为似乎不同的事实,而实际上对象包含相同的键/值对。 那么,既然你添加了我对你的回答,介意删除我的回答吗?【参考方案2】:

虽然当您输入 arr 时,chrome 不会在控制台中显示 456,但 arr.abc 仍将是 456

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

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

【讨论】:

@Joel:这是否回答了你的问题,还是还有什么不清楚的地方?【参考方案3】:

答案是正确的,如果您尝试显示数组的 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

【讨论】:

以上是关于node.js 数组实际上是哈希图吗?的主要内容,如果未能解决你的问题,请参考以下文章

关于 JSON 的哈希到底是啥?

将哈希图转换为数组[重复]

带你从零学Node.js

node.js 1

Node.js Buffer(缓冲区)

nvm npm node.js的关系