代码之家  ›  专栏  ›  技术社区  ›  Å ime Vidas Zim84

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

  •  2
  • Å ime Vidas Zim84  · 技术社区  · 14 年前

    代码段1:

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

    代码段2:

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

    为了什么价值观 x 这两个代码片段不同吗?

    我问是因为,虽然我读过 == 在规范中,我仍然发现很难处理像上面这样的情况(它与ToBoolean强制结合在一起)。

    顺便说一句,我想知道这个只是为了知道它(我想理解语言),所以不用麻烦告诉我 === 或者问我什么 是。

    更新: 我更正了第一个片段。我是说 !x .

    8 回复  |  直到 14 年前
        1
  •  2
  •   Tim Down    14 年前

    下面将给你 true 第一次和 false 对于第二个片段:

    • NaN
    • null
    • undefined

    这些会给你 第一次和 真的 对于第二个片段:

    • []
    • “0”和使用 Number(x) 例如“00”、“000”、“0”和“-0”(我现在称之为“noughty strings”)
    • 包含单个元素的数组 0 , 无效的 , 未定义 或是一根空的或是粗的绳子。

    对于其他一切,您将得到相同的结果,这两个片段,虽然可能有一个或两个以上的情况,我没有想到。

        2
  •  5
  •   SLaks    14 年前
    • [] == 0 是真的; ![] 是假的
    • null == 0 是假的; !null 是真的
    • NaN == 0 是假的; !NaN 是真的
    • undefined == 0 是假的; !undefined 是真的

    !x 将检查是否 x 是“虚伪的”。
    x == 0 将检查是否 是“等同于” 0 .

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

        3
  •  2
  •   user113716    14 年前

    对于只有空格字符的非空字符串,这里有一个有趣的例子:

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

    这是因为当你做一个 == 比较,其中一个被比较的值是数字或布尔值,试图将另一个值转换为数字。

    得到不同结果的原因是,只有空格字符的字符串转换为数字 0 (或false),而只有空格的字符串通过 !! 被视为非空字符串,因此 true .

    所以:

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

    编辑:

    可能要记住的关键是,当比较数字或布尔值与非数字类型时, == 使用 色调 如果可能的话,转换 ! 使用 托布利安 转换。他们不总是一样的。

    很容易看出 托布利安 转换使用 !! . 如所示:

    alert( !![] );   // true
    

    但你不能真正看到 色调 使用时转换 == .

    不过,你可以用一元 + 看到 色调 转换。如所示:

    alert( +[] );   // 0
    

    我很确定在数组的情况下,它首先得到一个 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  
    
        4
  •  1
  •   DVK    14 年前

    简而言之:两者几乎总是一样的,但不是100%相同。

    例如 (!'0') 这是假的 ('0' == 0) 是真的

    细节:

    发件人: http://www.joeyjavas.com/2007/08/04/javascript-true-false-checking-for-boolean-values/

    检查值是真是假在JavaScript中很简单。所有值的计算结果均为true,除了:

    0
    -0
    null
    undefined
    NaN
    empty string
    false
    

    因此, (!x) 对于上述所有值 x 只有那些。

    对于(x==0),如果x的任何值- when converted according to "==" conversion rules -与数字比较时转换为0(例如,布尔值 false 价值)。其他与 ==0 是从它们的 valueOf() 方法或字符串 '0' ,或空数组( [] )

        5
  •  0
  •   cdhowie    14 年前

    x 为非零,或计算为对象(与 null undefined ),或者是非空字符串。所以如果 如果为0,则条件失败,但如果为“0”,则条件成功。

    可转换为0。这意味着它不能为空、未定义或对象以通过此测试。可能是“0”或“。

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

        6
  •  0
  •   Michael Koval    14 年前

    如果 x 是“虚假”的价值。在Javascript中,这意味着0、-0、null、未定义、NaN、“”或false。但是,代码段2只在 是零。与第一个条件不同,这不包括其他“错误”值。

        7
  •  0
  •   Raynos    14 年前

    两者的区别在于

    if ( x ) { ... }
    

    测试x是否为“truthy”

    鉴于

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

    在x和0之间执行类型强制。

    我想你的意思是

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

    主要的区别是x的类型强制为一个数字,而不是检查x是否是错误的。

    很明显 NaN 它本身永远不会等于0,因为它不是一个数字。 undefined 也会逼到楠那才不会被抓 == 0 我不能很好地解释为什么 null 没有被抓住 0 自从 Number(null) == 0

        8
  •  0
  •   BGerrissen    14 年前

    找了几次之后,我得换个雨篷。 没有简单的逻辑,隐式等式操作遵循一个算法。 http://interglacial.com/javascript_spec/a-11.html#a-11.9.3

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

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