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

Pau*_* S. 2 javascript

JavaScript有不同的相等比较运算符

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

它也有一个逻辑NOT !,我倾向于考虑使用双逻辑NOT,!!x基本上相同true == x.

但是我知道情况并非总是这样,例如x = []因为它[]真实!而且是虚假==.

那么,哪个xs会(true == x) === !!x给出错误?或者,什么是假的,==但不是!!(反之亦然)?

I H*_*azy 8

"那么,xs会(true == x) === !!x给出false什么?"

x其布尔转换与抽象等效比较算法的转换不同的任何地方.


一个例子是只有空格的字符串:

var x = " ";
Run Code Online (Sandbox Code Playgroud)

它的布尔转换true (就像任何非空字符串的情况一样),但它的==比较是false因为只有空格的字符串将转换为数字0,并且该true值将转换为数字1,而这些值不是等于.

x == true; // false
!!x;       // true
Run Code Online (Sandbox Code Playgroud)

或者显示==比较的最终值:

Number(true) == Number(x);
 //      1   ==        0

1 == 0; // false
Run Code Online (Sandbox Code Playgroud)

并显示结果!!x,它将等同于:

Boolean(x);  // true
Run Code Online (Sandbox Code Playgroud)

所以你的原始表达可以粗略地看作如下:

   var x = " ";

   (Number(true) == Number(x)) === Boolean(x);
// (         1   ==        0 ) ===        true
//                   ( false ) ===        true

   false === true; // false
Run Code Online (Sandbox Code Playgroud)

我说"粗略",因为这肯定不会捕获上面链接的算法的所有细节,并且对于提供给操作数的所有值都不一样.

要理解如何==对待它的操作数,你真的需要稍微研究一下算法.