почему проверка равенства между тремя строками не работает, а между тремя числами работает? - PullRequest
1 голос
/ 22 октября 2019

Я проверил равенство между тремя числами в JavaScript, и это работает. как:

1 == 1 == 1 //true
2 == 3 == 4 //false
2 == 3 == 3 //false

Но когда я пробую эту проверку между тремя строками, она не работает:

'some string' == 'some string' == 'some string' //false
'a' == 'a' == 'a' //false

Кто-нибудь знает, почему это происходит?
Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 22 октября 2019

Поскольку

'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

Вывод: всегда используйте ===. Если вы используете ==, вы столкнетесь со странным поведением.

1 голос
/ 22 октября 2019

1 == 1 == 1 можно интерпретировать как (1 == 1 (true) == 1), что верно. Но 'a' == 'a' == 'a' будет интерпретироваться как ('a' == 'a' (true) == 'a'), что будет ложным. значение true не равно 'a'.

...