我被告知不要使用。。。在JavaScript中使用数组。为什么不呢?


当前回答

由于JavaScript元素保存为标准对象财产不建议使用for…遍历JavaScript数组。。。在里面循环,因为普通元素和所有可枚举的财产上市的

从…起https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Indexed_collections

其他回答

虽然这个问题没有特别提到,但我想补充一点,有一个很好的理由永远不要使用。。。在中使用NodeList(就像从querySelectorAll调用中获得的那样,因为它根本看不到返回的元素,而只在NodeListneneneba属性上迭代。

在单个结果的情况下,我得到:

var nodes = document.querySelectorAll(selector);
nodes
▶ NodeList [a._19eb]
for (node in nodes) {console.log(node)};
VM505:1 0
VM505:1 length
VM505:1 item
VM505:1 entries
VM505:1 forEach
VM505:1 keys
VM505:1 values

这解释了为什么我的for(节点中的节点)node.href=newLink;正在失败。

有三个原因你不应该使用。。在中迭代数组元素:

对于in将循环遍历数组对象的所有自己和继承的财产,这些属性不是DontEnum;这意味着,如果有人将财产添加到特定数组对象(这有合理的原因-我自己做过)或更改array.prototype(这在代码中被认为是错误的做法,应该与其他脚本一起工作),这些财产也会被迭代;通过检查hasOwnProperty()可以排除继承的财产,但这对数组对象本身中设置的财产没有帮助对于中不能保证保留元素顺序它的速度很慢,因为您必须遍历数组对象的所有财产及其整个原型链,并且仍然只能获取属性的名称,即要获取值,需要进行额外的查找

以下是这种做法(通常)不好的原因:

对于in循环迭代它们自己的所有可枚举财产及其原型的可枚举财产。通常在数组迭代中,我们只需要迭代数组本身。即使您自己可能没有向数组中添加任何内容,但您的库或框架可能会添加一些内容。

例子:

Array.prototype.hithere=“此处”;var数组=[1,2,3];for(let el in array){//hithere属性也将被迭代控制台日志(el);}

对于in循环不能保证特定的迭代顺序。尽管现在大多数现代浏览器中通常都能看到isorder,但仍然没有100%的保证。对于in循环忽略未定义的数组元素,即尚未分配的数组元素。

例子::

常量arr=[];arr[3]=“foo”;//将阵列大小调整为4arr[4]=未定义;//添加另一个未定义值的元素//遍历数组,for循环确实显示了未定义的元素for(设i=0;i<arr.length;i++){控制台日志(arr[i]);}console.log('\n');//for in忽略未定义的元素for(let el in arr){控制台日志(arr[el]);}

我认为我没有什么要补充的,比如Triptych的答案或CMS关于为什么使用for。。。在某些情况下应避免。

然而,我想补充一点,在现代浏览器中,有一种替代。。。在这种情况下。。。无法使用中的。另一种选择是。。。第页,共页:

for (var item of items) {
    console.log(item);
}

注:

遗憾的是,没有版本的Internet Explorer支持。。。(Edge 12+确实如此),因此您必须等待一段时间,直到可以在客户端生产代码中使用它。然而,在服务器端JS代码中使用它应该是安全的(如果您使用Node.JS)。

这不一定是坏的(根据您正在做的事情),但在数组的情况下,如果在Array.prototype中添加了一些东西,那么您将得到奇怪的结果。您希望此循环运行三次:

var arr = ['a','b','c'];
for (var key in arr) { ... }

如果一个名为helpfulUtilityMethod的函数被添加到Array的原型中,那么循环将运行四次:键将是0、1、2和helpfulUtilityMethod。如果你只需要整数,噢。