ホームページ  >  記事  >  ウェブフロントエンド  >  文字列、ブール値、数値リテラルが「instanceof」テストに失敗するのはなぜですか?

文字列、ブール値、数値リテラルが「instanceof」テストに失敗するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-31 21:51:02550ブラウズ

Why Do String, Boolean, and Number Literals Fail the `instanceof` Test?

Instanceof の難題: 一部のリテラルが一致しない理由

instanceof 演算子は JavaScript の基本であるにもかかわらず、特定の関数で使用すると不可解な動作を示すことがあります。リテラル。特に、文字列、ブール値、および数値リテラルは、それぞれのコンストラクターに対してテストすると、すべて false と評価されます。

<code class="js">"foo" instanceof String //=> false
"foo" instanceof Object //=> false

true instanceof Boolean //=> false
true instanceof Object //=> false
false instanceof Boolean //=> false
false instanceof Object //=> false

12.21 instanceof Number //=> false
/foo/ instanceof RegExp //=> true</code>

リテラルは対応する型のインスタンスであると予想されるため、この動作は驚くべきものです。ただし、それらの不一致の理由は、プリミティブとオブジェクトの区別にあります。

実際のプリミティブ主義

文字列、数値、ブール値などの JavaScript プリミティブは、オブジェクト コンストラクターを通じて作成されない組み込み型。代わりに、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>

上で示したように、String コンストラクターを使用すると String オブジェクトが作成され、instanceof でテストすると true と評価されます。ただし、プリミティブ文字列リテラル "coral" はこの動作を継承しません。

代替の型検査メソッド

プリミティブを使用したinstanceofの不可解な動作により、この動作が採用されました。型チェックの代替メソッド:

  • typeof 演算子: typeof 演算子は、変数のプリミティブ型 (typeof "foo" === "string" など) を返します。
  • Object.prototype.toString: このメソッドは、たとえば Object.prototype.toString.call("foo") === "[object String] のように型チェックにも使用できます。 ]".

結論として、プリミティブを使用したinstanceofの動作はJavaScriptの独自の型システムの結果です。これは混乱を招く可能性がありますが、プリミティブとオブジェクトの区別を理解することは、開発者がこれらの微妙な違いを効果的にナビゲートするのに役立ちます。

以上が文字列、ブール値、数値リテラルが「instanceof」テストに失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。