"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

// the tests against Object really don't make sense

数组字面量和对象字面量匹配…

[0,1] instanceof Array //=> true
{0:1} instanceof Object //=> true

为什么不是所有人?或者,为什么不都不呢? 那么,它们是什么实例呢?

在FF3、IE7、Opera和Chrome中也是如此。至少它是一致的。


当前回答

你可以使用构造函数属性:

'foo'.constructor == String // returns true
true.constructor == Boolean // returns true

其他回答

对我造成的困惑

"str".__proto__ // #1
=> String

所以"str" istanceof String应该返回true,因为istanceof的工作原理如下:

"str".__proto__ == String.prototype // #2
=> true

表达式#1和#2的结果相互冲突,因此应该有一个是错误的。

第一条是错的

我发现它是由__proto__非标准属性引起的,所以使用标准属性:Object.getPrototypeOf

Object.getPrototypeOf("str") // #3
=> TypeError: Object.getPrototypeOf called on non-object

现在表达式2和表达式3之间没有混淆了

原语是一种不同于Javascript中创建的对象的类型。来自Mozilla API文档:

var color1 = new String("green");
color1 instanceof String; // returns true
var color2 = "coral";
color2 instanceof String; // returns false (color2 is not a String object)

我找不到任何方法来构造原始类型的代码,也许这是不可能的。这可能就是为什么人们使用typeof "foo" === "string"而不是instanceof。

记住这些事情的一个简单方法是问自己“我想知道什么是理智的和容易学的”?不管答案是什么,Javascript做的是另一件事。

 typeof(text) === 'string' || text instanceof String; 

你可以用这个,这两种情况都适用

文本var = " foo ";// typeof将工作 String text= new String("foo");// instanceof将工作

你可以使用构造函数属性:

'foo'.constructor == String // returns true
true.constructor == Boolean // returns true

或者你可以像这样创建你自己的函数:

function isInstanceOf(obj, clazz){
  return (obj instanceof eval("("+clazz+")")) || (typeof obj == clazz.toLowerCase());
};

用法:

isInstanceOf('','String');
isInstanceOf(new String(), 'String');

这些都应该返回true。