出于某种原因,我遇到了一个案例,Chrome 的 V8 似乎认为一个对象实际上不是一个对象。我不能轻松地重现这一点,但基本上我有这个代码段:
if (!(obj instanceof Object)) {
console.log(obj);
}
然而 chrome 的控制台显示它实际上是一个对象......有谁知道可能导致这种情况的原因?我怎样才能重现这个?
当我使用 typeof 运算符时,它正确地将其标识为对象。
出于某种原因,我遇到了一个案例,Chrome 的 V8 似乎认为一个对象实际上不是一个对象。我不能轻松地重现这一点,但基本上我有这个代码段:
if (!(obj instanceof Object)) {
console.log(obj);
}
然而 chrome 的控制台显示它实际上是一个对象......有谁知道可能导致这种情况的原因?我怎样才能重现这个?
当我使用 typeof 运算符时,它正确地将其标识为对象。
它可能来自不同的window
(例如 iframe),它有自己的Object
构造函数
var obj = frame.contentWindow.obj;
console.log(obj instanceof Object); // false
console.log(obj instanceof frame.contentWindow.Object); // true
另请注意,JS 中有多种对象,包括“数组对象”、“正则表达式对象”、“函数对象”、...和“对象对象”。操作员在typeof
那里不是很有帮助。它只能区分 Function 对象和其他对象。
对象不必是Object
JavaScript 中的实例。例如:
var obj = Object.create(null);
console.log(obj instanceof Object); // false
console.log(typeof obj); // object
之所以会这样,是因为instanceof
执行的方式。有关更多详细信息,请参阅以下答案:https ://stackoverflow.com/a/8096017/783743
如果您覆盖__proto__
. 例如:
var myObj = { __proto__: null };
(myObject instanceof Object) === false;
这是因为instanceof
它的工作原理——它基本上沿着原型链向上寻找你传递给它的构造函数。更多信息instanceof
可在此处获得。
instanceof 运算符测试对象的原型链中是否具有构造函数的原型属性。
您可以查看Mozilla 的开发者网站。
基本上,instanceof
如果对象从类的原型继承,则运算符评估为 true,例如:
var a = new Animal():
这里a is instance of Animal
因为a
继承自Animal.prototype
Typeof为您提供对象的类型(在本例中为“对象”),instanceof测试原型链。
o={};
o instanceof Object //is true
typeof o // "object"
typeof(o.constructor.prototype)==="object" // is true
所以在你的情况下,错误必须在obj
.
您很可能正在处理空值:
console.log(null instanceof Object);//false
console.log(typeof(null));// object
或者正如 Pumbaa80 评论的那样;您从 Iframe 中获取了对象,因此它的构造函数与主窗口中的 Object 不同,因此 instanceof Object 为 false,但变量确实具有对象值。