为什么JavaScript的instanceof运算符说对象不是Object?

时间:2013-07-18 07:06:08

标签: javascript instanceof

出于某种原因,我遇到了Chrome的V8似乎认为对象实际上不是对象的情况。我不能轻易地重现这一点,但基本上我有这段代码:

if (!(obj instanceof Object)) {
    console.log(obj);
}

然而chrome的控制台显示它实际上是一个对象......有谁知道什么可能导致这个?我怎样才能重现这个?

当我使用typeof运算符时,它会将其正确识别为对象。

6 个答案:

答案 0 :(得分:3)

它可能来自不同的window(例如iframe),它有自己的Object构造函数

var obj = frame.contentWindow.obj;
console.log(obj instanceof Object); // false
console.log(obj instanceof frame.contentWindow.Object); // true

http://jsfiddle.net/JnfPR/1/

另请注意,JS中有各种对象,包括“Array对象”,“RegExp对象”,“函数对象”,......和“对象对象”。 typeof运算符在那里不是很有帮助。它只能区分Function对象和其他对象。

答案 1 :(得分:1)

如果您覆盖__proto__,就会发生这种情况。例如:

var myObj = { __proto__: null };

(myObject instanceof Object) === false;

这是由于instanceof的工作方式 - 它基本上会在原型链中查找您传递给它的构造函数。有关instanceof的更多信息可用here

答案 2 :(得分:1)

对象不一定是JavaScript中Object的实例。例如:

var obj = Object.create(null);
console.log(obj instanceof Object); // false
console.log(typeof obj);            // object

原因在于instanceof的实施方式。有关详细信息,请参阅以下答案:https://stackoverflow.com/a/8096017/783743

答案 3 :(得分:0)

  

instanceof运算符测试对象是否在其原型中   链接构造函数的prototype属性。

您可以查看Mozilla's developer site

如果对象继承自classe的原型,instanceof运算符基本上会变为true,例如:

 var a = new Animal():

a is instance of Animal a继承自Animal.prototype

以来{{1}}

答案 4 :(得分:0)

Typeof为您提供对象的类型(在本例中为“object”),instanceof测试原型链。

o={};
o instanceof Object //is true
typeof o // "object" 
typeof(o.constructor.prototype)==="object" // is true

所以在你的情况下,错误必须在obj

答案 5 :(得分:0)

您最有可能处理空值:

console.log(null instanceof Object);//false
console.log(typeof(null));// object

或正如Pumbaa80评论的那样;你从iframe得到了这个对象,所以它的构造函数与主窗口中的对象不一样,因为instanceof是false,但变量确实有一个对象值。