为什么JavaScript在连接时优先强制字符串,而在比较时优先强制数字?
为什么JavaScript在使用concatenate为什么JavaScript在连接时优先强制字符串,而在比较时优先强制数字?,javascript,types,equality,coercion,Javascript,Types,Equality,Coercion,为什么JavaScript在使用concatenate+运算符时优先将操作数强制为字符串,而在执行=相等性检查时优先将操作数强制为数字 '1'+1被强制为'1'+'1'并返回'11' '1'==1被强制为1===1,并返回true 在比较情况下,它们被强制为数字,而不是字符串。见以下资料来源: (一) ==运算符产生与此函数相同的结果: (二) 当比较(即非严格比较)涉及类型转换时,JavaScript将按如下方式转换类型字符串、数字、布尔值或对象操作数: 比较数字和字符串时,字符串将转换为数字
+
运算符时优先将操作数强制为字符串,而在执行=
相等性检查时优先将操作数强制为数字
'1'+1
被强制为'1'+'1'
并返回'11'
'1'==1
被强制为1===1
,并返回true
在比较情况下,它们被强制为数字,而不是字符串。见以下资料来源:
(一)
==运算符产生与此函数相同的结果:
(二)
当比较(即非严格比较)涉及类型转换时,JavaScript将按如下方式转换类型字符串、数字、布尔值或对象操作数:
比较数字和字符串时,字符串将转换为数字值。JavaScript尝试将字符串数字文字转换为数字类型值。首先,从字符串数字文本中导出数学值。接下来,将该值四舍五入到最接近的数字类型值。
如果其中一个操作数是布尔操作数,则布尔操作数在为真时转换为1,在为假时转换为+0
如果将对象与数字或字符串进行比较,JavaScript将尝试返回该对象的默认值。运算符尝试使用对象的valueOf和toString方法将对象转换为基本值、字符串或数值。如果转换对象的尝试失败,将生成运行时错误
请注意,当且仅当对象的比较对象是基本体时,对象才会转换为基本体。如果两个操作数都是对象,则将它们作为对象进行比较,并且只有当两者都引用同一对象时,相等性测试才为真
这有什么原因吗?或者这只是“因为JavaScript”的另一个例子?就我目前的理解而言,很难记住。为什么你认为只有一个原因? 我相信可能有不同的方面:
element.getAttribute('maxlength')> str.length
因此,我们最好处理这样一个事实:字符串/数字组合不是后格(至少在EcmaScript开始使用时是这样)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