JavaScript 有不同的相等比较运算符
- 平等的
== - 严格相等
===
它也有一个逻辑非 !,我倾向于考虑使用一个双逻辑非,,!!x基本上与true == x.
但是我知道情况并非总是如此,例如x = []因为[]istruthy for但falsy for。!==
那么,对于哪个xs 会(true == x) === !!x给出错误?或者,什么是虚假的,==但不是!!(反之亦然)?
“那么,
xs 会(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()每个对象的函数结果。
有关更多详细信息,请参阅规范。