Array.prototype.includes と Array.prototype.indexOf 質問する

Array.prototype.includes と Array.prototype.indexOf 質問する

includes読みやすさが向上する以外に、よりも優れている点はありますかindexOf? 私には、それらは同じに思えます。

この違いは何ですか?

var x = [1,2,3].indexOf(1) > -1; //true

この?

var y = [1,2,3].includes(1); //true

ベストアンサー1

要約: NaN扱いが異なります:

  • [NaN].indexOf(NaN) > -1false
  • [NaN].includes(NaN)true

から提案:

モチベーション

ECMAScript配列を使用する場合、配列に要素が含まれているかどうかを判定することが一般的です。このための一般的なパターンは次のとおりです。

if (arr.indexOf(el) !== -1) {
    ...
}

arr.indexOf(el) >= 0他にも、 、 など、さまざまな可能性があります~arr.indexOf(el)

これらのパターンには 2 つの問題があります。

  • これらは「あなたが言いたいこと」を伝えることに失敗しています。配列に要素が含まれているかどうかを尋ねる代わりに、配列内でその要素が最初に出現するインデックスは何かを尋ね、それを比較したりビット操作したりして、実際の質問に対する答えを決定します。
  • これらはNaN、 ではindexOf厳密な等価比較が使用されるため では失敗し、したがって となります[NaN].indexOf(NaN) === -1

提案された解決策

Array.prototype.includes上記のパターンを次のように書き直すことができるメソッドの追加を提案する。

if (arr.includes(el)) {
    ...
}

これは、厳密な等価比較の代わりに SameValueZero 比較アルゴリズムを使用する点を除いて、上記とほぼ同じセマンティクスを持ちます。したがって、[NaN].includes(NaN)true になります。

したがって、この提案は既存のコードに見られる両方の問題を解決します。

一貫性を保つために、およびfromIndexに似たパラメータも追加します。Array.prototype.indexOfString.prototype.includes


さらに詳しい情報:

おすすめ記事