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 数组实际上是哈希图吗?的主要内容,如果未能解决你的问题,请参考以下文章