【问题标题】:JavaScript type castingJavaScript 类型转换
【发布时间】:2011-06-05 07:27:29
【问题描述】:

考虑空的 JavaScript 数组:

var a = [];
alert(a == false); // shows true
alert(!a); // shows false!

如何解释? 规则是什么?

【问题讨论】:

标签: javascript types casting


【解决方案1】:

来自http://forums.whirlpool.net.au/archive/966449

a == false

在这种情况下,左侧的类型是对象,右侧的类型是布尔的。 JavaScript首先将布尔值转换为数字,产生0。然后它将对象转换为“基元”,产生空字符串。接下来它将空字符串与@ 987654326进行比较。将空字符串转换为数字,生成0,在数字上等于右侧的0,因此整个表达式的结果为true

参见ECMAScript spec的§11.9.3为所有血腥细节。

(!a)

在这种情况下,javascript将对象转换为布尔真的,然后反转它,导致false。

【讨论】:

【解决方案2】:

! 运算符检查其操作数是否为“假”。

以下是正确的:

  • !false
  • !0
  • !null
  • !NaN
  • !undefined
  • !""

== 运算符检查松散相等性,这与虚假性无关。

具体来说,a == b 会将操作数转换为数字,然后比较数字。
包含数字的字符串转换为它们包含的数字;布尔值转换为 01
对象通过调用valueOf(如果已定义)进行转换。

因此,以下所有情况都是正确的:

  • "1" == 1
  • "0" == false
  • "1" == true
  • "2" != true
  • "2" != false
  • ({ valueOf:function() { return 2; } }) == 2
  • ({ valueOf:function() { return 1; } }) == true

【讨论】:

  • ("2" != true), ("2" != false) 怎么都是真的?
  • @qwerty:2 != 32 != 4 都为真
  • 哦,因为 false == Number(0), true == Number(1) 。明白了,谢谢
【解决方案3】:

当通过== 运算符将对象与原始值进行比较时,对象会强制转换为原始值本身(数字或字符串)。在这种情况下,[] 强制转换为 0,然后 false 强制转换为 0

[] == false
0 == false
0 == 0

这是真的。

! 运算符强制转换为布尔值,然后反转该值。 [] 转换为布尔值是 true (就像任何对象一样)。然后反转成为false

![]
!true
false

【讨论】:

    【解决方案4】:

    == 运算符,如果其中一个操作数为布尔值,则将另一个操作数类型转换为数字。

    [] == 0;
    

    相当于:

    0 == 0;
    

    您可以在规范中查看The Abstract Equality Comparison Algorithm 的完整详细信息。

    如您所见,一个空数组对象在转换为数字时会生成0

    +[]; // 0
    Number(0);
    

    这确实是因为它的 toString 方法产生了一个空字符串,例如:

    [].toString(); // ""
    
    +""; // 0
    Number(""); // 0
    

    【讨论】:

      【解决方案5】:

      不确定这是否能回答问题,但有一个新库可以解决所有 Javascript 的类型转换怪异问题:

      Typecast.js

      一句话,Typecast 解决了所有简单的问题,所以你可以专注于大问题。 Typecast 通过为 Javascript 中的强类型变量创建一个完整的平台来修复 Javascript 的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多