什么时候(true == x)=== !! x false?

时间:2012-11-25 16:57:36

标签: javascript

JavaScript具有不同的等式comparison operators

  • 等于==
  • 严格等于===

它还有logical NOT !,我倾向于考虑使用双逻辑NOT !!x,与true == x基本相同。

然而我知道情况并非总是如此,例如x = [] {1}} [] truthy !但{em> falsy ==

那么x (true == x) === !!x==给出错误?或者,!!而不是{{1}} falsy 是什么(反之亦然)?

2 个答案:

答案 0 :(得分:8)

  

“那么x(true == x) === !!xfalse?”

任何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