在 CoffeeScript 中使用 indexOf
Using indexOf in CoffeeScript
本文关键字:indexOf CoffeeScript 更新时间:2023-09-26
我在CoffeeScript中使用以下代码:
if elem in my_array
do_something()
编译到这个javascript:
if (__indexOf.call(my_array, elem) < 0) {
my_array.push(elem);
}
我可以看到它正在使用脚本顶部定义的函数__indexOf。
我的问题是关于这个用例的:我想从数组中删除一个元素,我想支持 IE8。我可以通过支持array
对象indexOf
的浏览器中的indexOf
和splice
轻松做到这一点。但是,在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 不允许我使用他们的函数......
不,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伯纳姆答案中的重复代码:
Array::indexOf or= `__indexOf`
但是,您需要确保 CoffeeScript 将使用 in
运算符作为布尔表达式(并在右侧使用动态长度数组)来添加此定义。归根结底,有些人重新定义它可能更容易:)
相关文章:
- 为什么indexOf在这个js代码中不起作用
- Angularjs通过过滤器获取indexOf
- indexOf具有2个参数
- .indexOf()不适用于特定元音
- 对字符串使用IndexOf来挑选某些单词
- 如果window.location.href.indexOf('player=1')添加样式
- inArray,indexOf在二维数组中
- CoffeeScript将对象添加到数组中
- gets.chomp for coffeescript?
- CoffeeScript绑定多个参数
- 为什么我得到“;没有方法'indexOf'"在ExtJS4.2中尝试在网格上使用缓冲渲染器时出错
- 尝试将js函数更改为coffeescript时发生Uncaught ReferenceError
- Jquery Validate with Coffeescript
- 设置AngularJS控制器属性不能是使用Coffeescript的最后一行
- 需要一些str.indexOf帮助javascript
- Coffeescript jQuery each loop
- Safari Array indexOf找不到任何内容
- rails 4.1.6 form_for coffeescript在多个视图上不起作用
- TypeError:无法读取属性'indexOf'的未定义
- 在 CoffeeScript 中使用 indexOf