Javascript 什么时候是(真==x)==!!x错误?
JavaScript具有不同的平等性Javascript 什么时候是(真==x)==!!x错误?,javascript,Javascript,JavaScript具有不同的平等性 相等== 严格相等=== 它还有一个
- 相等
==
- 严格相等
===
我倾向于使用双逻辑NOT,!!x
,与true==x
基本相同
但是我知道情况并非总是如此,例如x=[]
,因为[]
对来说是真实的代码>但是对于==
来说是错误的
因此,x
s将(true==x)==!!x
是否给出false?或者,什么是falsy,而不是代码>(或反之亦然)松散的相等性与真实性无关
松散相等的规则基本上涉及比较每个对象的.valueOf()函数的结果。
有关更多详细信息,请参阅
“那么,对于哪个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
我之所以说“粗略”,是因为这肯定不能捕获上面链接的算法的所有细节,而且提供给操作数的所有值也不相同
要了解==
如何处理其操作数,您确实需要稍微研究一下算法。松散相等与真实性无关。将布尔值与==
进行比较通常是个坏主意,因此您基本上不应该做x==true
。如果“x”既不是true
也不是false
(即布尔值),则true
将转换为一个数字(1),并从中进行比较。谢谢,我基本上是在寻找何时不匹配,现在我可以阅读这两个数字的定义了。@PaulS:不客气,是的,不幸的是,没有简单的规则。归根结底,就是要理解算法,并通过限制使用=
使您的生活更轻松。我不想把它完全排除在外,因为至少有一种情况下规则很简单,并且提供了更干净的代码。还有一些情况需要特别说明:(true=[])===!![]/*假/(真=={})===!!{}/false*/