1

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

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

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

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

4

6 回答 6

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 中有多种对象,包括“数组对象”、“正则表达式对象”、“函数对象”、...和“对象对象”。操作员在typeof那里不是很有帮助。它只能区分 Function 对象和其他对象。

于 2013-07-18T07:27:27.717 回答
1

对象不必是ObjectJavaScript 中的实例。例如:

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

之所以会这样,是因为instanceof执行的方式。有关更多详细信息,请参阅以下答案:https ://stackoverflow.com/a/8096017/783743

于 2013-07-18T11:07:50.890 回答
1

如果您覆盖__proto__. 例如:

var myObj = { __proto__: null };

(myObject instanceof Object) === false;

这是因为instanceof它的工作原理——它基本上沿着原型链向上寻找你传递给它的构造函数。更多信息instanceof在此处获得。

于 2013-07-18T07:15:40.953 回答
0

instanceof 运算符测试对象的原型链中是否具有构造函数的原型属性。

您可以查看Mozilla 的开发者网站

基本上,instanceof如果对象从类的原型继承,则运算符评估为 true,例如:

 var a = new Animal():

这里a is instance of Animal因为a继承自Animal.prototype

于 2013-07-18T07:15:44.733 回答
0

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

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

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

于 2013-07-18T07:18:13.533 回答
0

您很可能正在处理空值:

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

或者正如 Pumbaa80 评论的那样;您从 Iframe 中获取了对象,因此它的构造函数与主窗口中的 Object 不同,因此 instanceof Object 为 false,但变量确实具有对象值。

于 2013-07-18T07:18:25.117 回答