Почему же!1= = " 1 " равно true и!2=="2" равно false?



как говорится в названии, почему:



> !!1=="1"


равной



True


и



> !!2=="2"


равен:



False


точно так же, почему > "1"==true равной true и > "2"==true равной false



Я сбит с толку. Это просто ошибки в JS или что здесь происходит?

432   5  

5 ответов:

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

Примечание: истинность различных объектов была объяснена в ответ шахты.

Первым Делом

!!1 == "1"

!1 оценивается в false С 1 является истина. Отрицая снова мы получаем true. Так что выражение становится

true == "1"

теперь правила принуждения вступают в силу, как вы использовали == оператор, который оценивает в Алгоритм Сравнения Абстрактного Равенства определено в спецификации ECMAScript 5.1,

6. Если Type(x) и Boolean, возвращает результат сравнения ToNumber(x) == y.

и true будет преобразовано в число, которое равно 1 согласно ToNumber алгоритм для булевых значений. Сейчас выражение будет

1 == "1"

теперь

4. Если Type(x) и Number и Type(y) и String, вернуть результат сравнения x == ToNumber(y).

и "1" будет преобразовано в число, и это даст 1, согласно ToNumber алгоритм. Вот почему он показывает true в первом случае.

Второй Случай

применяются те же правила здесь.

!!2 == "2"

становится

true == "2"

затем

1 == "2"

что будет

1 == 2

это не true, вот почему второй случай печатает false.

tldr; это связано с [ToNumber] преобразования в оператора.

первым шагом является упрощение выражения. Так как !!x=="x" обрабатывается как (!!x)=="x" и !!a_truthy_expression -> true, фактическое соответствующее выражение для равенства

!!1=="2" -> true=="1" -> Boolean==String
!!2=="2" -> true=="2" -> Boolean==String

Итак, глядя на правила для 11.9.3 Абстрактный Алгоритм Сравнения и следующие вместе с приложением дает

Правило 6 - Если Тип(x) является логическим, возвращает результат сравнения ToNumber (x) == y.

что приводит к Number==String или 1=="1" и 1=="2", соответственно1. Тогда правило

Правило 7-Если тип (x) - это число, а тип (y) - строка, возвращает результат сравнения x == ToNumber (y).

применяется, что приводит к Number==Number или 1==1 и 1==2, соответственно1; последний явно ложный.

Правило 1 - Если тип(X) является таким же, как тип(г), а затем [по В. раздел III.] Если X имеет то же значение числа как y, возвращаем true [еще возвращать false].

(тот же алгоритм объясняет String==Boolean случай, когда применяются дополняющие правила.)


1чтобы увидеть, что правило [ToNumber] применяется, рассмотрим:

+false -> 0
+true  -> 1
+"1"   -> 1
+"2"   -> 2

это проблема оператора приоритета.

The ! оператор является унарным оператором. Это означает, что левая сторона должна быть выражением или раздел логического анализу. Смотрите Javascript MDN.

!!1==1 is not necessary !!(1==1)
!!2==2 is not necessary !!(2==2)

Я думаю, что эти выражения должны быть согласованы, если оператор equal имеет больший приоритет, чем ! оператор. Но если учесть обратное, то оценивая первые отрицания мы имеем:

!!1 == 1
!1 -> false
!!1 -> true
!!1 == 1 

и с два

!!2==2
!2 -> false
!!2 -> true
(!!2) == 2 -> false

это потому что! оператор имеет приоритет над = = operator

посмотреть Предпочтение Оператора Mozilla

!!1 равно true, а "1" равно true ("0" равно false, как и любая другая строка). Так что !!1 == "1" значение true == true, что, конечно, возвращает true.

!!2 также равно true. Как я уже упоминал ранее, "2" не является "1", так что это ложь. Поэтому у нас есть true == false, который, конечно, возвращает false.

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

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

потому что "1" может считаться "истинным", когда вы проверяете равенство, а не идентичность, но "2" - не может.

Comments

    Ничего не найдено.