JavaScript具有不同的等式comparison operators
==
===
它还有logical NOT !
,我倾向于考虑使用双逻辑NOT !!x
,与true == x
基本相同。
然而我知道情况并非总是如此,例如x = []
{1}} []
truthy !
但{em> falsy ==
。
那么x
(true == x) === !!x
会==
给出错误?或者,!!
而不是{{1}} falsy 是什么(反之亦然)?
答案 0 :(得分:8)
“那么
x
会(true == x) === !!x
给false
?”
任何x
,其布尔转换与Abstract Equality Comparison Algorithm的转换不同。
一个例子是只有空格的字符串:
var x = " ";
它的布尔转换为true
(与任何非空字符串的情况一样),但其==
比较为false
,因为只有空格会转换为数字0
,而true
值将转换为数字1
,且这些值不相等。
x == true; // false
!!x; // true
或显示==
正在比较的最终值:
Number(true) == Number(x);
// 1 == 0
1 == 0; // false
并显示!!x
的结果,它将等同于:
Boolean(x); // true
因此您的原始表达可以 粗略 被视为以下内容:
var x = " ";
(Number(true) == Number(x)) === Boolean(x);
// ( 1 == 0 ) === true
// ( false ) === true
false === true; // false
我说“粗略”,因为这肯定不会捕获上面链接的算法的所有细节,并且对于提供给操作数的所有值都不会相同。
要了解==
如何处理其操作数,你真的需要稍微研究一下算法。
答案 1 :(得分:-1)
宽松的平等与真实无关。
松散平等的规则主要涉及比较每个对象的.valueOf()
函数的结果
有关详细信息,请参阅spec。