gpt4 book ai didi

javascript - *something* if *expression* JavaScript 中的语法 (FF)

转载 作者:可可西里 更新时间:2023-11-01 02:44:04 24 4
gpt4 key购买 nike

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

作为我所说内容的示例,请参阅 this MDN article ,其中包含以下示例:

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

我的问题是:

用什么名字来描述这种语法?我主要想知道这个,以便我可以谷歌它并阅读更多相关信息。我已尽我所能尝试谷歌搜索,但无法将正确的术语组合在一起以获得有用的结果。

这种语法可以存在于数组理解之外的其他地方吗?我觉得我已经看到了这种在数组之外使用的其他例子(比如上面的例子),但我我不确定。

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

除了 Firefox 之外,还有其他浏览器支持吗?

此功能是在 ES5 中还是计划用于 ES-harmony?

最佳答案

正如其他人所指出的,这称为“数组理解”,它是为 ECMAScript Harmony 建议的众多功能之一:

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

但是,对于 Harmony 的几乎所有“功能”,我认为对于它是否会真正包含在最终版本中没有任何真正的概念。您可以在 Firefox 中使用它作为“JavaScript 1.7”的一部分(一个模糊的“标准”规范,真正仅适用于基于 Mozilla 的东西);但是,您最好避免使用特定于 FF 的语法,尤其是当它会在其他浏览器中导致语法错误时。

您可以通过在 Google 上搜索“Array Comprehensions”来阅读更多相关信息,但正如我所提到的,由于它是 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 代码。如果您希望它在旧版浏览器中工作,您需要提供一个 shim 来提供对 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,因此您需要一个 shim 以确保它能在旧版浏览器上正常运行。

关于javascript - *something* if *expression* JavaScript 中的语法 (FF),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12557180/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com