V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
imn1
V2EX  ›  JavaScript

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

  •  
  •   imn1 · 2015-12-30 13:14:53 +08:00 · 2386 次点击
    这是一个创建于 3252 天前的主题,其中的信息可能已经有所发展或是发生改变。
    昨天写个东西,遍历一个 list a=[xx, xxx, xxxx, ...]
    习惯了 python ,随手就写了 for (i in a)
    然后出错,检查 i 是序号,才想起和 python 不同

    这样写好像比 for (i =0;i<a.length;i++) 简单,因为优化往往还要把 a.length 先赋值
    不知道这样写有没有坑
    第 1 条附言  ·  2016-01-01 03:42:43 +08:00
    受教了
    10 条回复    2015-12-31 00:42:05 +08:00
    banricho
        1
    banricho  
       2015-12-30 13:18:38 +08:00   ❤️ 1
    要 var i ,否则 i 会变成全局变量
    EPr2hh6LADQWqRVH
        2
    EPr2hh6LADQWqRVH  
       2015-12-30 13:19:28 +08:00 via iPhone   ❤️ 1
    听说 V8 不能优化 in
    imn1
        3
    imn1  
    OP
       2015-12-30 13:25:35 +08:00
    @banricho
    这个是知道的

    @avastms
    哦,有这一说?
    dqh3000
        4
    dqh3000  
       2015-12-30 13:29:54 +08:00   ❤️ 1
    有一种观点认为先获取 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
        5
    serenader  
       2015-12-30 13:32:11 +08:00   ❤️ 1
    在 ES6 的话倒是可以用 let of:

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

    for of 跟 上面提到的 .forEach() 最大的区别是 for of 里面可以 break ,这个比较实用一些。
    SoloCompany
        8
    SoloCompany  
       2015-12-30 13:46:11 +08:00   ❤️ 1
    标准做法应该是 forEach + lambda (ECMA5 可直接忽略
    break 的话,古老的法器 prototype 是有支持的,不知道 ECMA6 是否有同样的异常类型
    asj
        9
    asj  
       2015-12-30 14:50:40 +08:00   ❤️ 1
    有坑,
    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
        10
    YuJianrong  
       2015-12-31 00:42:05 +08:00   ❤️ 1
    坑很多,这里全部说一下(包括上面的)
    1. 原型链上的 enumerable 的属性都会被遍历,虽然正常情况不会出问题不过如果谁在 Array.prototype 上放点东西那就可能会出问题了(上面 @banricho 提到)
    2. 只有被明确赋值(包括赋值为 undefined )的成员会被遍历,如果没赋值就不会遍历到(上面 @asj 提到)
    3. Array 的成员遍历顺序并非一定是増序的。由于标准并未规定 for in 遍历顺序,所以顺序是依赖实现的,不排除某些操作之后在某些浏览器上会发生非増序的遍历。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2975 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:39 · PVG 22:39 · LAX 06:39 · JFK 09:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.