我不明白为什么要使用JavaScript以这种方式工作。
console.log("1" + 1);
console.log("1" - 1);
第一行打印11,第二打印0.为什么JavaScript的处理首先是作为一个字符串,第二个是多少?
我不明白为什么要使用JavaScript以这种方式工作。
console.log("1" + 1);
console.log("1" - 1);
第一行打印11,第二打印0.为什么JavaScript的处理首先是作为一个字符串,第二个是多少?
字符串连接用做+
如此的JavaScript将第一个数字1转换为字符串并串连“1”和“1”制造“11”。
你不能对字符串进行减法,所以使用Javascript转换第二个“1”的号码,并从1减1,造成零。
+
是不明确的。 它可以指“串联” 或 “添加”。 因为一边是一个字符串,它被认为是指“连击”,因此结果为11(其中,顺便说一句,是我最喜欢的一个玩笑作为一个年轻的孩子,这和“1 + 1 =窗”视觉上示出: │┼│ ニ ⊞
)
-
但是只有一个含义:减。 所以减去。
这样的问题没有出现在其他语言如PHP,其中“连击”是.
而不是+
,从而不会产生歧义。 还是其他语言,如MySQL甚至没有一个连接符,而不是使用CONCAT(a,b,c...)
由于该规范明确告知这样做。 第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的结果
摘要除的情况下,如果任何操作数的当转换为原始值,而无需任何提示突然变得串,第二个是转换为字符串太。 在减法的情况下,两个操作数都转换为数字。
+
是两个加法运算符的数值变量和字符串连接运算符 。
一个后只要有一个字符串+
,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
,这里的一切之前-
是(因为它包含一个字符串当作一个字符串"."
之后的任期,然后-
被视为一个数字。
目前在JavaScript中没有专门的字符串连接运算符**。 加法操作符+
执行任一字符串连接或另外,取决于操作数的类型:
"1" + 1 // "11"
1 + "1" // "11"
1 + 1 // 2
没有级联(我认为)和减法运算符的相反-
无论仅执行操作数的类型的减法:
"1" - 1 // 0
1 - "1" // 0
1 - 1 // 0
"a" - 1 // NaN
**的.
运营商在PHP和&
运营商在VB中有专门的字符串连接运算符。
根据标准的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中)。
运营商+: 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
使用加号和一个字符串""
你基本上返回一个字符串,因为你正在执行的连接:
typeof ("" + 1 + 0) // string
typeof (1 + 0) // number
当使用-
而不是你转换成一个数字作为字符串连接是可能的:
typeof ("" - 1 + 0) // number