includes
読みやすさが向上する以外に、よりも優れている点はありますかindexOf
? 私には、それらは同じに思えます。
この違いは何ですか?
var x = [1,2,3].indexOf(1) > -1; //true
この?
var y = [1,2,3].includes(1); //true
ベストアンサー1
要約: NaN
扱いが異なります:
[NaN].indexOf(NaN) > -1
はfalse
[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.indexOf
String.prototype.includes
さらに詳しい情報: