Поскольку
'some string' == 'some string' == 'some string'
оценивает операторы ==
в порядке слева направо. Это эквивалентно
('some string' == 'some string') == 'some string'
, что является
true == 'some string'
, что ложно, потому что, когда логическое значение сравнивается с чем-то другим, согласно spec :
Если тип (x) - логическое значение, вернуть результат сравнения! ToNumber (x) == y.
Когда правая часть является строкой, она разрешается в
1 == 'some string'
, которая затем запускается
Если Type (x) равен Number, а Type (y) равен String, вернуть результат сравнения x ==! ToNumber (y).
, но ToNumber('some string')
равно NaN
console.log(Number('some string'));
, поэтому сравнение оценивается как false
.
С другой стороны, с 1 == 1 == 1
, следуя тому же процессу:
1 == 1 == 1
(1 == 1) == 1
true == 1
// Rule 8, turn left side into a number:
1 == 1
true
Вывод: всегда используйте ===
. Если вы используете ==
, вы столкнетесь со странным поведением.