2013-11-13 3 views
31

В консоли браузера введите 1===1 в true. Ввод 1===1===1 оценивается в false.Почему 1 === 1 === 1 false?

Я предполагаю, что это из-за способа оценивается утверждение:

1 === 1 === 1

становится

(1 === 1) === 1

, который оценивает в

true === 1

который false.

Это правильно? Если нет, какова реальная причина такого поведения?

+5

Собственно операция разобранные слева направо. Итак, '1 === 1 === 1' оценивается как' (1 === 1) === 1', а не '1 === (1 === 1)'. В этом случае, очевидно, это не имеет никакого значения. –

+0

Спасибо - я обновил ответ, чтобы отразить это :) – surfitscrollit

+0

Спасибо за все информативные ответы. Я подозревал, что это были рассуждения, но хорошо получить подтверждение. – surfitscrollit

ответ

38

Да, вы совершенно правы. Здесь у вас есть две проверки равенства, которые имеют одинаковый приоритет оператора. Сначала оценивается сначала, тогда его результат применяется к следующей проверке равенства.

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

20

Оператор === не просто проверяет равенство, но и устанавливает равенство. Поскольку целое число не является логическим, true === 1 является ложным.

Сравнить:

true == 1; // true 
true === 1; // false 

Example.

+3

Это 'истина === 1', потому что операторы равенства левоассоциативны. 'true === 1 === 1 // false' while' 1 === 1 === true // true' – Tibos

+0

@Tibos: Правильно, хотя это не меняет точку ответа. 'true == 1' по-прежнему истинно, а' true === 1' по-прежнему является ложным. – David

+1

Да, содержание ответа полностью точно, но по отношению к вопросу оно вводит в заблуждение. Спасибо за редактирование! – Tibos

2

Поведение, о котором вы говорили, верное.

Его потому, что === подразумевает соответствие по типу и стоимости. true === 1 не соответствует по типу, но true == 1 соответствует по значению.

+0

Это 'истина === 1', потому что операторы равенства лево-ассоциативны. – Tibos

+0

Извините, мой плохой. Я знаю его левый ассоциатив :) – Pratik

+5

Вы можете отредактировать свой ответ, чтобы улучшить его (или удалить, если не думаете, что можете добавить ценность потенциальному будущему читателю). – Tibos

3

Правильное поведение. Поскольку

1===1 // value is true 

но

true===1 // it's false 

Есть две причины для этого:

  1. правда это логический тип, где 1 является целым числом
  2. просто, 1 не равно верно.

так

1===1===1 // false 
+0

Пункт 2) зависит от реализации браузера. В C, например, нет «Boolean», вместо этого используются ints, а 0 как false и что-то еще как true, поэтому 1 действительно будет равным «true». Следовательно, '1 == true'. ** tl; dr ** единственное различие между 1 и истинным - это тип в некоторых реализациях. – 11684

+0

@ 11684 - Это не зависит от реализации браузера. Это зависит от правильной реализации спецификации. Это JavaScript, а не C, а 'boolean' не является числовым (хотя в соответствии с спецификацией может существовать принудительное выражение типа, если вместо' === 'использовался оператор' == '). –

+0

В C нет логического типа, и часто используются ints, поскольку 0 автоматически вычисляет false и любое другое значение int равно true. JavaScript в основном интерпретируется, поэтому такое сравнение будет выполняться браузером изначально. – 11684

-2

если 1 == 1 == 1, то это будет справедливо

+0

== изменит тип arg и === не будет – user2986342

Смежные вопросы