了解Javascript中的"in"关键字

big*_*ode 4 javascript

在我试图真正理解Javascript,而不是复制和粘贴Javascript googler,我正在通过Eloquent Javascript电子书,我碰巧穿过以下示例:

var chineseBox = {};
chineseBox.content = chineseBox;
show("content" in chineseBox);
show("content" in chineseBox.content);
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,他们都输出了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
Run Code Online (Sandbox Code Playgroud)

问题基本上是,变量chineseBox {}没有内容属性......或者是吗?

Dan*_*Tao 6

关键是这一行:

chineseBox.content = chineseBox;
Run Code Online (Sandbox Code Playgroud)

这给出chineseBox了自己的参考.所以:

show(chineseBox.content === chineseBox);
Run Code Online (Sandbox Code Playgroud)

你应该看到也会输出true.

因此,'content'chineseBoxchineseBox.content(和chineseBox.content.content等),因为他们都是同一个对象,它确实有一个content属性.


让我们看看你的第二个和第三个例子.为什么有人会TypeError抱怨另一个抱怨无效的in操作数?

在第二个示例中,您有:

show("contents" in chineseBox.contents.content);
Run Code Online (Sandbox Code Playgroud)

为了让in操作员测试指定的属性("content s ")是否在指定的对象中,它首先必须评估该对象什么.你得到一个类型错误,因为chineseBox.contentsundefined的,所以你不能访问它content,因为没有对象访问属性.

与第三个例子对比:

show("contents" in chineseBox.content.contents);
Run Code Online (Sandbox Code Playgroud)

现在,这里in运营商至少获得比它在第二个例子中那样远.该chineseBox.content属性确实存在,并访问内容属性为您提供undefined.所以那里没有错误.但是,您会收到in关键字本身的错误,因为您无法检查属性是否存在undefined.

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