这样写好像更方便,但不知道是否用错了

2015-12-30 13:14:53 +08:00
 imn1
昨天写个东西,遍历一个 list a=[xx, xxx, xxxx, ...]
习惯了 python ,随手就写了 for (i in a)
然后出错,检查 i 是序号,才想起和 python 不同

这样写好像比 for (i =0;i<a.length;i++) 简单,因为优化往往还要把 a.length 先赋值
不知道这样写有没有坑
2315 次点击
所在节点    JavaScript
10 条回复
banricho
2015-12-30 13:18:38 +08:00
要 var i ,否则 i 会变成全局变量
EPr2hh6LADQWqRVH
2015-12-30 13:19:28 +08:00
听说 V8 不能优化 in
imn1
2015-12-30 13:25:35 +08:00
@banricho
这个是知道的

@avastms
哦,有这一说?
dqh3000
2015-12-30 13:29:54 +08:00
有一种观点认为先获取 len 比较快
var len = a.length;
for (var i = 0; i < len; i++)

~~~~~es6 应该考虑优先用 let 代替 var ,或者用 forEach+lambda

a.forEach(i => { console.log(i); /* i 不是序号 */ })
serenader
2015-12-30 13:32:11 +08:00
在 ES6 的话倒是可以用 let of:

```
let arr = [1,2,3,4,5];
for (let i of arr) {
console.log(i);
}
1
2
3
4
5
```
banricho
2015-12-30 13:32:26 +08:00
for ... in ... 遍历的是对象的属性,包括原型链上的属性
还有个区别就是 for ... in ... 中的索引 i 是一个 string
但是 for ... 中的计数 i 是一个 number
serenader
2015-12-30 13:36:04 +08:00
@serenader 说错了,应该是 for of 。。

for of 跟 上面提到的 .forEach() 最大的区别是 for of 里面可以 break ,这个比较实用一些。
SoloCompany
2015-12-30 13:46:11 +08:00
标准做法应该是 forEach + lambda (ECMA5 可直接忽略
break 的话,古老的法器 prototype 是有支持的,不知道 ECMA6 是否有同样的异常类型
asj
2015-12-30 14:50:40 +08:00
有坑,
var arr = [0];
arr[100] = 100;
两种循环的结果会有不同
for (var i =0;i<arr.length;i++) {
console.log(i);
}
//0, 99 次 undefine , 100

for (var i in arr) {
console.log(arr[i]);
}
//0, 100
YuJianrong
2015-12-31 00:42:05 +08:00
坑很多,这里全部说一下(包括上面的)
1. 原型链上的 enumerable 的属性都会被遍历,虽然正常情况不会出问题不过如果谁在 Array.prototype 上放点东西那就可能会出问题了(上面 @banricho 提到)
2. 只有被明确赋值(包括赋值为 undefined )的成员会被遍历,如果没赋值就不会遍历到(上面 @asj 提到)
3. Array 的成员遍历顺序并非一定是増序的。由于标准并未规定 for in 遍历顺序,所以顺序是依赖实现的,不排除某些操作之后在某些浏览器上会发生非増序的遍历。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/247165

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX