为什么这段代码在松散相等的情况下比在严格相等的情况下运行正确?

Why does this code runs correctly with loose equality than with strict equality?

我尝试使用严格相等和松散相等来编写代码片段,以计算给定数组中 truthy 值的总数。

代码在松散相等的情况下正确运行

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);

为什么我在严格相等时得到错误计数而在松散相等时得到正确计数?

我也知道有一种有效的方法可以编写相同的代码。所以请大家针对我目前面临的以上问题给出建议

当您使用 || 链时,整个表达式将求值为第一个真值(如果有的话)- 否则,它将求值为最终(假)值。所以

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

等同于

('')

严格相等,none个数组项为空串,全部通过

对于松散相等,只有 0 和 false == 到空字符串。

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

Abstract Equality Comparison:

对于0 == '':当数字与右边的字符串进行比较时,字符串被转换为数字,0 == 0为真

  1. If Type(x) is Number and Type(y) is String, return the result of the comparison x == ToNumber(y).

对于false == '':当一个布尔值与右边的字符串比较时,布尔值先转换为数字:

  1. If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.

然后把字符串转成数字:

  1. If Type(x) is Number and Type(y) is String, return the result of the comparison x == ToNumber(y).

0 == 0是真的。

我只想补充一点,您的代码实际上并未正确计算真值 - 您的数组中有 3 个真值(“0”、真值、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; 

}