在Javascript中使用带有字符串值的减法运算符时出现意外结果

时间:2017-08-27 08:56:05

标签: javascript

为什么Javascript在使用odd运算符时输出为0?

使用字符串减法和加法有什么区别?

var x = 1;

console.log(x+'1')  // Outputs 11
console.log(x-'1')  // Outputs 0 -- but why?

那我怎么做数学计算呢?

3 个答案:

答案 0 :(得分:2)

+运算符在javascript中具有 two 三种含义之一。第一个是添加数字,第二个是连接字符串。执行1 + '1''1' + 1时,运算符会首先将一个不是字符串的操作数转换为字符串,因为另一个操作数已经被计算为字符串。另一方面,-运算符只有一个目的,即从左操作数中减去右操作数。这是一个数学运算,因此JS引擎会尝试将两个操作数转换为数字,如果它们是任何其他数据类型。

我不确定为什么对字符串进行类型转换似乎优先于对数字进行类型转换,但显然确实如此。

(在我看来,这很可能是纯粹的规范决策,而不是其他语言机制的结果。)

如果要确保+运算符充当加法运算符,则可以先将值显式转换为number。虽然javascript在技术上不区分整数和浮点数,但是存在两个函数来将其他数据类型转换为它们的number等价物:parseInt()parseFloat()

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在下面的评论中所述,+运算符具有unary + operator形式的第三个含义。如果+只有一个正确的操作数,它会尝试将其值转换为几乎等同于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

答案 1 :(得分:0)

这是因为+是一个连接运算符。所以javascript认为它是一个连接运算符而不是数学运算符。但/*/等不是这种情况。

答案 2 :(得分:0)

这是因为+它也用于连接字符串。然后,JS总会找到更好的方法来根据类型进行正确的类型转换。在这种情况下,x+'1'操作将被标识为string type + string type。 否则,x-'1'将成为int type - int type

如果您想使用特定类型,请尝试使用类型转换转换,链接here