1. ホーム
  2. javascript

[解決済み] Array.prototype.includes vs. Array.prototype.indexOf

2022-04-26 19:02:52

質問

読みやすさが向上するだけでなく、何か利点があるのでしょうか? includes を超える indexOf ? 私には同じに見えますが。

この違いは何ですか?

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

そして、これは?

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

解決方法は?

tl;dr: 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) を真にする。

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

さらに fromIndex パラメータと同様です。 Array.prototype.indexOfString.prototype.includes のように、一貫性を持たせるためです。


さらに詳しい情報はこちら