Nat*_*all 10 javascript ecmascript-harmony
我已经看到一些示例表明Firefox支持某种JavaScript语法*something* if *expression*;.
作为我正在谈论的一个例子,请参阅此MDN文章,其中包含以下示例:
var evens = [i for each (i in range(0, 21)) if (i % 2 == 0)];
Run Code Online (Sandbox Code Playgroud)
我的问题是:
用什么名字来描述这种语法?我主要想知道这一点,以便我可以谷歌它并阅读更多相关信息.我已经尝试了谷歌搜索我能想到的最好的,但未能将正确的术语放在一起以获得有用的结果.
这种语法可以存在于数组理解之外的其他地方吗?我觉得我已经看到过在数组之外使用的其他示例(例如上面的例子中),但我不确定.
在哪里可以阅读有关此语法的更多信息?
除了Firefox之外,还有其他浏览器支持吗
这个功能是ES5还是ES-harmony的计划?
正如其他人所指出的,这称为“数组推导式”,它是为 ECMAScript Harmony 建议的众多功能之一:
http://wiki.ecmascript.org/doku.php?id=harmony:array_com经理
然而,与几乎所有 Harmony“功能”一样,我认为对于它是否会真正包含在最终版本中没有任何真正的概念。您可以在 Firefox 中将其用作“JavaScript 1.7”(一个模糊的“标准”规范真的仅适用于基于 Mozilla 的内容);但是,您最好避免使用 FF 特定的语法,特别是当它会在其他浏览器中导致语法错误时。
您可以通过 Google 搜索“数组推导式”来了解更多相关信息,但正如我所提到的,由于它是 Mozilla 特定的性质,因此它不是一个非常有用的工具。
reduce()使用ES5 中引入的 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;
}, []);
Run Code Online (Sandbox Code Playgroud)
与您正在寻找的内容相比,这可能有点冗长(即使记住我们必须创建一个range()函数)。但这是一个相对紧凑的解决方案,不需要大量的“设置”,并且主要致力于解决问题:过滤一个数组中的元素以形成第二个数组。
我能够将其减少为单行,但维护起来有点不方便,所以我决定建议使用两行版本。如果你对单行感兴趣,这里是:
//Don't forget to define "range()"
var evens = range(0, 21).reduce(function (arr, cur) {
return (cur % 2 === 0) ? (arr.push(cur) && arr) : arr;
}, []);
Run Code Online (Sandbox Code Playgroud)
再次强调,这是 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; });
Run Code Online (Sandbox Code Playgroud)
同样,filter()是 ES5,因此您需要一个填充程序以确保它能够在旧浏览器上正常运行。