Операция сравнения - правильный синтаксис? - PullRequest
3 голосов
/ 30 марта 2011

Исходя из PHP, я понимаю разницу в использовании == verses === в операции сравнения, но с JavaScript допустимо использовать == или ===?

Я хотел проверить свой код JavaScript и нашел JSLint . Во время проверки с помощью JSLint я вижу эти типы сообщений.

Некоторые примеры:

var show = $('input[name=female]:checked').val() == "true";
  • Проблема в строке 278, символ 70: Ожидается «! ==», вместо этого он видит «! =».

и

var show = $('input[name=living]:checked').val() != "false";
  • Проблема в строке 283, символ 38: Ожидается '! ==', вместо этого он видит '! ='.

Итак, мой вопрос: будет ли текущий синтаксис == или! = Действительным / правильным или мне нужно использовать === и! ==?

РЕДАКТИРОВАТЬ: просто чтобы указать, что код работает

Ответы [ 5 ]

5 голосов
/ 30 марта 2011

В некотором смысле это правильно, но JSLint ожидает строгого сравнения, чтобы предотвратить проблемы с преобразованием типов.

Хорошей практикой является всегда использовать строгое сравнение и "нормальное" сравнение только там, где это действительно нужно / нужно (потому что вы хотите использовать преобразование типов по какой-то причине).

Из документации JSLint :

== и! =

Операторы == и != выполняют приведение типов перед сравнением.Это плохо, потому что ' \t\r\n' == 0 равно true.Это может маскировать ошибки типа.

Если вам важно только, чтобы значение было truey или falsy , используйте краткую форму.Вместо

(foo != 0)

просто скажите

(foo)

и вместо

(foo == 0)

скажите

(!foo)

Всегда используйте ===и !== операторов.

2 голосов
/ 30 марта 2011

Крокфорд и Дж.С.Линт несколько догматичны в этом вопросе, и я думаю, что это слишком предписывает.Всегда использовать === вместо == - разумное практическое правило для неопытных разработчиков JavaScript, но если вы знаете основные правила, то нет проблем с использованием ==.В частности, если два операнда гарантированно относятся к одному и тому же типу (например, при typeof сравнении, например typeof foo == "undefined"), то два оператора должны точно следовать одним и тем же шагам.

Существуеттакже разумное замечание о привычном использовании ===, устраняющее необходимость думать о том, какой оператор использовать, но, честно говоря, я предпочитаю быть вынужденным рассмотреть все возможные значения двух операндов, которые я сравниваю, и нахожу JSLint излишне нанимающим.

1 голос
/ 30 марта 2011

Зависит от ситуации.

=== часто предпочтительнее, потому что у вас не будет ложных срабатываний, которые вы, возможно, не рассмотрели (в некоторых реализациях это также может быть немного быстрее, поскольку это сравнивается с меньшими потенциальными значениями, хотя я не проверял, что , только мысль, и разница в скорости будет незначительной).

== часто удобнее покрывать многие / все случаи (если я не ошибаюсь, jQuery не передает JSLint, потому что в некоторых местах код намеренно использует == для охвата множества случаев, а не для проверки каждого из них). индивидуально).

1 голос
/ 30 марта 2011

Синтаксис == допустим, но в некоторых случаях он может привести к довольно неприятным ошибкам в больших проектах. Если у вас нет веских оснований для использования ==, вы должны по умолчанию написать JavaScript с ===, потому что он проверяет тип, как вы знаете.

Это работает в любом случае, но вы избавите себя от боли в будущем, если по умолчанию ===.

0 голосов
/ 30 марта 2011

Вы можете сделать только == и! =, Я ​​не думаю, что с этим возникнут какие-либо проблемы.

...