我被告知不要使用。。。在JavaScript中使用数组。为什么不呢?
当前回答
因为它通过对象字段而不是索引枚举。你可以用索引“length”获得值,我怀疑你是否想要这个。
其他回答
简短的回答:这不值得。
更长的答案:即使不需要顺序元素顺序和最佳性能,这也不值得。
长篇大论:这不值得。。。
使用for(数组中的var属性)将导致数组作为对象迭代,遍历对象原型链,最终执行速度比基于索引的for循环慢。for(…in…)不能保证按顺序返回对象财产,这可能是意料之中的。使用hasOwnProperty()和!用于筛选对象财产的isNaN()检查是一项额外的开销,导致它的执行速度更慢,并否定了首先使用它的主要原因,即因为它的格式更简洁。
出于这些原因,甚至不存在性能和便利性之间可接受的权衡。除非目的是将数组作为对象处理,并对数组的对象财产执行操作,否则实际上没有任何好处。
主要有两个原因:
One
就像其他人所说的那样,您可能会得到不在数组中或从原型继承的密钥。因此,假设库向Array或Object原型添加了一个属性:
Array.prototype.someProperty = true
您可以将其作为每个阵列的一部分:
for(var item in [1,2,3]){
console.log(item) // will log 1,2,3 but also "someProperty"
}
可以使用hasOwnProperty方法解决此问题:
var ary = [1,2,3];
for(var item in ary){
if(ary.hasOwnProperty(item)){
console.log(item) // will log only 1,2,3
}
}
但这对于使用for in循环迭代任何对象都是正确的。
Two
通常,数组中项目的顺序很重要,但for in循环不一定以正确的顺序迭代,这是因为它将数组视为对象,这是在JS中实现的方式,而不是数组。这看起来是一件小事,但它确实会破坏应用程序,而且很难调试。
因为如果你不小心的话,它会迭代属于原型链上对象的财产。
您可以使用。。在中,只需确保使用hasOwnProperty检查每个属性。
我认为我没有什么要补充的,比如Triptych的答案或CMS关于为什么使用for。。。在某些情况下应避免。
然而,我想补充一点,在现代浏览器中,有一种替代。。。在这种情况下。。。无法使用中的。另一种选择是。。。第页,共页:
for (var item of items) {
console.log(item);
}
注:
遗憾的是,没有版本的Internet Explorer支持。。。(Edge 12+确实如此),因此您必须等待一段时间,直到可以在客户端生产代码中使用它。然而,在服务器端JS代码中使用它应该是安全的(如果您使用Node.JS)。
您应该只在属性列表上使用for(var x in y),而不是在对象上(如上所述)。
推荐文章
- 使用jQuery以像素为整数填充或边距值
- 检查是否选择了jQuery选项,如果没有选择默认值
- Next.js React应用中没有定义Window
- 如何重置笑话模拟函数调用计数之前,每次测试
- 如何强制一个功能React组件渲染?
- Java 8流和数组操作
- 在javascript中从平面数组构建树数组
- 将Dropzone.js与其他字段集成到现有的HTML表单中
- 如何在AngularJS中观察路由变化?
- JavaScript DOM删除元素
- 将dd-mm-yyyy字符串转换为日期
- Javascript复选框onChange
- Javascript函数前导bang !语法
- 如何在页面上遍历所有DOM元素?
- 在JS/jQuery中触发按键/按键/按键事件?