2012-11-25 65 views
2

JavaScript有不同的平等comparison operators什么时候是(true == x)=== !! x false?

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

它也有一个logical NOT!和我倾向于认为使用双逻辑NOT,!!x的,如基本上与true == x一样。

但是我知道这并非总是如此,例如, x = [],因为[]truthy对于!,但是对于==有错误

那么,其中x s会(true == x) === !!x给出假?或者,什么是falsy==但不是!!(反之亦然)?

+1

松散的平等与真实无关。 – SLaks

+1

多数民众赞成深深!!!!! –

+1

'“a”== true'为false –

回答

8

“所以,这x s就(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 

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

要了解==如何处理它的操作数,你真的需要研究一下这个算法。

+0

谢谢,我基本上在寻找[ToBoolean](http://es5.github.com/#x9.2)与[Abstract Equal Comparison Comparison Algorithm](http://es5.github.com/ #x11.9.3),现在我可以阅读它们是如何定义的。 –

+1

@PaulS .:不客气,不幸的是,没有简单的规则。归根结底是理解算法,并且通常通过限制对'=='的使用来简化你的生活。我不想完全排除它,因为至少有一种情况下规则很简单并且提供了更简洁的代码。 –

+0

只是几个更具体的案例是: (true == [])=== !! []/* false */ (true == {})=== !! {}/* false */ –

-1

松散的平等与真实无关。

松散平等的规则基本上涉及比较每个对象的.valueOf()函数的结果。
欲了解更多详情,请参阅spec

相关问题