【问题标题】:*something* if *expression* syntax in JavaScript (FF)*something* if *expression* JavaScript (FF) 中的语法
【发布时间】:2012-09-23 23:31:44
【问题描述】:

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

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

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

我的问题是:

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

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

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

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

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

【问题讨论】:

  • “用什么名字来描述这种语法?” - 你链接到的文章称它为“数组理解”。
  • 我可能错了,但我认为该术语指的是数组部分中的for each。我想我已经看到在数组之外使用了这种不同的 if 语法,但我不确定。 ?
  • 数组解析不仅更加紧凑,而且实际上更易于阅读,一旦您熟悉了这个概念我'一旦我确定每个人都知道语法,我才敢使用它。维护者是一个暴力精神病患者和所有......
  • “我认为如果在数组之外使用语法,我已经看到了这种不同” - 在这种情况下,if 仍然是数组理解的一部分。通常if 在关闭) 之后会有一个语句或{ } 块 - 事实上它在数组理解中没有你所说的“不同的 if 语法”是什么意思?

标签: javascript ecmascript-harmony


【解决方案1】:

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

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

但是,与几乎所有 Harmony“功能”一样,我认为它是否会真正包含在最终版本中并没有任何实际的概念。您可以在 Firefox 中将它用作“JavaScript 1.7”的一部分(一个模糊的 “标准” 规范,really 仅适用于基于 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, 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 以确保它在旧版浏览器上正常运行。

【讨论】:

  • +1 ,但“JavaScript 1.7”不是任何标准。 JavaScript 是 Mozilla 专有的 ECMAScript 实现,用于浏览器。甚至没有它的规范,唯一接近的文档是 on–line Reference,它作为社区 wiki 维护。
  • +1,感谢您提供的所有信息!对于 ES5 变体,我会使用 filter 而不是 reduce。但是如果我正在做一个我只适合 FF 的项目,我也可以使用 JS1.7 功能。
  • @NathanWall 我得去看看filter()。我还在学习所有 ES5 的东西。 ;-)。感谢您的反馈!
【解决方案2】:

这种类型的语句称为list comprehensionPython 有很好的例子,语法非常相似。

【讨论】:

    猜你喜欢
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2021-01-25
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 2021-04-29
    相关资源
    最近更新 更多