instanceof とリテラルの不一致
JavaScript の instanceof 演算子は、オブジェクトがクラスのインスタンスであるかどうかを確認するという目的にもかかわらず、次のような問題を示します。リテラルでの予期しない動作。この記事では、これらの不一致について詳しく説明し、その背後にある理由を明らかにします。
プリミティブ リテラルとオブジェクト リテラル
文字列、数値、ブール値などのプリミティブは、 JavaScript 内で作成されたオブジェクトとは異なるタイプのカテゴリ。この区別は、次の例で示されています。
<code class="js">var color1 = new String("green"); color1 instanceof String; // returns true var color2 = "coral"; color2 instanceof String; // returns false (color2 is not a String object)</code>
color1 はコンストラクターから作成された String のインスタンスですが、color2 はプリミティブ文字列リテラルです。
instanceof では False が返されます。
予期せず、instanceof は多くのリテラルに対して false を返します:
<code class="js">"foo" instanceof String // false true instanceof Boolean // false 12.21 instanceof Number // false</code>
これらのプリミティブは、それぞれのラッパー オブジェクトのインスタンスとは見なされません。
例外配列とオブジェクト
配列およびオブジェクト リテラルは、次のルールの例外です。
<code class="js">[0,1] instanceof Array // true {0:1} instanceof Object // true</code>
それらは、対応するコンストラクター関数のインスタンスとして扱われます。
矛盾の理由
instanceof の動作の違いは意図的です。 JavaScript では、プリミティブはオブジェクトではなく不変の値であると見なされます。そのため、これらはどのクラスからも継承されません。配列リテラルとオブジェクト リテラルの例外は、オブジェクトの操作を簡素化し、コンストラクター関数との一貫性を維持するために設けられています。
結論
プリミティブ リテラルと JavaScript 内で作成されたオブジェクトは、次の点で異なります。 instanceof 演算子の動作。この区別は、特定の使用例によっては、直観に反する場合と便利な場合があります。この微妙な動作を理解することにより、開発者は JavaScript コードで instanceof を効果的に利用できます。
以上がJavaScript で「instanceof」がリテラルと異なる動作をするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。