2

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

  • 平等的==
  • 严格相等===

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

但是我知道情况并非总是如此,例如x = []因为[]istruthy for但falsy for!==

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

4

2 回答 2

8

“那么,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

我说“粗略”是因为这肯定不会捕获上面链接的算法的所有细节,并且对于提供给操作数的所有值也不相同。

要了解如何==处理其操作数,您确实需要稍微研究一下算法。

于 2012-11-25T17:03:39.020 回答
-1

松散的平等与真实性无关。

松散相等的规则基本上涉及比较.valueOf()每个对象的函数结果。
有关更多详细信息,请参阅规范

于 2012-11-25T17:01:08.787 回答