JavaScript/ECMAScript 数组在 Node.js 中是否是“稀疏”的?

4

我的问题与Are Javascript arrays sparse?相同,但有一个区别...

在Node.js(和/或V8)中实现的JavaScript数组是否稀疏?我原以为是这样,但后来我进行了以下测试:

var testArray = [];
testArray[10000] = 'test';
console.log(testArray);

返回的是10,000个空元素,在末尾有'test'。这是由于调试输出的工作方式导致的,还是Node.js在添加新元素时实际分配了未定义数组元素的内存?

1
控制台不是语言的一部分。控制台如何表示某个东西对该东西实际上是什么没有影响。 - user1106925
@amnotiam,我意识到这一点,所以我的问题是我看到的控制台输出是由于控制台的格式还是对象实际存储方式造成的。Dennis已经回答了这个问题。 - Brad
2个回答

5
您看到的不是实际的数组,而只是一种表示方式。控制台检查对象是否存在 lengthsplice 属性,并打印数字属性,所以当记录 jQuery 集合时,它们看起来像是数组。
function RandomThingThatIsDefinitelyNotAnArray() {
    this.splice = function() {};
    this.length = 10;
    this[5] = 5;
}

console.log(new RandomThingThatIsDefinitelyNotAnArray());​
// shows [undefined, undefined, undefined, undefined, undefined, 5]

点击此处查看现场演示。


+1 我想了解更多。你有什么参考资料可以说明为什么它返回一个类似数组的结构而不是对象吗?lengthsplice是创建类似数组结构所需的唯一元素吗? - Joseph
1
结构在内部实际上并没有什么不同,控制台只是以不同的方式显示它。搜索isArray(http://fbug.googlecode.com/svn/lite/branches/firebug1.4/build/firebug-lite-debug.js)以查看控制台所关注的类似数组的资格。那是Firebug代码,但据我所知,Chrome使用相同的标准。 - Dennis

2
Node.js中的util.inspect函数专门检查稀疏数组并以这种方式打印它们。实际上,它有一个特定的测试检查这个。我知道这是因为我全面重写了Node.js的检查器,但最终没有被纳入核心,并且导致了我的UltraREPL

不错的工具!我一定会下载它。还有,谢谢你的答案和参考单元测试。 - Brad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接