为什么JavaScript在连接时优先强制字符串,而在比较时优先强制数字?

为什么JavaScript在连接时优先强制字符串,而在比较时优先强制数字?,javascript,types,equality,coercion,Javascript,Types,Equality,Coercion,为什么JavaScript在使用concatenate+运算符时优先将操作数强制为字符串,而在执行=相等性检查时优先将操作数强制为数字 '1'+1被强制为'1'+'1'并返回'11' '1'==1被强制为1===1,并返回true 在比较情况下,它们被强制为数字,而不是字符串。见以下资料来源: (一) ==运算符产生与此函数相同的结果: (二) 当比较(即非严格比较)涉及类型转换时,JavaScript将按如下方式转换类型字符串、数字、布尔值或对象操作数: 比较数字和字符串时,字符串将转换为数字

为什么JavaScript在使用concatenate
+
运算符时优先将操作数强制为字符串,而在执行
=
相等性检查时优先将操作数强制为数字

'1'+1
被强制为
'1'+'1'
并返回
'11'

'1'==1
被强制为
1===1
,并返回
true

在比较情况下,它们被强制为数字,而不是字符串。见以下资料来源:

(一)

==运算符产生与此函数相同的结果:

(二)

当比较(即非严格比较)涉及类型转换时,JavaScript将按如下方式转换类型字符串、数字、布尔值或对象操作数:

比较数字和字符串时,字符串将转换为数字值。JavaScript尝试将字符串数字文字转换为数字类型值。首先,从字符串数字文本中导出数学值。接下来,将该值四舍五入到最接近的数字类型值。

如果其中一个操作数是布尔操作数,则布尔操作数在为真时转换为1,在为假时转换为+0

如果将对象与数字或字符串进行比较,JavaScript将尝试返回该对象的默认值。运算符尝试使用对象的valueOf和toString方法将对象转换为基本值、字符串或数值。如果转换对象的尝试失败,将生成运行时错误

请注意,当且仅当对象的比较对象是基本体时,对象才会转换为基本体。如果两个操作数都是对象,则将它们作为对象进行比较,并且只有当两者都引用同一对象时,相等性测试才为真


这有什么原因吗?或者这只是“因为JavaScript”的另一个例子?就我目前的理解而言,很难记住。

为什么你认为只有一个原因? 我相信可能有不同的方面:

  • HTML数据不是类型化的,而是字符串。HTTP也是如此。因此,如果您尝试

    element.getAttribute('maxlength')> str.length
    
    因此,我们最好处理这样一个事实:字符串/数字组合不是后格(至少在EcmaScript开始使用时是这样)

  • 尝试对“+”和“>”操作符使用相同的方法将生成更多的“WTF?”。比如说,如果我们尝试在任何地方使用“toString方法”,那么
    2>'11'
    。另一方面,对于“无处不在的toNumber方法”,我们会更频繁地看到字符串连接结果中的
    NaN
    ,这是我们想要的


  • 是的,看起来很混乱。但这更多是因为“+”作为操作符“add”和操作“concatenate”的目标不明确。然后你应该使用它来自动操作。

    阅读规范。
    '1'+1
    =
    ('1').toString()+(1).toString()
    你怎么知道
    '1'==1
    被强制为
    1==1
    ,而不是
    '1'==1'
    ?@jhpratt“==infix运算符”部分伪代码(第四和第五个if语句).我不会说这只是“因为javascript”。有一些很好的理由,我们可能更喜欢一种转换而不是另一种。对于
    ==
    ,将两者转换为数字具有很好的特性。例如,比较任意两个falsy值(除
    NaN
    )将返回true,例如
    “”==0
    。类似地,在
    +
    的情况下,由于许多字符串不是数字,我宁愿
    “foo”+1
    “foo1”
    ,而不是
    NaN
    (如果我们将两者都转换为数字)。
    element.getAttribute('maxlength')> str.length