引子
本文讲述为 ECMA-262 中描述可用于操作数据值的操作符之 加性操作符;
加性操作符
加性操作符,即 加法操作符 和 减法操作符,一般都是编程语言中最简单的操作符;
与乘性操作符类似,加性操作符在后台会发生不同数据类型的转换,只不过对这两个操作符来说,转换规则不是那么直观。
加法操作符
加法操作符(+)用于求两个数的和
常规写法
let result = 1 + 2;
加法运算符规则
如果 两个操作数都是数值,加法操作符执行加法运算并根据如下规则返回结果:
- 如果有任一操作数是
NaN,则返回NaN - 如果
Infinity加Infinity,则返回Infinity;同负则反负 - 如果
Infinity加-Infinity,则返回NaN - 如果是
0加0,则返回0 - 如果是
-0加0,则返回0 - 如果是
-0加-0,则返回-0
如果 有一个操作数是字符串,则要应用如下规则:
- 如果有 两个操作数都是字符串,则将第二个字符串拼接到第一个字符串后面:
- 如果 只有一个操作数是字符串,则将另一个操作数转化为字符串,再将两个字符串拼接在一起
如果有任一操作数是对象、数值或布尔值,则调用它们的 toString() 方法以获取字符串,然后再应用前面的关于字符串的规则。对于 undefined 和 null,则调用 String() 函数,分别获取"undefined"和"null"
加法字符串拼接
ECMAScript 中最常犯的一个错误,就是忽略加法操作中涉及的数据类型,如下所示:
let a = 13;
let b = "14";
let message = "The sum of 13 and 14 is" + a + b;
console.log(message); // "The sum of 13 and 14 is 1314"
有人可能会认为最终得到的字符串是 "The sum of 13 and 14 is 27";可是,实际上得到的是 "The sum of 13 and 14 is 1314";这是因为每次加法运算都是独立完成的;在第一次加法的操作数是一个字符串和一个数值(13),结果还是一个字符串;第二次加法仍然是用一个字符串去加一个数值(14),同样也会得到一个字符串。
如果想真正执行数学计算,然后把结果追加到字符串末尾,只要使用一对括号即可:
let a = 13;
let b = "14";
let message = "The sum of 13 and 14 is" +(a + b);
console.log(message); // "The sum of 13 and 14 is 27"
我们用括号把两个数值变量括了起来,意思是让解释器先执行两个数值的加法,然后再把结果追加给字符串
减法操作符
减法操作符(-)用于求两个数的差
常规写法
let result = 5 - 2;
减法运算符规则
与加法操作符一样,减法操作符也有一组规则用于处理 ECMAScript 中不同类型之间的转换:
- 如果两个操作数都是数值,则执行数学减法运算并返回结果
- 如果有任一操作数是
NaN,则返回NaN - 如果是
Infinity减Infinity,则返回NaN;同是负无限也为NaN - 如果是
Infinity减-Infinity,则返回Infinity - 如果
-Infinity减Infinity,则返回-Infinity - 如果是
+0减+0,则返回+0 - 如果是
+0减-0,则返回-0 - 如果是
-0减-0,则返回+0 - 如果有任一操作数是字符串,布尔值,null 或 undefined,则先在后台使用
Number()将其转换为数值,然后再根据前面的规则执行数学运算,如果转换结果是NaN,则减法计算的结果是NaN - 如果有任一操作数是对象,则调用其
valueOf()方法取得表示它的数值;如果该值是NaN,则减法计算的结果为NaN;如果对象没有valueOf方法,则调用其toString()方法,然后再将得到的字符串转换为数值
总结
加性操作符可以使用 + 或 -进行运算处理,本文主要是展示加法与减法的基本运算规则;文章内容不多,可以当成复习册反复查阅