【问题标题】:Are JavaScript/ECMAScript arrays "sparse" in Node.js?Node.js 中的 JavaScript/ECMAScript 数组是否“稀疏”?
【发布时间】:2012-05-02 13:22:03
【问题描述】:

我的问题与Are Javascript arrays sparse? 相同,但有一点不同...

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

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

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

【问题讨论】:

  • 控制台不是语言的一部分。控制台决定表示某事物的方式不会影响该事物的实际含义。
  • @amnotiam,我意识到,这就是为什么我的问题是我看到的控制台输出是由于控制台的格式,还是对象的实际存储方式。丹尼斯已经回答了这个问题。

标签: javascript arrays node.js sparse-array


【解决方案1】:

你看到的不是一个实际的数组,只是一个表示。控制台检查是否存在 lengthsplice 属性并打印对象的数字属性,这就是为什么 jQuery 集合在记录时看起来是数组的原因。

function RandomThingThatIsDefinitelyNotAnArray() {
    this.splice = function() {};
    this.length = 10;
    this[5] = 5;
}

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

jsfFiddle 进行现场演示。

【讨论】:

  • +1 我想了解更多。您对为什么它返回类似数组的结构而不是对象有任何参考吗?是 lengthsplice 创建类似数组的类数组结构所需的唯一东西吗?
  • 内部结构确实没有什么不同,只是控制台显示的不同而已。 Search for isArray 就控制台而言,查看 Array-like 的资格。那是 Firebug 代码,但据我所知 Chrome 使用相同的标准。
【解决方案2】:

Node 的 util.inspect 函数专门检查稀疏数组以像这样打印它们。事实上,它有a test that specifically checks for it。我知道这一点是因为我对节点检查器的完全重写最终没有进入核心,并导致我的UltraREPL

【讨论】:

  • 不错的工具!我肯定会下载它。并且,感谢您的回答和对单元测试的参考。
猜你喜欢
  • 2010-12-03
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
  • 1970-01-01
  • 2021-06-08
  • 2010-12-01
相关资源
最近更新 更多