出于某种原因,我遇到了Chrome的V8似乎认为对象实际上不是对象的情况。我不能轻易地重现这一点,但基本上我有这段代码:
if (!(obj instanceof Object)) {
console.log(obj);
}
然而chrome的控制台显示它实际上是一个对象......有谁知道什么可能导致这个?我怎样才能重现这个?
当我使用typeof运算符时,它会将其正确识别为对象。
答案 0 :(得分:3)
它可能来自不同的window
(例如iframe),它有自己的Object
构造函数
var obj = frame.contentWindow.obj;
console.log(obj instanceof Object); // false
console.log(obj instanceof frame.contentWindow.Object); // true
另请注意,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
答案 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,但变量确实有一个对象值。