2013-08-30 4 views
4

В моей попытке действительно понять Javascript, вместо того, чтобы скопировать и вставить Javascript Googler, я иду через красноречивый Javascript E-книги и я случайно пересечь следующий пример:Понимание «в» ключевое слово в 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

'chineseBox' имеет свойство' content', и это ссылка на 'chineseBox'. Таким образом, любая глубина '.content' создаст' true'. –

+3

Вы получаете ошибки в своих вторых двух примерах, потому что они используют содержимое вместо содержимого – pllee

ответ

6

Ключ заключается в строку:

chineseBox.content = chineseBox; 

Это дает chineseBox ссылку на себя , Итак:

show(chineseBox.content === chineseBox); 

Вы должны увидеть этот также выдает true.

Поэтому 'content' в chineseBox, а также chineseBox.contentchineseBox.content.content и так далее), потому что они все тот же объект, который делает имеют content свойство.


Давайте рассмотрим ваш второй и третий примеры. Почему вы даете TypeError, а другой жалуется на недопустимый операнд in?

Во втором примере, у вас есть:

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

Для того, чтобы оператор in для тестирования («содержание s») находится в указанном объекте, он первый, имеет ли заданное свойство для оценки какой именно объект является. Вы получаете ошибку типа, потому что chineseBox.contents - undefined, и поэтому вы не можете получить доступ к своему свойству content, потому что нет доступа к объекту.

Contrast это с третьим примером:

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

Теперь здесь, оператор in по крайней мере, получает дальше, чем это было во втором примере. Объект chineseBox.content есть, и доступ к его содержание s Недвижимость дает вам undefined. Так что ошибок там нет. Но тогда вы получаете ошибку с ключевым словом in, потому что вы не можете проверить, находится ли свойство в undefined.

Другими словами, во втором примере это похоже на то, что вы спрашиваете: «Есть ли в доме Эльфы какие-то эльфы?» Санта не существует, поэтому нет такого места, как «дом Санта-Клауса». В третьем примере это больше похоже на то, что вы спрашиваете: «Где овальный офис в коричневом доме Обамы?» Обама существует, но у него нет коричневого дома.

+0

Отличное объяснение. Спасибо за то, что вы также обратились к примерам содержания. Я просто положил его из-за моего отсутствия понимания, что у ChineseBox есть ссылка на себя. – bigbitecode

3
chineseBox.content = chineseBox; 

Из-за самоссылки, обратите внимание, что chineseBox тот же объект, как chineseBox.content. Значение chineseBox, chineseBox.content, chineseBox.content.content, chineseBox.content.content.content, ad infinitum, все относятся к тому же объекту.

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'.)

Смежные вопросы