在Javascript中对字符串值使用减法运算符时出现意外结果
当我使用奇数运算符时,为什么Javascript的输出为0 用字符串进行减法和加法有什么区别在Javascript中对字符串值使用减法运算符时出现意外结果,javascript,Javascript,当我使用奇数运算符时,为什么Javascript的输出为0 用字符串进行减法和加法有什么区别 var x = 1; console.log(x+'1') // Outputs 11 console.log(x-'1') // Outputs 0 -- but why? 那我怎么做数学计算呢?那是因为+是一个串联运算符。因此javascript认为它是一个连接运算符,而不是一个数学运算符。但/,*,/等的情况并非如此。在javascript中,+运算符有两种三种含义之一。第一个是添加数字,
var x = 1;
console.log(x+'1') // Outputs 11
console.log(x-'1') // Outputs 0 -- but why?
那我怎么做数学计算呢?那是因为
+
是一个串联运算符。因此javascript认为它是一个连接运算符,而不是一个数学运算符。但/
,*
,/
等的情况并非如此。在javascript中,+
运算符有两种三种含义之一。第一个是添加数字,第二个是连接字符串。执行1+'1'
或'1'+1
操作时,运算符将首先将一个非字符串的操作数转换为字符串,因为另一个操作数已计算为字符串。另一方面,-
运算符只有一个目的,即从左操作数中减去右操作数。这是一个数学运算,因此JS引擎将尝试将两个操作数转换为数字(如果它们属于任何其他数据类型)
我不确定为什么字符串的类型转换似乎比数字的类型转换优先,但它显然优先
(在我看来,这很可能是一个纯粹的规范决策,而不是其他语言机制的结果。)
如果要确保+
运算符充当加法运算符,可以先将值显式转换为数字。尽管javascript在技术上不区分整数和浮点,但存在两个函数将其他数据类型转换为它们的number
等价物:和:
const x = 10;
const result = x + parseInt('1'); // 11
const y = 5;
const result2 = y + parseFloat('1.5'); // 6.5
const result3 = y + parseInt('1.5'); // 6
编辑
正如jcaron在下面的注释中所述,+
运算符具有以。如果+
只有一个右操作数,它将尝试将其值转换为一个几乎等同于parseFloat
的数字:
+ '1'; // returns 1
+ '1.5'; // returns 1.5
// In the context of the previous example:
const y = 5;
const result2 = y + +'1.5'; // 6.5
与parseFloat的区别在于parseFloat将创建源字符串的子字符串,直到该子字符串成为无效数字,而一元+将始终将整个字符串作为其输入:
parseFloat('1.5no-longer-valid'); // 1.5
+ '1.5no-longer-valid'; // NaN
这是因为+
它也用于连接字符串。然后,JS总会找到更好的方法,根据类型进行正确的类型转换。在这种情况下,x+'1'
操作将被标识为string type+string type
。
否则,x-'1'
将成为int-type-int-type
如果您想使用特定类型,请尝试使用类型转换,link。实际上,Javascript中的+
还有另一种含义,即一元运算符,用于强制转换为数字。所以你可以写x++'1'
你是对的,我会更新我的答案,谢谢!噢好主意x++'1'