Почему это не приводит к ошибке?

#jquery

Вопрос:

Я видел это сегодня в коде, и я немного шокирован тем, что это не приводит к ошибке

 if($('.MyClass'))
{
  // do stuff here
}
 

Таким образом, это селектор jquery внутри оператора if. Согласно firebug, если селектор не найден, он возвращает значение null. Если он найден, он возвращает объект dom.

Итак, из того, что я могу сказать, это всегда входит в утверждение if, но я еще больше шокирован тем, что оно не ошибается.

Если бы в C# вы попытались просто указать объект или значение null в операторе if, я не думаю, что он был бы скомпилирован.

Я ожидал, что в firebug появится хотя бы ошибка.

Комментарии:

1. Каждый вызов jQuery (по крайней мере, с помощью селектора) возвращает объект jQuery. Объекты всегда оцениваются true . Не забывайте, что JavaScript динамически типизирован. И в данном конкретном случае у вас есть синтаксическая ошибка редактирования: Больше нет .

2. Я получаю ошибку в chrome: я получаю Uncaught SyntaxError: Unexpected token .

3. Точно… вы не можете начать имя переменной с .

4. Аааааннннннн… OP обновите код, аннулирующий все, что я говорил…

Ответ №1:

Это не ошибка, потому что (я, конечно, предполагаю, что вы неправильно ввели свой вопрос, и у вас есть кавычки вокруг имени вашего класса, например if($('.MyClass')) ):

 if(null){
    // Do something
}
 

Является допустимым синтаксисом в JavaScript (хотя он может делать не то, что вы от него ожидаете).

JavaScript попытается привести значение null к логическому значению. Когда это приведение происходит, JavaScript указывает, что приведение должно вернуться false .

Комментарии:

1. @охотник — Это потому, что код операции недействителен. Я предполагаю в своем ответе, что они просто забыли ввести кавычки.

2. ОП изменил свой вопрос… неважно… по крайней мере, я не сумасшедший, по крайней мере, в этом случае

Ответ №2:

Я бы больше боялся цитат:

 if($('.MyClass'))
{
  // do stuff here
}
 

Если бы это было так, то это было бы совершенно справедливо. В JavaScript (я думаю) все, что не 0 является или null или false является true , что означает, что объект jQuery будет оцениваться true , если он существует, и null (который оценивается false ), если его нет.

Комментарии:

1. Я понимаю Unexpected token '.' , что имеет смысл, потому что я не думаю, что вы можете начать имя переменной с .

2. @hunder — Я использую его в качестве селектора, который должен быть действительным. $(«.MyClass»)

3. @Tomalak Geret’kal — ах, я забыл их записать.

Ответ №3:

Код в вашем вопросе действительно приводит к синтаксической ошибке.

Возможно, вы имеете в виду

 if($('.MyClass'))
{
  // do stuff here
}
 

(обратите внимание на кавычки вокруг .MyClass )

Это работает, потому что jQuery возвращает пустой объект, если ничто не соответствует селектору. Но тем не менее это был объект.. таким образом, код в if всегда будет выполняться..

Полезным синтаксисом было бы

 if($('.MyClass').length)
{
  // do stuff here
}
 

Ответ №4:

Javascript-это не C#.

if (X) {} (где X равно null ) — это совершенно правильный синтаксис.

И это не имеет значения, потому что селектора null все равно никогда не будет. Это объект, а объекты всегда оцениваются true .

Все это говорит о том, что я ожидал бы ада и пыток, if ($(.MyClass)) потому что это не if ($('.MyClass')) так .

Комментарии:

1. @Tomalak Geret’kal — Итак, если он не находит ничего подходящего, он все равно возвращает объект, что делает его истинным? Итак, null == верно?

2. @chobo2: null не имеет к этому никакого отношения . Селектор-это объект. То, что он содержит пустую коллекцию узлов, является внутренним свойством, которое не влияет на динамический тип самого объекта. Это не похоже на указатель связанного списка C низкого уровня. 🙂

3. @chobo: Нет, он не возвращается null . Он возвращает объект. Где вы читали, что null возвращается?

4. @ Феликс Клинг — Думал, что firebug возвращал значение null, но теперь, похоже, у него есть любой пустой массив( [] ). Однако, если я сделаю это сейчас, если($(‘.MyClass’)){} я получу неопределенное значение.

5. @chobo2: Вы неправильно используете Firebug. Используйте документацию jQuery в качестве авторитетного источника, пока не научитесь использовать свои инструменты. Я говорю это не для того, чтобы быть злым, а чтобы помочь вам. 🙂