"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中也是如此。至少它是一致的。


当前回答

基本包装器类型是在使用字符串、数字或布尔值时在幕后自动创建的引用类型 是阅读。例如:

var name = "foo";
var firstChar = name.charAt(0);
console.log(firstChar);

这是幕后发生的事情:

// what the JavaScript engine does
var name = "foo";
var temp = new String(name);
var firstChar = temp.charAt(0);
temp = null;
console.log(firstChar);

因为第二行使用了类似对象的字符串(原语), JavaScript引擎创建一个String实例,这样charAt(0)就会 工作。String对象在被销毁之前只存在于一条语句中 检查这个

instanceof操作符返回false,因为临时对象为 仅在读取值时创建。因为instanceof实际上并不读取 任何东西,没有临时对象被创建,它告诉我们-values没有被创建 基本包装器类型的实例。您可以创建原始包装器 类型手动

其他回答

原语是一种不同于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将工作

基本包装器类型是在使用字符串、数字或布尔值时在幕后自动创建的引用类型 是阅读。例如:

var name = "foo";
var firstChar = name.charAt(0);
console.log(firstChar);

这是幕后发生的事情:

// what the JavaScript engine does
var name = "foo";
var temp = new String(name);
var firstChar = temp.charAt(0);
temp = null;
console.log(firstChar);

因为第二行使用了类似对象的字符串(原语), JavaScript引擎创建一个String实例,这样charAt(0)就会 工作。String对象在被销毁之前只存在于一条语句中 检查这个

instanceof操作符返回false,因为临时对象为 仅在读取值时创建。因为instanceof实际上并不读取 任何东西,没有临时对象被创建,它告诉我们-values没有被创建 基本包装器类型的实例。您可以创建原始包装器 类型手动

我相信我已经想出了一个可行的解决方案:

Object.getPrototypeOf('test') === String.prototype    //true
Object.getPrototypeOf(1) === String.prototype         //false

这在ECMAScript规范Section 7.3.19中定义。步骤3:如果Type(O)不是Object,返回false。

换句话说,如果Obj instanceof Callable中的Obj不是一个对象,则instanceof将直接短路为false。