【问题标题】:is it possible to refer to anonymous array in a for loop?是否可以在 for 循环中引用匿名数组?
【发布时间】:2012-01-31 10:46:47
【问题描述】:
for (var name in ['dog','cat','cow']) {
  alert(name);
}

这里的name是返回数组的索引,但是因为是匿名的所以不能引用。

我知道我可以在循环之外声明它,但在这里我问是否有一种方法可以直接引用没有索引的名称。

【问题讨论】:

  • 如果你可以引用数组,那么它就不再是匿名的了……
  • 一些脚本语言提供了一个神奇的变量(perl 有 $_),它可以访问其他匿名成员;我想这就是 rsk82 可能一直在想的。

标签: javascript arrays loops


【解决方案1】:

如果数组是匿名的,则不能使用 for in 循环引用其元素。

【讨论】:

    【解决方案2】:

    ...不。没有,至少没有本机循环。不过有 ES5 的forEach:

    ['dog', 'cat', 'cow'].forEach(function(value, key) {
      // do stuff
    });
    

    实际上是一样的。它受支持 mostly everywhere,但在旧 IE 中除外:例如 es5-shim 之类的东西即使在如此旧的浏览器中也能启用 ES5 方法。

    【讨论】:

    • 截至 2015 年,Firefox、Chrome 和 Webkit 浏览器支持此方法。我不了解 IE,因为我没有要测试的 Windows。
    • IE 从 IE9 开始支持它,所以这基本上是大多数人想要支持的所有版本。 caniuse.com/#feat=es5
    【解决方案3】:

    您为此使用了错误的语法构造。

    for in 用于枚举对象的属性,而不是用于迭代数组。在外面声明你的数组并使用常规循环。

    var arr = ['dog', 'cat', 'cow'];
    for(var i = 0; i < arr.length; i++) {
      // your code
    }
    

    【讨论】:

      【解决方案4】:

      如果您知道数组的键将是整数,则无需使用 for..in 构造。

      for (var arr = ['dog','cat','cow'], name = 0; name < arr.length; name++ ) {
        console.log(arr[ name ]);
      }
      

      在上面的代码中,一个更简单的for 循环允许创建一个新对象并在循环内按键引用。

      【讨论】:

      • arr++,真的吗?此外,使用name 作为数组索引 - bad 选择,恕我直言。
      • arr 错误在您发布之前已修复。名称 var 是基于他现有的代码。变量名称name不是保留关键字,尽管它在一些非标准实现中使用(Function.name)。你应该降低竞争力。乐于助人胜过快速或优雅。
      • 我的意思是,当我看到name 时,我希望它是一个字符串,而不是一个整数。
      • 当这个答案被接受时,请注意 arr 变量将在循环外的任何地方可见。另外,最好缓存数组长度,在递增循环期间不能更改。
      • @katspaugh 好点。缓存数组长度的另一个原因是它是为每次迭代计算的。 for(var arr=[], name=0, len = arr.length; name&lt;len; name++) { }
      【解决方案5】:

      不,你不能这样做。它只会显示索引。此外,JavaScript 中的 for in loop for array 是一种不好的做法。它会循环遍历所有的数组对象方法。

      【讨论】:

        【解决方案6】:

        您有多种选择。

        如果你使用 jQuery,你可以这样做:

        $.each(['dog','cat','cow'], function() {
            var name = this;
            alert(this);
        });
        

        如果你不使用 jQuery,你可以创建自己的函数

        function each(array, pFunction) {
            for(var i = 0; i < array.length; i++) {
                var element = array[i];
                pFunction(element);
            }
        }
        
        each(['dog','cat','cow'], function(name) {
            alert(name);
        });
        

        如果你不想创建一个函数,你总是可以做一些疯狂的事情:(不推荐)

        for (var name in { 'dog' : '','cat' : null,'cow' : null }) {
            alert(name);
        }
        

        【讨论】:

        • 可能值得指出的是,最后一个选项不再是一个数组,而是一个 JSON 格式的哈希,您在其中迭代键。聪明,虽然乍一看不一定很明显(正如你所说,不推荐;^D)。
        【解决方案7】:

        数组方法forEachmapfilter 等将遍历文字数组的索引:

        ['dog', 'cat', 'cow'].forEach(alert);
        

        适用于旧版浏览器的 Shim:

        if(![].forEach){
            array.prototype.forEach= function(fun, scope){
                var T= this, L= T.length, i= 0;
                if(typeof fun== 'function'){
                    while(i< L){
                        if(i in T){
                            fun.call(scope, T[i], i, T);
                        }
                        ++i;
                    }
                }
                return T;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-06
          • 2012-12-08
          • 2019-03-15
          • 2020-09-21
          • 2013-06-21
          • 2017-12-26
          • 2011-03-18
          相关资源
          最近更新 更多