Почему это плохая идея позволить их в JavaScript ==! =, ++,-

Я проверял JSLint, и некоторые правила возбудили мой интерес. Особенно это:

Запретите == и! =

Запретите ++ и--

Почему это - плохая идея запретить их? Я понимаю первую часть, в основном она хочет, чтобы я сделал === вместо ==. Я не понимаю почему все же. Я понимаю различие между этими двумя, я просто хочу знать, почему это - плохая практика. Несколько раз я действительно хочу сделать == например так, чтобы это оценило бы верный для undefined == null

Второй, хорошо я не понимаю вообще. Это хочет, чтобы я сделал myInt + = 1 вместо myInt ++?

Спасибо!

15
задан 7wp 1 November 2010 в 17:22
поделиться

7 ответов

Дуглас Крокфорд (парень, который написал JSLint) объясняет себя в этом видео:

http://www.youtube.com/watch?v=hQVTIJBZook#t=14m45s

но в основном (как уже упоминали все) это из-за принуждения типа.

Стоит посмотреть видео воз, если честно - очень интересно и полезно.

4
ответ дан 1 December 2019 в 01:53
поделиться

Поведение стандартных операторов равенства (== и! =) Зависит от версии JavaScript. Это одна из причин, по которой их не используют.

Другая причина заключается в том, что знак = имеет тенденцию быть очень расплывчатым.

См. https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Comparison_Operators

1
ответ дан 1 December 2019 в 01:53
поделиться

Я понимаю == . (исключение undefined == null )

("0" == false) === true
("0" === false) === false

Я никогда не понимал ++ и - . Мне не нравится использовать i + = 1 во всем моем коде (это медленнее, чем ++ i ).

0
ответ дан 1 December 2019 в 01:53
поделиться

У Дуга Крокфорда есть свои представления о том, что такое «хорошее» и «плохое» в Javascript. Соответственно, JSLint реализует эти проверки, но делает их необязательными, если вы не полностью с ним согласны.

Запрещение == помогает предотвратить ошибки, когда вы на самом деле имели в виду === . Конечно, это предполагает, что вы никогда не захотите использовать == .

Запрещение ++ и - - это стиль, некоторые люди считают, что их труднее читать, чем + = 1 и - = 1 .

10
ответ дан 1 December 2019 в 01:53
поделиться

Операторы == и ! = неявно выполняют преобразование операторов, если необходимо, а операторы === и ! == - нет. Например, выражение 4 == '4' будет истинным, а выражение 4 === '4' будет ложным.

Желательно, чтобы вы знали типы данных, с которыми имеете дело, чтобы вы могли правильно сравнивать код.

Операторы ++ и - не вызывают никаких проблем, если они используются в операторе отдельно, но они часто используются для создания оператора, который делает больше, чем одна вещь не столь очевидным образом, например:

arr[++idx] = 42;

что было бы яснее, как:

idx += 1;
arr[idx] = 42;
2
ответ дан 1 December 2019 в 01:53
поделиться

Из инструкции:

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

и

Операторы ++ (инкремент) и -- (декремент), как известно, способствуют созданию плохого кода, поощряя чрезмерную хитрость. Они уступают только ошибочной архитектуре в создании условий для вирусов и других угроз безопасности. Существует опция plusplus, запрещающая использование этих операторов.

3
ответ дан 1 December 2019 в 01:53
поделиться

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

Основная причина, по которой Крокфорд хочет избежать ==, заключается в том, что правила сравнения в зависимости от типов операндов могут сделать этот оператор непереходным, например, если:

A == B AND
B == C

Не гарантирует, что:

A == C

Реальный пример:

'0' == 0; // true
 0 == '';   // true
'0' == ''; // false

Строгий оператор === не является действительно необходимым, когда вы сравниваете значения одного типа, например:

 if (typeof foo == "function") { }

Мы сравниваем результат оператора typeof, который всегда является строкой, со строковым литералом. ..

Другой пример, когда вы сравниваете что-то с null, == также сравнивает с undefined, например:

if (something == null) {}

VS

if (something === null || typeof something === "undefined") {}

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

Изучение того, как работает оператор ==, поможет вам мудро решить, какой из них использовать.

Рекомендуемые статьи:

12
ответ дан 1 December 2019 в 01:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: