我在CoffeeScript中使用以下代码:
if elem in my_array
do_something()
编译到这个javascript:
if (__indexOf.call(my_array, elem) < 0) {
my_array.push(elem);
}
我可以看到它正在使用在脚本顶部定义的函数__indexOf。
我的问题是关于这个用例:我想从数组中删除一个元素,我想支持IE8。我可以在支持indexOf
splice
对象的indexOf
的浏览器中使用array
和if (attr_index = my_array.indexOf(elem)) > -1
my_array.splice(attr_index, 1)
轻松完成此操作。但是,在IE8中,这不起作用:
__indexOf
我尝试使用CoffeScript定义的if (attr_index = __indexOf.call(my_array, elem) > -1
my_array.splice(attr_index, 1)
函数,但在编译器中出现了保留字错误。
{{1}}
那么我如何使用CoffeScript或者是否有更不引人注意的方法来调用indexOf?两次定义相同的函数似乎很奇怪,因为CoffeeScript不允许我使用它们...
答案 0 :(得分:7)
不,CoffeeScript阻止您直接使用其助手,因为这会打破语言和实现之间的区别。为了支持IE8,我会添加像
这样的垫片Array::indexOf or= (item) ->
for x, i in this
return i if x is item
return -1
或使用类似Underscore.js的库进行数组操作。
答案 1 :(得分:2)
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
运算符作为布尔表达式(并在右侧使用动态长度数组)添加此定义。在一天结束时,一些人可能更容易重新定义它:)