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