Javascript 什么时候是(真==x)==!!x错误?

Javascript 什么时候是(真==x)==!!x错误?,javascript,Javascript,JavaScript具有不同的平等性 相等== 严格相等=== 它还有一个

JavaScript具有不同的平等性

  • 相等
    ==
  • 严格相等
    ===
它还有一个
!!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*/