Оператор сравнения equals дает плохой результат после четырехкратного использования подряд - PullRequest
0 голосов
/ 07 марта 2020

У меня есть класс Square с методом получения, чтобы определить, является ли квадрат действительным или нет. Если у моего квадрата есть стороны 1, мой код вернет true. Если у моего квадрата 4 стороны по 5, он возвращает ложь. Может кто-нибудь объяснить, что происходит?

Как видите, я получил доступ к этому в браузере и получил следующие результаты:

enter image description here

class Square extends Polygon { 
get isValid() {
    const testArray = Object.values(this); 


    return (testArray[0] == testArray[1] == testArray[2] == testArray[3]) ? true : false

} 

1 Ответ

2 голосов
/ 07 марта 2020

Выражение

testArray[0] == testArray[1] == testArray[2] == testArray[3]

выполняет == 3 раза, слева направо.

((testArray[0] == testArray[1]) == testArray[2]) == testArray[3]

Первый раз, когда элементы массива равны, первый оценивается как true:

((testArray[0] == testArray[1]) == testArray[2]) == testArray[3]
(true == testArray[2]) == testArray[3]

Если элементы являются числами, при следующем сравнении только вернется true, если элемент равен 1:

console.log(true == 1);
console.log(true == 2);
console.log(true == 5);

Это связано с тем, что при использовании сравнения абстрактного равенства ==, когда логическое значение сравнивается с числом, логическое значение сначала приводится к числу, а число c значение для true равно 1.

console.log(Number(true));

Третье сравнение имеет ту же проблему.

Чтобы исправить это, вместо этого возьмите первое значение (или любое значение) и используйте .every:

const oneVal = testArray[0];
return testArray.every(val => val === oneVal);
...