以下代码片段取自Eloquent JavaScript。
var noCatsAtAll = {};
if ("constructor" in noCatsAtAll)
console.log("Yes, there definitely is a cat called 'constructor'.");
我觉得这很神秘。为什么'if'会返回true?
答案 0 :(得分:6)
JavaScript对象有一个名为constructor
的函数,它是创建对象实例的函数。它内置于所有对象。 in
运算符在字典实例中测试某些的存在,称为“构造函数”,因此它返回true。例如,如果您测试length
,则会发生同样的事情。
答案 1 :(得分:5)
Object的所有实例都有一个constructor
属性,用于指定构造Object原型的函数。
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object#Properties_2
in
运算符会查看所有属性,包括继承的属性。如果您只想查看对象本身的属性,可以使用hasOwnProperty
:
var a = {};
"constructor" in a; // true
a.hasOwnProperty("constructor"); // false
请注意,虽然in
运算符看到"constructor"
,但for (key in a)
循环不会。这是因为"constructor"
属性是不可枚举的。
答案 2 :(得分:2)
它是Object
类型的构造函数。直接在对象的属性(“构造函数”)上提供对constructor
函数的引用(它也适用于您编写的构造函数)。
反过来,存在的属性名称是in
个对象。
答案 3 :(得分:1)
constructor
是Object
的一种方法。除非您修改它,否则您可以在所有对象中找到constructor
方法。 in
运算符将通过prototype
链找到方法。这就是为什么建议使用hasOwnProperty
来测试您自己对象中的属性的原因。
var noCatsAtAll = {};
if ("constructor" in noCatsAtAll)
console.log("Yes, there definitely is a cat called 'constructor'.");
if ('constructor' in Object)
console.log("Yes, there is also a method called constructor");
var noCon = Object.create(null); // create a completetly empty object
console.log('constructor' in noCon); // false
function hasConstructorToo() {}
console.log('constructor' in hasConstructorToo) // true
console.log('constructor' in []); // true