Как найти, что у меня за ошибка Javascript?

#javascript #node.js

#javascript #node.js

Вопрос:

Быстрый и глупый вопрос, который сбил меня с толку.

Какая ошибка возникает, если я использую оператор присваивания вместо оператора сравнения? Мне нужно проверить, равно ли значение переменной counter 5.

Код:

 if (counter = 5) { /* ==SOME CODE==*/}
  

против

 if (counter == 5) { /* ==SOME CODE==*/}
  

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

1. условием будет значение после присвоения, ошибки не возникнет, если вы присвоите counter значение false или null, то блок не будет работать, в противном случае блок будет.

2. используя первый приведенный выше код, счетчик будет установлен на 5 и будет запущен НЕКОТОРЫЙ КОД …. ошибки не будет … во втором коде НЕКОТОРЫЙ КОД будет выполняться, если счетчик == 5 (или «5»)

3. Значит, второй код будет ошибкой времени выполнения?

4. Также, на всякий случай, используйте === . Это также гарантирует, что ваши типы совпадают.

5. Ошибка возникнет только в том случае, counter если она объявлена как const .

Ответ №1:

Самый простой способ устранить эту проблему — изменить порядок сравнения на обратный.

Вместо:

if (someVar == 5)

Используйте:

if (5 == someVar)

Таким образом, если вы все перепутаете, вы получите ошибку присвоения, поскольку вы не можете присвоить другое значение числу 5. Вы можете присвоить другое значение объекту number, который содержит число 5, но вы не можете изменить само число 5. 😉

Ответ №2:

Какого рода ошибка возникает, если я использую оператор присваивания вместо оператора сравнения?

В вашем примере я предполагаю, что браузер не выдаст никаких ошибок. Я тестировал https://validatejavascript.com/ с помощью этого кода:

 let counter = 3;

if (counter = 5) {
  alert('Will this ever show or always?');
}
  

Линтер может выдавать предупреждение — для exmaple

  • validatejavascript.com бросил: 3:5 error Unexpected assignment within an 'if' statement. (no-cond-assign) и
  • jshint.com выбросил: Expected a conditional expression and instead saw an assignment.

И на основе вашего комментария:

Но мне нужно проверить, равно ли значение переменной counter 5.

Для присвоения значения переменной используется простой оператор присваивания (=).

То, что вы ищете, — это операторы для сравнения равенства и одинаковости

JavaScript предоставляет три разные операции сравнения значений:

 === - Strict Equality Comparison ("strict equality", "identity", "triple equals")
== - Abstract Equality Comparison ("loose equality", "double equals")
Object.is provides SameValue (new in ES2015).
  

Какую операцию вы выберете, зависит от того, какой тип сравнения вы проводите
ищу, чтобы выполнить. Кратко:

  1. double equals (==) выполнит преобразование типов при сравнении двух параметров и обработает NaN, -0 и 0 специально для соответствия стандарту IEEE 754 (таким образом, NaN != NaN и -0 == 0);

  2. тройное равенство (===) выполнит то же сравнение, что и двойное равенство (включая специальную обработку для NaN, -0 и 0), но без преобразования типов; если типы отличаются, возвращается false.

  3. Object.is не выполняет преобразования типов и специальной обработки для NaN, -0 и 0 (придавая ему то же поведение, что и ===, за исключением этих специальных числовых значений).

Обратите внимание, что различие между ними всеми связано с их обработкой примитивов; ни один из них не сравнивает, являются ли параметры концептуально схожими по структуре. Для любых непримитивных объектов x и y, которые имеют одинаковую структуру, но сами являются различными объектами, все приведенные выше формы будут иметь значение false.