истинность строк против ключей - PullRequest
0 голосов
/ 29 августа 2011

Сегодня я попытался сократить выражение if следующим образом:

if (fruit == "apple" || type == "pear" || type == "orange"){

до этого:

if (fruit in ["apple", "pear", "orange"]){

Это не такРабота.У Джонатана Снука есть другое решение здесь , где он по существу использует карту, подобную этой, которая работает:

if(fruit in {"apple":"", "pear":"", "orange":""}){

Почему это работает, и мой простой массивне, когда обычно в Javascript присутствие объекта заставляет этот объект возвращать истину?Является ли строка объектом другого типа, чем ключ?Я думал, что присутствие строки в моем массиве также вернет true.

y = "Stackoverflow";
y && console.log('y is true') // y returns true, so console logs the message

Я интерпретировал свое первоначальное решение как «если значение переменной fruit находится в этом массиве».Это явно не тот случай.Вместо этого он говорит "если сама переменная fruit находится в этом массиве?"Нет, потому что это тоже не работает:

if (fruit in [fruit, "apple", "pear", "orange"]){

Так что же такое версия Snook с картой key => value, спрашивающей, что это правильно?Мое лучшее предположение - «если ключ под именем значения переменной fruit на этой карте возвращает true?»

Ответы [ 2 ]

4 голосов
/ 29 августа 2011

x in y возвращает true, если объект y имеет свойство с именем x (так что да, ваше предположение верно).

Массивы также являются объектами,Свойства массива - это индексы, которые являются числовыми .Это работает:

if(0 in ["apple", "pear", "orange"])

, поскольку массив имеет элемент с индексом 0.Этот массив похож (но не тот же!) На этот объект:

{0: "apple", 1: "pear", 2:"orange"}

(конечно, массив имеет дополнительные свойства, такие как length, push,slice и т. Д.)

В вашем примере объекта ({"apple":"", "pear":"", "orange":""}), apple, pear и т. Д. Это свойства объекта, а не значения свойств.

Как узнать, содержится ли элемент в массиве, описано в Как проверить, содержит ли массив объект в JavaScript? .


†: Строго говорякаждое свойство является строкой, поэтому даже если вы используете числа (как в случае с массивами), они преобразуются в строки.

2 голосов
/ 29 августа 2011

Чтобы проверить, находится ли значение в массиве, используйте indexOf:

if (["apple", "pear", "orange"].indexOf(fruit) != -1){

Примечание: IE <9 не поддерживает <code>indexOf для массивов, но вы можете добавить поддержку легко .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...