为什么number + string是javascript中的字符串?

Rob*_*die 15 javascript string numbers type-conversion addition

尝试在javascript中尝试一些怪癖:

首先,我做了

console.log("5" + 1);
Run Code Online (Sandbox Code Playgroud)

这打印51,这是正常的,数字和字符串都有+运算符,但由于字符串是第一个变量,它将1转换为字符串.

现在,当我这样做时:

console.log(1 + "5")
Run Code Online (Sandbox Code Playgroud)

我预计输出为6,因为我认为它会将字符串转换为数字.然而,魔术输出是15.

任何更有经验的javascript都可以让我感到满意吗?

dfs*_*fsq 27

引用ECMAScript规范加法运算符(+)部分:

  1. 如果Type(lprim)是String Type(rprim)是String,则
    返回串联ToString(lprim)后跟ToString(rprim)的结果的字符串

所以这里的顺序并不重要.

  • 为什么奇怪?如果有一个字符串,那么结果也将是字符串.容易记住.如果结果取决于操作数的顺序,那将是奇怪的. (5认同)
  • 不幸的是,当操作员可以重复使用时,语言设计者必须为每个案例选择一个规则.IMO这比"2 +"Hello"`变成`2 +"Hello"的ascii值更好. (3认同)
  • @LightnessRacesinOrbit,为了1,000,000评论,你是对的. (2认同)

小智 8

console.log(1 +"5")我预计输出为6,因为我认为它会将字符串转换为数字....

但是,如果您写下以下内容,您会期待什么?

console.log(1 + " fine day")
Run Code Online (Sandbox Code Playgroud)

要么

console.log(1 + " answer(s) to my question")
Run Code Online (Sandbox Code Playgroud)

作为一般规则,不能保证字符串可以转换为数字.但任何数字都可以转换为字符串.这就是编写转换规则以转向兼容类型的原因.(在您作为程序员知道字符串可以安全地转换为数字的上下文中,您可以明确地这样做,以便+操作在两个数字之间.但是对于字符串通常不是这样.)

在其他情况下,这也是为什么当在后者键入的混合类型上操作时,小整数和低精度浮点数将转换为大整数或双精度浮点数的原因.您可以安全地将有限形式转换为更大的形式,但一般情况下您无法安全地进入另一个方向.小int可以表示为big int或double,但另一个方向通常不是安全转换.

因此,尽可能多地编写对混合类型的操作的转换规则,以便向安全通用类型的相互兼容类型移动.程序员可以为特殊情况编写显式转换,其中更通用的类型可以安全地转换为更有限的类型.