Почему этот код работает правильно при слабом равенстве, чем при строгом равенстве? - PullRequest
0 голосов
/ 12 апреля 2020

Я пытался закодировать фрагменты кода как со строгим, так и со свободным равенством, чтобы подсчитать общее количество истинных значений в данном массиве.

Код работает правильно со свободным равенством

let array = [0, '0', true, 100, false, NaN];

countTruthy(array);

function countTruthy(array){
    let count = 0 ;
    
    for (let element of array){
        if (element == (null || undefined || NaN || false || 0 || '')){ //comparing with loose equality
            continue;
        }
        console.log(element);
        count++
    }
    console.log (`The total truthy in the array is : ${count}`);
}

Пока код дает неверный счет со строгим равенством.

let array = [0, '0', true, 100, false, NaN];

countTruthy(array);

function countTruthy(array){
    let count = 0 ;
    
    for (let element of array){
        if (element === (null || undefined || NaN || false || 0 || '')){//Using the strict equality
            continue;
        }
        console.log(element);
        count++
    }
    console.log (`The total truthy in the array is : ${count}`);
}

Я тоже попробовал

console.log(undefined === undefined);

Почему я получаю неправильный счет со строгим равенством, а правильный счет со свободным равенством?

Я также знаю, что существует эффективный способ написания того же кода , Поэтому, пожалуйста, дайте предложения только по вышеуказанным вопросам, с которыми я сталкиваюсь.

Ответы [ 2 ]

2 голосов
/ 12 апреля 2020

Когда вы используете цепочку || s, все выражение будет оцениваться до первого истинного значения, если оно есть, в противном случае оно будет оцениваться до конечного (фальсифицированного) значения. Так что

(null || undefined || NaN || false || 0 || '')

эквивалентно

('')

При строгом равенстве ни один из элементов массива не является пустой строкой, поэтому все проходят тест.

При свободном равенство, только 0 и ложь == для пустой строки.

console.log(
  0 == '',
  false == ''
);

С Сравнение абстрактного равенства :

Для 0 == '': когда число сравнивается со строкой справа, строка преобразуется в число, и 0 == 0 равно true

Если Type (x) равен Number, а Type (y) равен String, вернуть результат сравнения x == ToNumber (y).

Для false == '': Когда логическое значение сравнивается со строкой справа, логическое значение сначала преобразуется в число:

Если тип (x) является логическим, вернуть результат сравнения ToNumber (x) == y.

Затем строка преобразуется в число:

Если Type (x) равен Number, а Type (y) равен String, вернуть результат сравнения x == ToNumber (y).

и 0 == 0 равно true .

1 голос
/ 12 апреля 2020

Я просто хотел бы добавить, что ваш код на самом деле не правильно рассчитывает истинные значения - в вашем массиве есть 3 истинных значения («0», true, 100). Проблема возникает из приравнивания NaN как в свободном, так и в строгом равенстве. NaN всегда ложно по сравнению с чем-либо, даже:

NaN === NaN; //false
NaN == NaN; //false

Вот почему ваш код считает 4 значения вместо 3, используя свободное равенство. Лучший способ проверить, является ли значение истинным - просто преобразовать Javascript в логическое значение:

function countTruthy(array){
let count = 0 ;

for (let element of array){
    if (!element)
        {
        continue;
        }
    count++;
    }
return  count; 

}

...