#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 в качестве авторитетного источника, пока не научитесь использовать свои инструменты. Я говорю это не для того, чтобы быть злым, а чтобы помочь вам. 🙂