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



我看到一些例子表明Firefox支持某种类似*something* if *expression*;的JavaScript语法。

作为我所说的一个例子,请参阅这篇MDN文章,其中包含以下示例:

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

然而,就像几乎所有Harmony"功能"一样,我不认为它是否真的会被包含在最终版本中有任何真正的概念。你可以在Firefox中使用它作为"JavaScript1.7"的一部分(一个模糊的

"标准">规范,实际上只适用于基于Mozilla的东西);然而,您最好避免FF特定的语法,尤其是当它会在其他浏览器中导致语法错误时。

你可以在谷歌上搜索"数组理解"来阅读更多关于它的信息,但正如我所提到的,由于它的Mozilla特性,它不是一个非常有用的工具。

使用ES5:中引入的reduce()阵列方法,您可以在没有更多代码的情况下实现类似的效果

//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,因此您需要一个填充程序来确保它在较旧的浏览器上正常工作。

这种类型的语句被称为列表理解。Python有一些语法非常相似的好例子。

最新更新