我看过一些示例,表明Firefox支持*something* if *expression*;
行的某种JavaScript语法。
作为我所谈论的一个例子,请参阅this MDN article,其中包含以下示例:
var evens = [i for each (i in range(0, 21)) if (i % 2 == 0)];
我的问题是:
用什么名称来描述这种语法?我主要想知道这一点,以便我可以谷歌并阅读更多相关内容。我已经尝试了谷歌搜索我能想到的最好的,但未能将正确的术语放在一起以获得有用的结果。
这种语法可以存在于数组理解之外的其他地方吗?我觉得我已经看到过在数组之外使用的其他例子(例如上面的例子中),但我我不确定。
我在哪里可以阅读有关此语法的更多信息?
除了Firefox之外,其他任何浏览器都支持此功能吗?
这是ES5中的功能还是计划用于ES-harmony?
答案 0 :(得分:4)
正如其他人所说,这被称为“数组理解”,它是为ECMAScript Harmony建议的众多功能之一:
http://wiki.ecmascript.org/doku.php?id=harmony:array_comprehensions
然而,正如几乎所有和谐“功能”一样,我认为没有任何真正的概念,它是否真的会包含在最终版本中。你可以在Firefox中使用它作为“JavaScript 1.7”的一部分(一个模糊的“标准”规范,真的仅适用于基于Mozilla的东西);但是,最好避免使用特定于FF的语法,特别是当它会在其他浏览器中导致语法错误时。
您可以通过Google搜索“数组理解”来了解更多信息,但正如我所提到的,由于它具有特定于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, 21).reduce(function (arr, 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,所以你需要一个垫片以确保它能在旧浏览器上正常运行。
答案 1 :(得分:2)
此类声明称为list comprehension。 Python有很好的例子,语法非常相似。