【JS红宝书¹²】加性操作符

221 阅读4分钟

引子

本文讲述为 ECMA-262 中描述可用于操作数据值的操作符之 加性操作符

加性操作符

加性操作符,即 加法操作符减法操作符,一般都是编程语言中最简单的操作符;

与乘性操作符类似,加性操作符在后台会发生不同数据类型的转换,只不过对这两个操作符来说,转换规则不是那么直观。

加法操作符

加法操作符(+)用于求两个数的和

常规写法
 let result = 1 + 2;

加法运算符规则

如果 两个操作数都是数值,加法操作符执行加法运算并根据如下规则返回结果:

  • 如果有任一操作数是 NaN,则返回 NaN
  • 如果 InfinityInfinity,则返回 Infinity;同负则反负
  • 如果 Infinity-Infinity,则返回 NaN
  • 如果是 00,则返回 0
  • 如果是 -00,则返回 0
  • 如果是 -0-0,则返回 -0

如果 有一个操作数是字符串,则要应用如下规则:

  • 如果有 两个操作数都是字符串,则将第二个字符串拼接到第一个字符串后面:
  • 如果 只有一个操作数是字符串,则将另一个操作数转化为字符串,再将两个字符串拼接在一起

如果有任一操作数是对象、数值或布尔值,则调用它们的 toString() 方法以获取字符串,然后再应用前面的关于字符串的规则。对于 undefinednull,则调用 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
  • 如果是 InfinityInfinity,则返回 NaN;同是负无限也为NaN
  • 如果是 Infinity-Infinity,则返回 Infinity
  • 如果 -InfinityInfinity,则返回 -Infinity
  • 如果是 +0+0,则返回 +0
  • 如果是 +0-0,则返回 -0
  • 如果是 -0-0,则返回 +0
  • 如果有任一操作数是字符串,布尔值,null 或 undefined,则先在后台使用 Number() 将其转换为数值,然后再根据前面的规则执行数学运算,如果转换结果是 NaN,则减法计算的结果是 NaN
  • 如果有任一操作数是对象,则调用其 valueOf() 方法取得表示它的数值;如果该值是NaN,则减法计算的结果为NaN;如果对象没有 valueOf 方法,则调用其 toString() 方法,然后再将得到的字符串转换为数值

总结

加性操作符可以使用 +-进行运算处理,本文主要是展示加法与减法的基本运算规则;文章内容不多,可以当成复习册反复查阅