[英]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.