gpt4 book ai didi

Javascript:(ES5)数组迭代权威指南

转载 作者:行者123 更新时间:2023-11-29 22:07:57 25 4
gpt4 key购买 nike

关于如何在 Javascript 中“正确”迭代数组存在很多困惑。至少有两个帖子有几百个赞,但答案非常矛盾。我很困惑。

ES5 添加了 Array.prototype.forEach 函数。这是最终答案还是仍然存在需要避免介入的陷阱?

如果有的话,请发布真正的一次迭代。我可以使用 ES5 如果您不知道自己在说什么,请不要发帖。

最佳答案

简单的回答:如果你想避免不愉快的意外,没有办法绕过理解 Javascript 的对象模型,包括原型(prototype)继承。 Javascript 数组基本上是具有一些附加属性的对象,它们非常不同于任何其他流行语言中的数组。

Array.prototype.forEach还有jquery.each有一个比干净的更大的陷阱 for (var k in a)通常不建议这样做。我没有在任何其他帖子中看到这个陷阱。

看:

Array.prototype[2] = 'hi';

var a = [];
a.forEach(alert); // nothing
alert(a); // ''

a[3] = 3;
a.forEach(alert); // 'hi', then '3'
alert(a); // ',,hi,1'

这里发生了什么?查看spec-compliant algorithm on MDN (在“兼容性”下)实现 Array.prototype.forEach .

a.forEach(myCallback)或多或少等同于常见的

for (var p = 0, len = a.length; p < len; p++) {
if (p in a)
myCallback(a[p], p, a);
}

这意味着它也会循环遍历原型(prototype)链中的属性!但只是以一种不太可靠的方式,因为它只循环满足 p < len 的属性。 .

100% 可靠的方法:

以下版本仅迭代可枚举属性。 Object.getOwnPropertyNames可以使用函数代替 Object.keys包括不可枚举的属性。

数字、自有、顺序

a.forEach(function(v, k, a) {
if (a.hasOwnProperty[k])
myCallback(v, k, a);
});

自己的,顺序的

Object.keys(a).sort(mySortFunc).forEach(function(k) {
myCallback(a[k], k, a);
});

数字,顺序

alert("Don't do it");

拥有

Object.keys(a).forEach(function(k) {
myCallback(a[k], k, a);
});

(无限制)

for (var k in a) {
myCallback(a[k], k, a);
}

我认为最后一个不是一个糟糕的选择。这是一种非常诚实和简洁的迭代方式。作为旁注,顺序数值迭代已被证明在大多数实现中具有性能优势,至少对于非稀疏数组而言;但也许这不是规范的错。

关于Javascript:(ES5)数组迭代权威指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19843420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com