2013-02-12 41 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