JavaScript 有不同的相等比较运算符
- 平等的
==
- 严格相等
===
它也有一个逻辑非 !
,我倾向于考虑使用一个双逻辑非,,!!x
基本上与true == x
.
但是我知道情况并非总是如此,例如x = []
因为[]
istruthy for但falsy for。!
==
那么,对于哪个x
s 会(true == x) === !!x
给出错误?或者,什么是虚假的,==
但不是!!
(反之亦然)?
“那么,
x
s 会(true == x) === !!x
为哪一个false
?”
任何x
其布尔转换与其通过抽象相等比较算法进行的转换不同的地方。
一个例子是一个只有空格的字符串:
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
我说“粗略”是因为这肯定不会捕获上面链接的算法的所有细节,并且对于提供给操作数的所有值也不相同。
要了解如何==
处理其操作数,您确实需要稍微研究一下算法。
松散的平等与真实性无关。
松散相等的规则基本上涉及比较.valueOf()
每个对象的函数结果。
有关更多详细信息,请参阅规范。