在我试图真正理解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 {}没有内容属性......或者是吗?
关键是这一行:
chineseBox.content = chineseBox;
Run Code Online (Sandbox Code Playgroud)
这给出chineseBox了自己的参考.所以:
show(chineseBox.content === chineseBox);
Run Code Online (Sandbox Code Playgroud)
你应该看到这也会输出true.
因此,'content'在chineseBox和chineseBox.content(和chineseBox.content.content等),因为他们都是同一个对象,它确实有一个content属性.
让我们看看你的第二个和第三个例子.为什么有人会TypeError抱怨另一个抱怨无效的in操作数?
在第二个示例中,您有:
show("contents" in chineseBox.contents.content);
Run Code Online (Sandbox Code Playgroud)
为了让in操作员测试指定的属性("content s ")是否在指定的对象中,它首先必须评估该对象是什么.你得到一个类型错误,因为chineseBox.contents是undefined的,所以你不能访问它content,因为没有对象访问属性.
与第三个例子对比:
show("contents" in chineseBox.content.contents);
Run Code Online (Sandbox Code Playgroud)
现在,这里的in运营商至少获得比它在第二个例子中那样远.该chineseBox.content属性确实存在,并访问其内容的属性为您提供undefined.所以那里没有错误.但是,您会收到in关键字本身的错误,因为您无法检查属性是否存在undefined.
换句话说,在第二个例子中,就像你在问"圣诞老人的房子里有精灵吗?" 圣诞老人不存在,所以没有"圣诞老人的房子"这样的地方.在第三个例子中,你更像是在问"奥巴马棕色房子里的椭圆形办公室在哪里?" 奥巴马存在,但他没有棕色的房子.
| 归档时间: |
|
| 查看次数: |
123 次 |
| 最近记录: |