我不明白为什么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,结果为0。
[] + {}
,则基本上执行[].toString() + ({}).toString()
(因为JavaScript在连接它们之前将涉及的数组和对象转换为字符串)。并且,因为[].toString === ''
和 ({}).toString() === '[object Object]'
,所以最终结果为[] + {} === '[object Object]'
。这是完全合理的。 - Joeytje50{} + []
呢? :) 继续运用同样的逻辑吧 :) - Yury Tarabanko+
在它前面(就像 +new Date
返回 Date
对象的数值值(UNIX 时间戳),或者 +true
返回 true
的数值值,即 1
)。由于这个原因,加法变成了 {} + 0
。因为对象没有数值,所以这变成了 +0
,JavaScript 将其输出为 0
。 - Joeytje50[] + {}
会执行连接,而{} + []
却不会?此外,你所说的“对象没有数值”是错误的:+{}
返回NaN
。而NaN + 0
是NaN
,而不是0
。不过像@Yury所说的,从实际情况或常识的角度来讨论JavaScript类型强制转换是毫无意义的。 - Ajedi32[] + {}
和{} + []
实际上是两个完全不同的语句。 - James Long+
是个有歧义的符号。它可以表示“连接”或“相加”。由于一侧是字符串,因此它被认为是“连接”,因此结果是11(顺便说一下,这是我小时候最喜欢的笑话之一。“1+1=窗户”,如图所示:│┼│ ニ ⊞
)
-
只有一个意思:减去。所以它执行减法操作。
这种问题在其他语言中如PHP中不存在,其中“连接”用的是.
而不是+
,因此没有歧义。而其他语言比如MySQL甚至没有连接运算符,而是使用CONCAT(a,b,c...)
代替。
5
. 让lnum成为lval的数字形式。
6
. 让rnum成为rval的数字形式。
7
. 返回将lnum和rnum进行减法操作后得到的结果。
概述 在加法运算中,如果任何一个操作数在没有任何提示的情况下被转换为原始值时突然变成字符串,则第二个操作数也会被转换为字符串。在减法运算中,两个操作数都被转换为数字。
[] + [] === ""
:) 是由于连接和加法的歧义吗?LOL - Yury Tarabanko+
根据操作数的类型,执行字符串连接或加法操作:"1" + 1 // "11"
1 + "1" // "11"
1 + 1 // 2
我认为没有连接操作的相反操作,减法运算符-
不考虑操作数的类型只执行减法。
"1" - 1 // 0
1 - "1" // 0
1 - 1 // 0
"a" - 1 // NaN
PHP中的.
操作符和VB中的&
操作符均用于字符串连接。
+
是数字变量的加法运算符,也是字符串的连接运算符。
每当+
后面跟着一个字符串时,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
,其中-
之前的所有内容都被视为字符串(因为它包含一个字符串"."
),然后-
后的项被视为数字。
23 + 2 = 25
相加,然后找到字符串“.”并将类型数字25
转换为类型字符串“25”,并将1和5连接起来,以获得类型字符串“25.15”。此时,它找到了“-”,因此将前面和后面的字符串强制转换为数字,并且由于两者都可以转换为数字,所以执行减法运算以获得数字23.15
。最后,它将3
添加到最终结果中,类型为数字26.15
。 - Ferie+
和-
运算符的行为不同。第一个将每个值转换为字符串。第二个将每个值转换为数字。+
操作涉及的所有值都将转换为字符串。在JavaScript中,当与字符串一起使用+
运算符时,它们会连接在一起。这就是为什么console.log(“5”+1)
返回“51”的原因。 1
被转换为字符串,然后“5”和“1”被连接在一起。-
运算符。当使用-
时,根据标准,所有值都将转换为数字(见下文)。因此,在这种情况下,“5”
会转换为5
,然后减去1
。
从标准:
5 让lnum成为lval的数字形式。
6 让rnum成为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