我试图真正理解Javascript,而不是复制和粘贴Javascript googler,我正在阅读Eloquent Javascript电子书,我碰巧穿过以下示例:
var chineseBox = {};
chineseBox.content = chineseBox;
show("content" in chineseBox);
show("content" in chineseBox.content);
令人惊讶的是,他们都输出true
。该书本身声称,“运算符in
可用于测试对象是否具有某种属性。它产生一个布尔值。”
我了解show("content" in chineseBox);
正在寻找它拥有的content
属性,其值为chineseBox
。但是,为什么第二个show()
有效?
为了进一步测试,我尝试了:
show("content" in chineseBox.content.content); //true
show("contents" in chineseBox.contents.content); //type error: undefined
show("contents" in chineseBox.content.contents); // invalid "in" operand
问题基本上是,变量chineseBox {}没有内容属性......或者是吗?
答案 0 :(得分:6)
关键是这一行:
chineseBox.content = chineseBox;
这为chineseBox
提供了对自身的引用。所以:
show(chineseBox.content === chineseBox);
您应该看到此也会输出true
。
因此'content'
位于chineseBox
以及chineseBox.content
(和chineseBox.content.content
等等),因为它们都是同一个对象,做< / em>拥有content
属性。
让我们看看你的第二个和第三个例子。为什么有人提出TypeError
而另一方抱怨无效in
操作数?
在第二个例子中,你有:
show("contents" in chineseBox.contents.content);
为了让in
运算符测试指定的属性(“content s ”)是否在指定的对象中,它首先必须评估该对象是什么。您收到类型错误,因为chineseBox.contents
为undefined
,因此您无法访问其content
属性,因为无法访问该对象。
将此与第三个例子对比:
show("contents" in chineseBox.content.contents);
现在此处,in
运算符至少比第二个示例中的运算符更远。 chineseBox.content
属性确实存在,并且访问其内容 s 属性会为您提供undefined
。所以那里没有错误。但是,您使用in
关键字本身会收到错误,因为您无法检查属性是否在undefined
中。
换句话说,在第二个例子中,就像你在问“圣诞老人的房子里有精灵吗?”圣诞老人不存在,所以没有“圣诞老人的房子”这样的地方。在第三个例子中,你更像是在问“奥巴马棕色房子里的椭圆形办公室在哪里?”奥巴马存在,但他没有棕色的房子。
答案 1 :(得分:3)
chineseBox.content = chineseBox;
由于自我引用,请注意chineseBox
与chineseBox.content
是同一个对象。含义chineseBox
,chineseBox.content
,chineseBox.content.content
,chineseBox.content.content.content
,无限广告,都指代同一个对象。
show("content" in chineseBox);
show("content" in chineseBox.content);
show("content" in chineseBox.content.content);
show("content" in chineseBox.content.content.content);
show("content" in chineseBox.content.content.content.content);
show("content" in chineseBox.content.content.content.content.content);
(在您的测试中,请注意content
和contents
与's'之间的差异。)