【问题标题】:Using indexOf in CoffeeScript在 CoffeeScript 中使用 indexOf
【发布时间】:2012-06-23 19:42:40
【问题描述】:

我在 CoffeeScript 中使用以下代码:

if elem in my_array
  do_something()

编译成这个javascript:

if (__indexOf.call(my_array, elem) < 0) {
  my_array.push(elem);
}

我可以看到它正在使用在脚本顶部定义的函数 __indexOf。

我的问题是关于这个用例:我想从数组中删除一个元素,并且我想支持 IE8。在array 对象上支持indexOf 的浏览器中,我可以使用indexOfsplice 轻松做到这一点。但是,在 IE8 中这不起作用:

if (attr_index = my_array.indexOf(elem)) > -1
  my_array.splice(attr_index, 1)

我尝试使用 CoffeScript 定义的 __indexOf 函数,但在编译器中出现保留字错误。

if (attr_index = __indexOf.call(my_array, elem) > -1
  my_array.splice(attr_index, 1)

那么我该如何使用 CoffeScript 或者是否有更不显眼的方法来调用 indexOf? 两次定义同一个函数似乎很奇怪,只是因为 CoffeeScript 不允许我使用他们的...

【问题讨论】:

标签: javascript arrays internet-explorer-8 coffeescript


【解决方案1】:

CoffeeScript 将以下内容添加到文件范围的顶部:

var __indexOf = [].indexOf || function(item) {
  for (var i = 0, l = this.length; i < l; i++) {
    if (i in this && this[i] === item) return i;
  }
  return -1;
};

如果我们试图通过这样做来利用它:

indexOf = __indexOf

这会产生编译器错误:RESERVED WORD "__INDEXOF"

解决办法是用反引号颠覆编译器:

indexOf = `__indexOf`

然后使用它

indexOf.call([1,2,3,4], 3) //2

或者我们可以从@Trevor Burnham 的回答中减少重复代码:

Array::indexOf or= `__indexOf`

但是,您需要确保 CoffeeScript 将通过将 in 运算符用作布尔表达式(并在右侧使用动态长度数组)来添加此定义。归根结底,对于某些人来说,重新定义它可能会更容易:)

【讨论】:

  • 虽然这个答案是正确的,但建议一般情况下它不是。这个转瞬即逝的世界转瞬即逝。知道这个实现细节将出现在我们不知道的下一版 CoffeeScript 中。
  • 很有趣,说话就像 yoda 一样 :)
【解决方案2】:

不,CoffeeScript 会阻止您直接使用它的助手,因为这会破坏语言和实现之间的区别。为了支持 IE8,我会添加一个像

这样的垫片
Array::indexOf or= (item) ->
  for x, i in this
    return i if x is item
  return -1

或使用像 Underscore.js 这样的库来进行数组操作。

【讨论】:

    猜你喜欢
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多