[解決済み] 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) > -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)
を真にする。このように、本提案は既存のコードに見られる両方の問題を解決しています。
さらに
fromIndex
パラメータと同様です。Array.prototype.indexOf
とString.prototype.includes
のように、一貫性を持たせるためです。
さらに詳しい情報はこちら
関連
-
[解決済み】<select>で現在選択されている<option>をJavaScriptで取得するにはどうすればよいですか?
-
[解決済み】JavaScriptで「無効な日付」のDateインスタンスを検出する
-
JSクリックイベント - Uncaught TypeError: プロパティ 'onclick' に null を設定できません。
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] event.preventDefault() vs. return false
-
[解決済み] HTML5のlocalStorageにオブジェクトを格納する方法は?
-
[解決済み] varキーワードの目的と、どのような場合に使用する(または省略する)べきですか?
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み] JavaScriptで配列を比較する方法は?
-
[解決済み] substrとsubstringの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
JavaScriptにおけるマクロタスクとミクロタスクの詳細
-
JavaScriptのクロージャの説明
-
vueが定義するプライベートフィルタと基本的な使い方
-
[解決済み】Node.js Error: Cannot find module express
-
[解決済み] 期待される代入または関数呼び出し: 未使用式なし ReactJS
-
[解決済み] Web API エラー - このリクエストはブロックされました; コンテンツは HTTPS で提供されなければなりません
-
[解決済み】ERROR エラーです。スイッチのname属性が指定されていないフォームコントロールの値アクセッサがない
-
フロントエンド非同期(アシンク)ソリューション(全ソリューション)
-
[解決済み] JavaScript でオブジェクトが特定のプロパティを持つかどうかを確認するにはどうすればよいですか?
-
[解決済み] JavaScriptで[NaN].includes(NaN)がtrueを返すのはなぜですか?