为什么数字+字符串是javascript中的字符串

Why is number + string a string in javascript?

本文关键字:字符串 javascript 为什么 数字      更新时间:2023-09-26

在javascript:中尝试一些怪癖

首先我做了

console.log("5" + 1);

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

现在,当我这样做的时候:

console.log(1 + "5")

我期望输出为6,因为我认为它会将字符串转换为数字。然而,魔法输出是15。

有谁能在javascript方面更有经验为我提亮这一点吗?

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

  1. 如果类型(lprim)是字符串类型(rprim)为字符串,则
    返回字符串,该字符串是连接ToString(lprim)和ToString(rprim)的结果

所以订单在这里并不重要。

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

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

console.log(1 + " fine day")

console.log(1 + " answer(s) to my question")

作为一般规则,无法保证字符串可以转换为数字。但是任何数字都可以转换成字符串。这就是为什么编写转换规则是为了向兼容的类型移动。(在你作为程序员知道字符串可以安全地转换为数字的情况下,你可以明确地这样做,使+运算在两个数字之间。但对于字符串来说,这通常不是真的。)

在其他情况下,这也是为什么在对后一种类型的混合类型进行操作时,小int和低精度浮点会转换为大int或双精度浮点的原因。您可以安全地将有限的表单转换为较大的表单,但通常情况下,您不能安全地转向另一个方向。小int可以表示为大int或double,但另一个方向通常不是安全的转换。

因此,在混合类型上操作的转换规则是尽可能多地编写的,以朝着相互兼容的类型发展,这些类型是安全的常见类型。程序员可以为特殊情况编写显式转换,在这种情况下,更通用的类型可以安全地转换为更有限的类型。

在这两种情况下,值都将转换为字符串。将数字添加到字符串或将字符串添加到数字时,结果就是字符串。

只需使用parseInt(value)toString(value)即可强制转换。

您可以尝试代码:
console.log(1 + parseInt("5"))=>6

Concatenation还在Javascript中使用+

var result = "String" + number + obj;
// is equivalent to
string result = "String" + number.ToString() + obj.ToString();

然而,在C#/.net中,你可以做同样的事情,你会得到同样的结果——System.Console.WriteLine("result is " + 10 + 20);

在JavaScript(以及C#)中,字符串是不可变的。它们永远无法更改,只能用其他字符串替换。您可能知道combined+"String"不会直接修改组合变量-操作会创建一个新字符串,该字符串是将两个字符串连接在一起的结果,但如果您希望更改组合变量,则必须将该新字符串分配给该组合变量。

关于使用数学运算符进行字符串串联的论点可以说是一个"不正确"的论点,但也有一个论点认为,使用+进行大量字符串串联可能非常缓慢。