【发布时间】:2018-02-04 19:05:56
【问题描述】:
当我使用奇数运算符时,为什么 Javascript 给出的输出为 0?
字符串的减法和加法有什么区别?
var x = 1;
console.log(x+'1') // Outputs 11
console.log(x-'1') // Outputs 0 -- but why?
那么我该如何进行数学计算呢?
【问题讨论】:
标签: javascript
当我使用奇数运算符时,为什么 Javascript 给出的输出为 0?
字符串的减法和加法有什么区别?
var x = 1;
console.log(x+'1') // Outputs 11
console.log(x-'1') // Outputs 0 -- but why?
那么我该如何进行数学计算呢?
【问题讨论】:
标签: javascript
+ 运算符在 javascript 中具有 二 三种含义之一。第一个是添加数字,第二个是连接字符串。当您执行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
【讨论】:
+在Javascript中还有一个意思,作为一元运算符,用来强制转换为数字。所以你可以写x + +'1'
x + +'1'
那是因为+ 是一个连接运算符。所以javascript认为它是一个连接运算符而不是一个数学运算符。但/,*,/等情况并非如此。
【讨论】:
这是因为+ 也用于连接字符串。然后,JS 总是会找到更好的方法来根据类型进行正确的类型转换。在这种情况下,x+'1' 操作将被标识为string type + string type。
否则,x-'1' 将变为 int type - int type。
如果您想使用特定类型,请尝试使用类型转换,链接here。
【讨论】: