javascript中类似数组的对象

Mat*_*hew 7 javascript google-closure-library

通过Closure库查看dom.js源代码,我发现了这个(in goog.dom.getElementsByTagNameAndClass_):

if (opt_class) {
var arrayLike = {};
var len = 0;
for (var i = 0, el; el = els[i]; i++) {
  var className = el.className;
  // Check if className has a split function since SVG className does not.
  if (typeof className.split == 'function' &&
      goog.array.contains(className.split(' '), opt_class)) {
    arrayLike[len++] = el;
  }
}
arrayLike.length = len;
return arrayLike;
}
Run Code Online (Sandbox Code Playgroud)

在常规阵列上执行此操作会有什么好处?

Zor*_*art 3

代码的作者使用空 JavaScript 对象作为类数组对象的基础,即可以通过索引访问并具有 length 属性的对象。

我能想到的原因可能有两个:

  1. 内存使用 - 如果数组由分配 n 个元素的实现支持,当它达到其限制时,它会按某个因素增长以增加其容量,从而浪费capacity - length内存
  2. cpu 时间 - 实现者选择插入速度而不是随机访问速度 - 该方法的返回更有可能按顺序迭代而不是随机访问,并且在插入中调整数组大小会导致分配-复制-释放,这会产生 cpu 损失

我敢打赌,类似的代码也会在其他 JavaScript 库中找到,并且这是基准测试和寻找跨不同浏览器的最佳解决方案的结果。

贾斯汀评论后编辑

进一步谷歌搜索后发现,类似数组的对象在 JavaScript 开发人员中很常见:查看 JavaScript:David Flanagan 的权威指南,它有一整章关于类似数组的对象这些 也提到了他们。

没有提及为什么人们应该更喜欢类似数组而不是数组对象。这可能是一个很好的问题。

因此第三个选项可能是关键:遵守 JavaScript API 的规范。