为啥数字+字符串是javascript中的字符串?
Posted
技术标签:
【中文标题】为啥数字+字符串是javascript中的字符串?【英文标题】:Why is number + string a string in javascript?为什么数字+字符串是javascript中的字符串? 【发布时间】:2014-11-20 04:36:33 【问题描述】:在 javascript 中尝试一些怪癖:
首先我做到了
console.log("5" + 1);
这会打印51,这很正常,数字和字符串都有一个+运算符,但是由于字符串是第一个变量,它会将1转换为字符串。
现在当我这样做时:
console.log(1 + "5")
我希望输出为 6,因为我认为它会将字符串转换为数字。 但是魔法输出是15。
谁能帮我解决这个问题?
【问题讨论】:
commutative law 后面的添加(即使是不同类型的)通常也不是一件坏事 ;-) 可能重复:***.com/questions/5961000/…(找到第一个,我敢肯定有很多) @linqu 期望它是非可交换的,因为"5" + 1 == "51" != "15" == 1 + "5"
.
比some other uses of the +
operator in JavaScript更有意义。
这确实是一些奇怪的行为
【参考方案1】:
你可以试试代码:console.log(1 + parseInt("5"))
=> 6
【讨论】:
【参考方案2】:console.log(1 + "5") 我预计输出为 6,因为我认为它将字符串转换为数字。 ...
但是,如果您写了以下内容,您会期望什么?
console.log(1 + " fine day")
或
console.log(1 + " answer(s) to my question")
作为一般规则,不能保证字符串可以转换为数字。但是任何数字都可以转换为字符串。这就是为什么要编写转换规则以转向兼容的类型。 (在您作为程序员知道字符串可以安全地转换为数字的情况下,您可以明确地这样做,以便 + 操作位于两个数字之间。但对于字符串而言,这通常不是真的。)
在其他情况下,这也是为什么小整数和低精度浮点数在对后者类型的混合类型进行操作时会转换为大整数或双精度浮点数的原因。您可以安全地将有限的形式转换为较大的形式,但通常不能安全地转向另一个方向。一个小的 int 可以表示为一个大的 int 或一个 double,但另一个方向通常不是安全的转换。
因此,尽可能多地编写混合类型操作的转换规则,以朝着安全的通用类型相互兼容的类型发展。对于更通用的类型可以安全地转换为更有限的类型的特殊情况,程序员可以编写显式转换。
【讨论】:
【参考方案3】:在这两种情况下,值都将转换为字符串。 将数字添加到字符串或将字符串添加到数字时,结果是字符串。
只需使用parseInt(value)
或toString(value)
强制转换即可。
【讨论】:
除了没有引用之外的好答案!【参考方案4】:连接在 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#)中,字符串是不可变的。它们永远无法更改,只能用其他字符串替换。您可能知道 combine + "String" 不会直接修改组合变量 - 该操作会创建一个新字符串,该字符串是将两个字符串连接在一起的结果,但如果出现以下情况,您必须将该新字符串分配给组合变量你想改变它。
关于使用数学运算符进行字符串连接的论点可以说是一个“不正确”的论点,但还有一个论点是使用 + 进行大量字符串连接可能会非常慢。
【讨论】:
"但还有一个论点是使用 + 进行大量字符串连接可能会非常慢。"这不再是真的了。 jsperf.com/string-concat-without-sringbuilder/5 我从 this answer 获得链接 这如何回答这个问题? 我不明白为什么这么多反对票,只是对他/她的问题给 OP 一个简单的解释!!!什么鬼!! @nhahtdh 的评论解释了反对意见。你没有回答问题。问题是不是像您假设的那样使用数学运算符进行字符串连接。 如果是这样,OP怎么会选择它作为第一名的答案?只有当你开始投票时,他才改变了答案!【参考方案5】:引用 ECMAScript 规范 The Addition operator ( + ) section:
如果 Type(lprim) 是字符串 或 Type(rprim) 是字符串,则 返回作为连接 ToString(lprim) 后跟 ToString(rprim) 的结果的字符串
所以这里的顺序无关紧要。
【讨论】:
为什么奇怪?如果有一个字符串,那么结果也将是字符串。容易记住。我认为,如果结果取决于操作数的顺序,那就太奇怪了。 不幸的是,当一个运算符可以被重用时,语言设计者必须为每种情况选择一个规则。 IMO 这比2 + "Hello"
变成 2 + the ascii value for "Hello"
要好。
@Joshpbarron:“'Hello' 的 ASCII 值”到底是什么??
072 101 108 108 111 @LightnessRacesinOrbit
@LightnessRacesinOrbit,为了1,000,000 cmets,你是对的。以上是关于为啥数字+字符串是javascript中的字符串?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 C# 中的数字格式字符串在不使用小数 (F0) 时会将数字四舍五入?