Boolan(!x)和布尔值(x == 0)之间的区别?

时间:2010-11-25 19:34:59

标签: javascript

代码段1:

if ( !x ) { /* do stuff */ }

Code-snippet 2:

if ( x == 0 ) { /* do stuff */ }

这两个代码段的x值是多少?

我在问,因为虽然我在规范中阅读了==的章节,但我仍然觉得很难处理上面的情况(它与ToBoolean强制相结合)。

顺便说一句,我想知道这只是为了了解它(我想要理解这种语言),所以不要费心告诉我===或问我x是什么。

更新: 我更正了第一个片段。我的意思是!x

8 个答案:

答案 0 :(得分:5)

  • [] == 0是真的; ![]是假的
  • null == 0是假的; !null是真的
  • NaN == 0是假的; !NaN是真的
  • undefined == 0是假的; !undefined是真的

!x会检查x是否为“假” x == 0会检查x是否“等同于”0

这两个术语都是由Javascript规范定义的。

答案 1 :(得分:2)

以下内容将为您提供第一个true和第二个代码段的false

  • NaN
  • null
  • undefined

这些会为您提供第一个false和第二个代码段的true

  • []
  • “0”以及使用Number(x)转换为0的任何其他字符串,例如“00”,“000”,“+ 0”和“-0”(我现在称之为“noughty strings” )
  • 包含0nullundefined或空字符串或空字符串的单个元素的数组。

对于其他一切,你会得到两个片段相同的结果,尽管可能还有一两件我没想过的案例。

答案 2 :(得分:2)

这是一个关于非空字符串的有趣字符串,它只包含空格字符:

!!"   ";         // true
"   " == true;   // false

这是因为当您进行==比较,并且其中一个值是数字或布尔值时,会尝试将另一个值转换为数字。

获得不同结果的原因是只有空格字符的字符串会转换为数字0(或falsey),而只有通过!!转换为布尔值的空格的字符串被视为一个非空字符串,因此true

所以:

var x = "   ";

alert( !x );      // false
alert( x == 0 );  // true

修改

可能需要记住的关键是,在将数字或布尔值与非数字类型进行比较时,==会尽可能使用 toNumber 转换,而!使用 toBoolean 转换。它们并不总是一样的。

使用!!很容易看到 toBoolean 转换的结果。如:

alert( !![] );   // true

但是在使用==时,您无法真正看到 toNumber 转换的结果。

但是,您可以使用一元+查看 toNumber 转换的结果。如:

alert( +[] );   // 0

我很确定在Array的情况下发生的事情是它首先得到toString调用。因此:

// ---------------------toString result-------toNumber result (from string) 
alert( +[] );       //       ""                   0    
alert( +[""] );     //       ""                   0    
alert( +["    "] ); //       "     "              0    
alert( +[0] );      //       "0"                  0    
alert( +["0"] );    //       "0"                  0    
alert( +["3"] );    //       "3"                  3    
alert( +[3,4] );    //       "3,4"               NaN  

答案 3 :(得分:1)

简短回答:两者几乎总是相同但不是100%相同。

一个例子是(!'0')这是假的,而('0' == 0)是真的

<强>详细信息:

来自:http://www.joeyjavas.com/2007/08/04/javascript-true-false-checking-for-boolean-values/

  

在JavaScript中检查值是true还是false很简单。除了:

之外,所有值都评估为true
0
-0
null
undefined
NaN
empty string
false

因此,(!x)对于x的所有上述值都是正确的,只有那些。{/ p>

对于(x == 0),对于x的任何值都是如此 - when converted according to "==" conversion rules - 与数字相比转换为0(例如,布尔false值) 。将true与==0进行比较的其他示例是从valueOf()方法生成0的对象,或字符串'0'或空数组([]

答案 4 :(得分:0)

两者之间的区别在于

if ( x ) { ... }

测试x是否为“truthy”

if ( x == 0 ) { ... }

在x和0之间键入强制。

我认为你的意思是

if (x == 0) vs if (!x)

主要区别在于x的类型强制与数字的比较与检查x是否为假。

显然NaN本身永远不会等于0,因为它不是数字。 undefined也会强制执行NaN,以免被== 0抓住。我无法解释为什么null 0未被Number(null) == 0抓住,因为{{1}}

答案 5 :(得分:0)

x非零时,或者求值为对象(而不是nullundefined),或者是非空字符串时,第一个测试将成功。因此,如果x为0,则条件失败,但如果为“0”则成功。

x可转换为0时,第二个测试将成功。这意味着它不能为null,未定义或传递此测试的对象。它可能是“0”或“”。

换句话说,这些条件不是对立的。例如,值“0”将通过两个测试。

答案 6 :(得分:0)

如果x为“falsy”值,则会执行代码片段1。在Javascript中,这意味着0,-0,null,undefined,NaN,“”或false。但是,代码片段2仅在x为零时执行。与第一个条件不同,这不包括其他“假”值。

答案 7 :(得分:0)

经过一些查找后,必须更换我的芒果。 没有简单的逻辑,隐式相等操作遵循算法。 http://interglacial.com/javascript_spec/a-11.html#a-11.9.3

我无法总结它比算法描述的更好,它会变得更加混乱。

所以(!x)相当于(typeof x === false)又名(不是真实的)
(x == 0)通过算法进行比较。