* something * if * expression * JavaScript in JavaScript(FF)

我看到一些例子表明,Firefox支持某种 JavaScript语法,如* * * * * * * * *.

作为我正在谈论的例子,请参阅this MDN article,其中包含以下示例:

var evens = [i for each (i in range(0,21)) if (i % 2 == 0)];

我的问题是:

用什么名字来描述这种语法?我主要想知道这一点,所以我可以把谷歌和更多的阅读.我已经尝试了谷歌最好的我可以想出来,但没有能够把正确的术语在一起,以获得有用的结果.

这个语法是否存在于数组解析之外的其他地方?我觉得我已经看到在数组之外使用的其他例子(例如上面的例子),但我不确定.

在哪里可以阅读有关此语法的更多信息?

除Firefox之外,其他任何浏览器都支持这种浏览器?

这是ES5中的这个功能还是计划用于ES和谐?

解决方法

正如其他人所说,这被称为“阵列理解”,它是为ECMAScript Harmony建议的许多功能之一:

http://wiki.ecmascript.org/doku.php?id=harmony:array_comprehensions

然而,正如几乎每一个和谐的“功能”,我不认为有没有真正的概念是否将真正包括在最终版本.您可以在Firefox中使用它作为“JavaScript 1.7”的一部分(真正仅适用于基于Mozilla的东西的模糊的“标准”规范);但是,您最好避免使用特定于FF的语法,特别是在其他浏览器中会导致语法错误.

您可以通过Google搜索“Array Comprehensions”来阅读更多信息,但正如我所提到的,由于它具有Mozilla特有的性质,因此它不是一个非常有用的工具.

您可以使用ES5中引入的reduce()Array方法实现类似的效果,而不需要更多的代码

//JavaScript has no "range" function,so let's make one
var range = function (begin,length) { 
    var i,ret = [];
    for (i = begin; i < begin + length; i++) {
        ret.push(i);
    }
    return ret;
};

var evens = range(0,21).reduce(function (arr,cur) { 
    if (cur % 2 === 0) arr.push(cur);
    return arr; 
},[]);

与您正在寻找的内容相比,这可能有点冗长(甚至记住我们必须创建一个range()函数).但它是一个相对紧凑的解决方案,不需要大量的“设置”,主要解决问题:从一个数组过滤元素以形成第二个数组.

我能够把它减少到一个单行,但是变得有点不健康,所以我决定建议两行版本.如果你对一线感兴趣,这里是:

//Don't forget to define "range()"
var evens = range(0,cur) { 
    return (cur % 2 === 0) ? (arr.push(cur) && arr) : arr; 
},[]);

再次,这是ES5代码.如果您希望它在旧版浏览器中工作,那么您需要提供一个垫片来为Array.reduce()提供支持. MDN有一个

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/Reduce

更新:

看起来我应该使用filter()而不是reduce().使代码更清洁.感谢OP建议!

var evens = range(0,21).filter(function (cur) { return cur % 2 === 0; });

再次,filter()是ES5,所以你需要一个垫片,以确保它在旧的浏览器上正常工作.

相关文章

什么是深拷贝与浅拷贝?深拷贝与浅拷贝是js中处理对象或数据...
前言 今天复习了一些前端算法题,写到一两道比较有意思的题:...
最近在看回JavaScript的面试题,this 指向问题是入坑前端必须...
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面