тройное равенство дает неправильный вывод при сравнении строк, но в случае целого числа это дает правильный вывод - PullRequest
0 голосов
/ 26 июня 2019

У меня есть массив строк типа

var a = ['a','a','a'];

Когда я делаю сравнение как a[0]==a[1]==a[2], это дает мне результат как false но когда я изменяю значение массива на ['1','1','1'] и делаю то же сравнение, что и выше, результат будет true.

Опять же, когда я изменяю ввод на ['9','9','9'], то приведенное выше сравнение дает мне результат как false.

Кто-нибудь может сказать мне причину такого поведения в javascript?

Ответы [ 5 ]

1 голос
/ 26 июня 2019

Что вам нужно, это

a[0]==a[1] && a[0]==a[2]

В вашем случае, когда вы сравниваете ['1', '1', '1'], происходит

a[0] == a[1]  // true
true == a[2]  // true as true == '1'
0 голосов
/ 26 июня 2019

Если вы видите ассоциативность оператора ==, это left-to-right.Таким образом, в вашем случае

когда var a = ['a','a','a']; a[0]==a[1]==a[2] это сначала оценивает a[0]==a[1], а затем результат с a[3] означает true == 'a', который возвращает false.

В случае, когда var a = ['1','1','1'];так что по ассоциативности это оценивается слева направо в выражении a[0]==a[1]==a[2] результаты '1' == '1' сначала, затем true == '1' во втором, что дает true наконец.

В случае, когда var a = ['9','9','9']; первое '9' == '9' затем true == '9', что в конечном итоге оценивается как ложное.Надеюсь, это поможет.

0 голосов
/ 26 июня 2019

Это ожидаемый вывод

// Case 1
var a = ['a','a','a'];

The output of 

a[0] == a[1] --> true

Next Comparison

true == a[2] --> false // true != 'a';

// Case 2

var a = ['1','1','1'] ;

a[0] == a[1] --> true

true == a[2] --> true // true == "1"

Однако в случае 2, если вы используете оператор strict equality, результат будет ложным.

var a = ['1','1','1'] ;

// strict equality operator
console.log(a[0]===a[1]===a[2]);

// without strict equality operator
console.log(a[0]==a[1]==a[2]);
0 голосов
/ 26 июня 2019

Случается так, что он выполняет это так:

 ((a[0]==a[1])==a[2]):

1.

(a[0] == a[1]) => true

2.

(true == a[2]) => false

Потому что: 1 == true,массив [1,1,1] возвращает true

0 голосов
/ 26 июня 2019

Это проще понять, если вы тестируете внутреннее значение direct: 0==0==0 понимается как (0==0)==0, поэтому 0==0 равно true, что проверяется следующим образом (true)==0, 0 интерпретируется как false и true==false равно false.

Для других сравнений первая часть такая же, но 1 или 9 интерпретируются как true.

...