首頁  >  文章  >  web前端  >  為什麼字串、布林值和數字文字無法通過「instanceof」測試?

為什麼字串、布林值和數字文字無法通過「instanceof」測試?

Patricia Arquette
Patricia Arquette原創
2024-10-31 21:51:02550瀏覽

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

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn