5

CoffeeScript で次のコードを使用しています。

if elem in my_array
  do_something()

このJavaScriptにコンパイルされます:

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

スクリプトの先頭で定義されている関数 __indexOf を使用していることがわかります。

私の質問は、このユース ケースに関するものです。配列から要素を削除したいのですが、IE8 をサポートしたいと考えています。これは、オブジェクトをサポートするブラウザーで簡単に行うことができindexOfます。ただし、IE8 ではこれは機能しません。spliceindexOfarray

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

__indexOfCoffeScript で定義されている関数を使用しようとしましたが、コンパイラで予約語エラーが発生します。

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

では、どうすれば CoffeScript を使用できますか、または indexOf を呼び出すためのより目立たない方法はありますか? 同じ関数を 2 回定義するのは奇妙に思えますが、CoffeeScript ではそれらの関数を使用させてくれないという理由だけで...

4

2 に答える 2

7

いいえ、CoffeeScript では、ヘルパーを直接使用することはできません。これは、言語と実装の区別が崩れるからです。IE8をサポートするには、次のようなシムを追加します

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

または、配列操作にUnderscore.jsなどのライブラリを使用します。

于 2012-06-21T14:51:24.593 に答える
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`

inただし、CoffeeScript がブール式として演算子を使用して (そして右側に動的な長さの配列を使用して)、この定義を追加することを確認する必要があります。結局のところ、それを再定義するだけの方が簡単かもしれません:)

于 2013-09-10T06:06:46.290 に答える