2013-02-12 42 views
23

我正在使用node.js,所以這可能是V8特有的。JavaScript中typeof和instanceof的區別

我一直注意到一些怪事用typeof和的instanceof之間的差異,但在這裏是一個真正的錯誤我:

var foo = 'foo'; 
console.log(typeof foo); 

Output: "string" 

console.log(foo instanceof String); 

Output: false 

這是怎麼回事呢?

+3

在JavaScript中,我相信還有的有着天壤之別原始字符串類型和「對象」字符串類型。大多數時候它們是可以互換的,顯然不是爲了'instanceof'檢查的目的。 – millimoose 2013-02-12 18:53:20

+3

看看這個:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String#Distinction_between_string_primitives_and_String_objects – Waxen 2013-02-12 18:54:07

+0

呸,應該尋找SO第一: 的http://計算器/ 11571923/instanceof-string-not-behaving-as-expected-in-google-apps-script/11572009#11572009 – Eric 2013-02-12 18:54:18

回答

38

typeof是一種構造,它返回您傳遞它的任何原始類型。
instanceof測試以查看右操作數是否出現在左側原型鏈的任何位置。

重要的是要注意字符串文字​​和字符串對象new String("abc")之間存在巨大差異。在後一種情況下,typeof將返回「對象」而不是「字符串」。

7

有字面上的字符串,並且有String類。它們是分開的,但它們可以無縫地工作,即您仍然可以將String方法應用於文字字符串,並且它的作用就好像文字字符串是String對象實例。

如果你明確地創建一個String實例,它是一個對象,而且它是String類的一個實例:

var s = new String("asdf"); 
console.log(typeof s); 
console.log(s instanceof String); 

輸出:

object 
true 
+1

你應該注意到'typeof'輸出實際上是''object''(一個小寫字符串) – rgthree 2013-02-12 18:58:59

+0

@rgthree:是的,你是對的。我糾正了輸出。 – Guffa 2013-02-12 19:00:02

+0

@rgthree這應該被添加回答 – kittu 2017-02-14 15:41:00