簡體   English   中英

在CoffeeScript中使用indexOf

[英]Using indexOf in CoffeeScript

我在CoffeeScript中使用以下代碼:

if elem in my_array
  do_something()

哪個編譯成這個javascript:

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

我可以看到它使用了在腳本頂部定義的函數__indexOf。

我的問題是關於這個用例:我想從數組中刪除一個元素,我想支持IE8。 我可以使用indexOf輕松實現這一點,並在支持array對象的indexOf瀏覽器中進行splice 但是,在IE8中,這不起作用:

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

我嘗試使用__indexOf定義的__indexOf函數,但我在編譯器中得到一個保留字錯誤。

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

那么我如何使用CoffeScript或者是否有更不引人注意的方法來調用indexOf? 兩次定義相同的函數似乎很奇怪,因為CoffeeScript不允許我使用他們的...

不,CoffeeScript阻止您直接使用其助手,因為這會打破語言和實現之間的區別。 為了支持IE8,我會添加一個墊片

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

或使用像Underscore.js這樣的庫來進行數組操作。

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運算符作為布爾表達式(並在右側使用動態長度數組)添加此定義。 在一天結束時,一些人可能只是更容易重新定義它:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM