2013-08-07 162 views
0

我看instanceof answer,但我有一個問題 當我編寫混淆的instanceof數組和字符串

["a","b"] instanceof Array 

爲什麼reutrns一樣真正的

new Array("a","b") instanceof Array 

"a" instanceof String 

返回false不像

new String("ab") instanceof String 

? 非常感謝您的答案和幫助!

+0

所以你問什麼情況下是「一」? –

回答

2

對於字符串,你有兩個

  • 原始的字符串(您處理大多數時候的那些,和你從文字領)String類的
  • 和實例。

而且它們不一樣。

這是what the MDN says on the distinction between both

另一種方式看出差別,其中MDN不點,就是你可以在對象上添加屬性:

var a = "a"; 
a.b = 3; // doesn't add the property to a but to a wrapped copy 
console.log(a.b); // logs undefined 
a = new String("a"); 
a.b = 3; 
console.log(a.b); // logs 3 

(請記住,大部分的時間,你應該使用原始的字符串)

對於數組,只有數組,沒有什麼像原始數組。

+0

對於關於對象屬性和原始字符串屬性的評論+1! –

0

在你的情況

"a" 

不是一個String對象,它是一個字符串字面或者它被稱爲「原始」。 所以JS不會背叛你,聲稱,「a」不是String的一個實例。上String

+2

一個字符串字面值和一個字符串原始值不相同。文字是*句法*構造。它告訴詞法分析器,字符序列應該是一個字符串。字符串原語是存在於*運行時*的數據類型(不是解析時間)。確實如此,一個字符串* literal *總是導致一個字符串* primitive *。 –

+0

感謝您的澄清。在Javascript中,我認爲它可以互換使用。 –

+0

它可能經常互換使用,但這並不意味着它是正確的。加上我有點挑剔;) –

0

CF MDNinstanceof檢查是defined as

當F的[[HasInstance]]內部方法被調用,值V,採取 以下步驟:

  1. 如果V不是一個對象,則返回false。
  2. 設O是調用屬性名稱爲「prototype」的F的[[Get]]內部方法的結果。
  3. 如果Type(O)不是Object,則拋出TypeError異常。
  4. 重複
    1. 令V的[[原型]]內部V.
    2. 如果V是空的屬性值,返回false。
    3. 如果O和V引用同一個對象,則返回true。

所以串失敗的第一步,因爲字符串不是一個對象。還要注意,new String不會返回一個字符串,而是一個由名爲String的構造函數構造的對象。這是Java和Javascript完全不同的一個例子。

這裏也是代碼自定義instanceOf,使但是它的工作你喜歡,那麼:

function instanceOf(F, V) { 
    if(typeof F !== "function") { 
     throw new Error("F must be a constructor"); 
    } 
    if(Object(V) !== V) { 
     return false; //not an object 
    } 
    var O = F.prototype; 
    if(Object(O) !== O) { 
     throw new Error(".prototype must be an object"); 
    } 
    while(true) { 
     V = Object.getPrototypeOf(V); 
     if(V == null) { 
      return false; 
     } 
     if(V === O) { 
      return true; 
     } 
    } 
} 
+0

謝謝,我明白了第一項,但什麼是O和[[Get]]內部方法?它們是JavaScript內部實現嗎?自定義instanceof(F,V),F參數代表什麼?如何使用這個程序? –

+0

@ user2245634他們是技術解釋應該如何工作。要使用[[Get]]操作屬性名稱爲「prototype」的'F',您只需執行'F.prototype'。 '[[Get]]'操作也在規範中單獨說明。 – Esailija