为什么在JavaScript中1++"1"===2;+"1"+ +"1"===2;而"1"+"1"==="11"?

11

JavaScript中 char 前面的加号是否会将其转换为数字?

1 + + "1" === 2; 
+"1" + + "1" === 2;
"1" + "1" ===  "11"

之前的问题只是告诉我们如何将字符串转换为数字以及反之,但并没有解释为什么会发生这种情况。


2
这是在ECMAScript中指定的。类型转换应该尽可能奇怪、隐式和意外。 - Eric Duminil
@torazaburo 这个链接的答案看起来不像是对应的重复问题。例如,它没有解释+“1”为什么会被转换为1 - Eric Duminil
@EricDuminil 对的,那个重复目标并不完美。随时可以建议另一个。 - user663031
早先的问题并没有解释为什么会发生这种情况,只是告诉我们各种将字符串转换为数字或反之的方法。嗯?解释+“1”是将字符串转换为数字的一种方式,因为这是规范,就是解释为什么会发生的100%相同。即使那个重复的目标不完美,这种行为在过去几十年的数百或数千个教程、介绍、博客文章和文档页面中都有记录。 - user663031
显示剩余5条评论
4个回答

16
1 + + "1" === 2; 

一元运算符+的优先级更高,因此+"1"将首先被计算,将"1"转换为值为1的整数,因此它将变成

1+1 === 2

第二行

+"1" + + "1" === 2;

这很类似。一元运算符+的优先级更高,因此两个+"1"都将被计算为正整数值1。
"1" + "1" ===  "11"

因为在JavaScript中,如果两个操作数都是字符串,则+也是字符串连接运算符,这将连接两个字符串。
更多信息https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators 更新:@torazaburo是正确的。
  • 此处代码中+"1"的评估与运算符优先级无关。

  • 如果任一操作数是字符串,则会发生字符串连接。


1
这个错误有很多层面。首先,应用一元的 + 运算符不是关于优先级的问题;它是解析表达式的唯一方式。 "优先级" 是指评估类似于 a + b * c 的规则。其次,如果 两个 操作数都是字符串,那么 + 不是字符串连接运算符;只有 其中一个 是字符串时才会进行连接。 - user663031
你是正确的。 - Zamrony P. Juhara

3
你所寻找的是一元加号。让我们分析前两种情况:
一元加操作符位于其操作数之前,将其求值为其操作数,但如果它尚未转换为数字,则会尝试将其转换为数字。
1 + + "1" === 2
"+“1”"部分将字符串"1"转换为数字1。然后将数字1添加到另一个数字1中,结果为2 === 2
+ "1" + + "1" === 2
与上面相同,但现在有两个一元操作。因此,两个字符串"1"都被转换为数字1,结果为2 === 2。

2
在JS中存在隐式类型转换。例如,如果另一个操作数是字符串,则二元加运算符将数字强制转换为字符串。"1" + 2 === "12"3 + "4" === "34"
然而,当与单个操作数一起使用时,它会反过来工作,+"1""1"字符串强制转换为数字1,就像parseInt("1")一样。
因此,+"1" + 3 === 4

-1
第一和第二个,你可以通过在数字前加上+来进行类型转换。
最后一个是两个字符串的拼接,默认情况下,js会将数据类型向上转换, 并且在1 + "1" === "11"中,它会将数字转换为字符串。

JavaScript 中不使用术语“cast”。 - user663031
@torazaburo,为什么不呢? - felixmosh
“Cast”通常指的是在类型语言中的一种特定操作,程序员通过该操作来强制转换特定的类型。由于JavaScript没有类型,因此它不具备转换类型的功能。有时它本身会将类型转换,这称为类型转换或强制转换。 - user663031

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接