代码之家  ›  专栏  ›  技术社区  ›  Diodeus - James MacFarlane

隐含字符串比较,0='',但1='1'

  •  17
  • Diodeus - James MacFarlane  · 技术社区  · 16 年前

    我在调试一些东西,发现了javascript中的一些奇怪之处:

    alert(1=='') ==> false
    alert(0=='') ==> true
    alert(-1=='') ==> false
    

    如果一个隐含的字符串比较0应该为0,这是有意义的。对于所有非零值都是这样,但为什么不为零呢?

    6 回复  |  直到 16 年前
        1
  •  18
  •   Greg    16 年前

    根据Mozilla文档 Javascript Comparison Operators

    如果两个操作数不是同一类型,则javascript将 然后,操作数将严格应用 比较。如果任一操作数是 数字或布尔值,操作数是 转换为数字;如果 操作数是一个字符串,另一个是 转换为字符串

    实际发生的是字符串被转换成数字。 例如:

    1 == '1' 变成 1 == Number('1') 变成 1 == 1 : true

    然后试试这个: 1 == '1.' 变成 1 == Number('1.') 变成 1=1 : 如果它们变成了弦,那么你会 '1' == '1.' ,这是错误的。

    事情就是这样发生的 Number('') == 0 因此 0 == '' 是真的

        2
  •  10
  •   Joel Coehoorn    16 年前

    当javascript执行隐式类型转换时,空字符串文字将与0整数匹配。进行这样的比较,您将得到预期的结果:

    alert(1==='') ==> false
    alert(0==='') ==> false
    alert(-1==='') ==> false
    
        3
  •  4
  •   Christoph    16 年前

    ECMA-262,第3版,11.9.3,关于 x == y ,步骤16:

    如果type(x)是数字,type(y)是字符串,则返回比较结果x==t编号(y)。

    空字符串 '' 转换为 0 在比较之前。

        4
  •  3
  •   Yes - that Jake.    16 年前

    这只是进入到JavaScript折衷方案中的一个真正可怕的漫画。0都是未初始化的值(等于布尔值false),因此等于。

    为了保护自己不受这种奇怪的错误的影响,最好始终使用==运算符。

        5
  •  2
  •   davethegr8 Community Driven Business    16 年前

    与PHP一样,JavaScript也是弱类型*。因此,当您将0与“”进行比较时,JS引擎会将它们转换为类似的数据类型。由于0和“”都等于布尔值(false),“false==false”为true。

    *弱类型语言不要求变量是任何特定的数据类型,因此可以将一个变量设置为字符串,将其更改为int、float和back to string,而不需要处理器抛出错误。

        6
  •  2
  •   Michael Deardeuff    16 年前

    在许多语言中,空字符串可以强制为false。

    小心与==进行比较,而不是==:

    alert('' == '0'); //false  
    alert(0 == ''); // true  
    alert(0 =='0'); // true
    

    ==不可传递。