2014-09-25 119 views
15

排序的JavaScript中尝试一些怪癖:为什么数字+字符串在JavaScript中的字符串?

首先,我做了

console.log("5" + 1); 

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

现在我这样做的时候:

console.log(1 + "5") 

我期望输出为6,因为我认为这将字符串转换为数字。 但是,神奇的输出是15.

任何人都更有经验的JavaScript照亮了我呢?

+5

加法(甚至不同类型)下面的[交换律](http://www.mathsisfun.com/definitions/commutative-law .html)并不是一件坏事;-) – linqu 2014-09-25 12:00:27

+2

可能的重复:http://stackoverflow.com/questions/5961000/javascript-sign-concatenates-instead-of-giving-sum-of-variables(第一个发现,我敢肯定有很多在那里) – rlemon 2014-09-25 12:07:25

+2

@linqu期望,它是*不*交换,因为'“5”+ 1 ==“51”!=“15”== 1 +“5”'。 – Bakuriu 2014-09-25 16:28:51

回答

27

引述的ECMAScript规格The Addition operator (+) section

  1. 如果Type(lprim)是字符串类型(rprim)是字符串,然后
    返回字符串也就是串联的ToString(lprim),随后的ToString(rprim)

的结果,所以,为了此处无关紧要。

+0

打我吧......一般的规则是:如果你添加一个数字和一个字符串,结果将是一个字符串! – Joshpbarron 2014-09-25 11:59:27

+0

是啊,奇怪的规则虽然 – 2014-09-25 12:00:49

+5

为什么奇怪?如果有字符串,那么结果也会是字符串。容易记住。如果结果取决于操作数的顺序,我想这会很奇怪。 – dfsq 2014-09-25 12:01:27

2

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

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

+0

好的答案,除了没有引文! – 2014-09-25 15:30:54

-6

串联还在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#)中,字符串是不可变的。他们永远不能改变,只能用其他字符串替换。您可能知道组合+“String”不会直接修改组合变量 - 该操作会创建一个将两个字符串连接在一起的结果的新字符串,但是您必须将该新字符串分配给组合变量if你希望它被改变。

关于使用数学运算符进行字符串连接的争论可以说是一个“不正确的”参数,但也有一个参数可以使用+来执行大量的字符串连接可能会非常缓慢。

+0

“,但还有一个理由是使用+来执行大量的字符串连接可能会非常缓慢。”这不再是真的了。 http://jsperf.com/string-concat-without-sringbuilder/5我从这个链接[这个答案](http://stackoverflow.com/a/4717855/829835) – rlemon 2014-09-25 14:38:25

+11

这怎么回答这个问题? – nhahtdh 2014-09-25 15:18:15

+1

我不明白为什么这么多downvote,只是在他/她的问题上给OP一个简单的解释!什么f * ck! – 2014-09-26 06:08:45

8

的console.log(1 + “5”) 我期望输出为6,因为我认为这将字符串转换为数字。 ...

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

console.log(1 + " fine day") 

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

不可能有任何保证,一般来说,一个字符串转换为一个数字。但是任何数字都可以转换为字符串。这就是为什么将转换规则编写为向兼容的类型转变的原因。 (在作为程序员的情况下,您可以将字符串安全地转换为数字,那么您可以明确地这样做,以便+操作在两个数字之间,但对于字符串而言通常不是这样。)

在其他情况下,这也是为什么小型和低精度浮标在混合类型(后者类型)下操作时会转换为大型整数或双精度浮标。你可以安全地将有限的表格转换成更大的表格,但是你不能安全地转向另一个方向。一个小的int可以表示为一个大的int或者一个double,但是另一个方向通常不是一个安全的转换。

因此,对混合类型操作的转换规则尽可能写入可行的转换为安全常见类型的相互兼容类型。编程人员可以为特殊情况编写显式转换,其中更一般的类型可以安全地转换为更有限的类型。

1

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

相关问题