Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中对字符串值使用减法运算符时出现意外结果_Javascript - Fatal编程技术网

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

在Javascript中对字符串值使用减法运算符时出现意外结果,javascript,Javascript,当我使用奇数运算符时,为什么Javascript的输出为0 用字符串进行减法和加法有什么区别 var x = 1; console.log(x+'1') // Outputs 11 console.log(x-'1') // Outputs 0 -- but why? 那我怎么做数学计算呢?那是因为+是一个串联运算符。因此javascript认为它是一个连接运算符,而不是一个数学运算符。但/,*,/等的情况并非如此。在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引擎将尝试将两个操作数转换为数字(如果它们属于任何其他数据类型)

我不确定为什么字符串的类型转换似乎比数字的类型转换优先,但它显然优先

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

如果要确保
+
运算符充当加法运算符,可以先将值显式转换为
数字。尽管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'