为什么JavaScript的处理字符串和数字之间不同的加号和减号运营商?为什么JavaScript的

2019-05-09 06:17发布

我不明白为什么要使用JavaScript以这种方式工作。

console.log("1" + 1);
console.log("1" - 1);

第一行打印11,第二打印0.为什么JavaScript的处理首先是作为一个字符串,第二个是多少?

Answer 1:

字符串连接用做+如此的JavaScript将第一个数字1转换为字符串并串连“1”和“1”制造“11”。

你不能对字符串进行减法,所以使用Javascript转换第二个“1”的号码,并从1减1,造成零。



Answer 2:

+是不明确的。 它可以指“串联” “添加”。 因为一边是一个字符串,它被认为是指“连击”,因此结果为11(其中,顺便说一句,是我最喜欢的一个玩笑作为一个年轻的孩子,这和“1 + 1 =窗”视觉上示出: │┼│ ニ ⊞

-但是只有一个含义:减。 所以减去。

这样的问题没有出现在其他语言如PHP,其中“连击”是. 而不是+ ,从而不会产生歧义。 还是其他语言,如MySQL甚至没有一个连接符,而不是使用CONCAT(a,b,c...)



Answer 3:

由于该规范明确告知这样做。 第75页。注意11.6.1的区别步骤5-8和11.6.2步骤5-7。

11.6.1 -介绍加法运算符是如何工作的

1-4 。 ...

5 。 让lprim BE ToPrimitive(lval中)。

6 。 让rprim是ToPrimitive(RVAL)。

7 。 如果Type(lprim)是字符串或类型(rprim)是字符串,然后

7a 。 返回字符串即串联接着的ToString的ToString(lprim)的结果(rprim)

8 。 返回应用加法运算到ToNumber(lprim)和ToNumber(rprim)的结果

11.6.2 -介绍减法运算符是如何工作的

1-4 。 ...

5 。 我们是lnum缓冲区里ToNumber(lval中)。

6 。 让RNUM是ToNumber(RVAL)。

7 。 返回将减法操作lnum在和RNUM的结果

摘要除的情况下,如果任何操作数的当转换为原始值,而无需任何提示突然变得串,第二个是转换为字符串太。 在减法的情况下,两个操作数都转换为数字。



Answer 4:

+是两个加法运算符的数值变量和字符串连接运算符

一个后只要有一个字符串+ ,JavaScript就选择使用+作为连接运算符和转换(类型)的许多方面尽可能串绕,因此可以将它们连接起来。 这的JavaScript的只是行为。 (如果你试过console.log(23 + 2 + "." + 1 + 5 + "02" + 02);你会得到的结果25.15022数。 02被键入到字符串2是级联之前。

-仅可为减法运算符 ,所以给定的一个字符串的时候,它会隐含地改变字符串的类型"1"为数字1 ; 如果不这样做,有没有办法, "1" - 1才有意义。 如果你尝试console.log(23 + 2 + 1 + 5 - "02" + 03); 你会得到32 -串02被转换成数字2 。 后的术语-必须能够被转换成的数字; 如果你试图console.log(23 - 2 - "." - 1 - 5 - 02 - "02"); 你会得到NaN返回。

更重要的是,如果你试图console.log(23 + 2 + "." + 1 + 5 - "02" + 03); ,它将输出26.15 ,这里的一切之前-是(因为它包含一个字符串当作一个字符串"."之后的任期,然后-被视为一个数字。



Answer 5:

目前在JavaScript中没有专门的字符串连接运算符**。 加法操作符+执行任一字符串连接或另外,取决于操作数的类型:

"1" +  1  // "11"
 1  + "1" // "11"
 1  +  1  // 2

没有级联(我认为)和减法运算符的相反-无论仅执行操作数的类型的减法:

"1" -  1  // 0
 1  - "1" // 0
 1  -  1  // 0
"a" -  1  // NaN

**的. 运营商在PHP和&运营商在VB中有专门的字符串连接运算符。



Answer 6:

根据标准的EcmaScript 262的+-运营商不同的表现时,字符串都参与其中。 首先每个值转换为字符串。 第二个的每一个值的数字转换。

从标准:

如果Type(lprim)是字符串或类型(rprim)的字符串,则返回字符串即串联接着的ToString的ToString(lprim)的结果(rprim)

此规则意味着,如果在表达式有一个字符串值,参与的所有值+操作被转换为字符串。 在JavaScript中,当+运算符与字符串使用,它连接它们。 这就是为什么console.log("5"+1)返回“51”。 1被转换成字符串,然后,“5” +“1”被级联在一起。

然而,上述规则不适用了-运营商。 如果您使用的是-所有的值是根据标准(见下文)转换成数字。 因此,在这种情况下, "5"被转换为5 ,然后1被减去。

从标准:

5愿LNUM是ToNumber(lval中)。

6令RNUM是ToNumber(rval中)。


从标准的EcmaScript 262运营商的定义。

运营商+: http://www.ecma-international.org/ecma-262/5.1/#sec-11.6.1

运营商- : http://www.ecma-international.org/ecma-262/5.1/#sec-11.6.2



Answer 7:

使用加号和一个字符串""你基本上返回一个字符串,因为你正在执行的连接:

typeof ("" + 1 + 0)  // string
typeof (1 + 0)  // number

当使用-而不是你转换成一个数字作为字符串连接是可能的:

typeof ("" - 1 + 0) // number


文章来源: Why does JavaScript handle the plus and minus operators between strings and numbers differently?