了解Javascript中的“in”关键字

时间:2013-08-30 21:37:24

标签: javascript

我试图真正理解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 {}没有内容属性......或者是吗?

2 个答案:

答案 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.contentsundefined,因此您无法访问其content属性,因为无法访问该对象。

将此与第三个例子对比:

show("contents" in chineseBox.content.contents);

现在此处in运算符至少比第二个示例中的运算符更远。 chineseBox.content属性确实存在,并且访问内容 s 属性会为您提供undefined。所以那里没有错误。但是,您使用in关键字本身会收到错误,因为您无法检查属性是否在undefined中。

换句话说,在第二个例子中,就像你在问“圣诞老人的房子里有精灵吗?”圣诞老人不存在,所以没有“圣诞老人的房子”这样的地方。在第三个例子中,你更像是在问“奥巴马棕色房子里的椭圆形办公室在哪里?”奥巴马存在,但他没有棕色的房子。

答案 1 :(得分:3)

chineseBox.content = chineseBox;

由于自我引用,请注意chineseBoxchineseBox.content是同一个对象。含义chineseBoxchineseBox.contentchineseBox.content.contentchineseBox.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);

(在您的测试中,请注意contentcontents与's'之间的差异。)