1. 概述
JavasScript提供十个算术运算符
- 加法运算符
- 减法运算符
- 乘法运算符
- 除法运算符
- 指数运算符
- 余数运算符
- 数值运算符
- 负数值运算符
- 自增运算符
- 自减运算符
减法、乘法、除法运算符就是单纯的数学运算,下面介绍其它几个运算符,重点是加法运算符。
2. 加法运算符
加法运算符有两种运算规则:
- 数学意义上的相加
- 连接字符串
2.1 基本规则
非字符串类型的数据相加时执行数学运算
1+1 //2
1 + true // 2
false + true //1
1 + null //1
1 + undefined // NaN
当有字符串参与时会执行连接运算
1 + '1' //'11'
false + '2' //'false2'
注意运算的顺序是从左往右
3 + '4' +5 //'345'
3 + 4 + '5' //'75'
2.2 对象的相加
对象在执行连接运算符的时候,先转换为原始类型,然后再相加。
对象转原始类型的值规则如下:
- 先调用valueOf返回对象自身,
- 再调用toString方法将其转为字符串
需要注意的是如果valueOf返回的是基础数据类型则直接当作返回值不再执行toString方法
var a = {};
var b = function(){foo};
a + 1 // '[object Object]1'
a + b; // '[object Object]function(){foo}'
知道了这个规则以后就可以自定义valueOf或者toString方法得到想要的返回值
const obj = {
valueOf:function(){
return 1;
}
};
1 + obj //2
const obj1 = {
toString: function(){
return 'custom'
}
};
1 + obj1 // '1custom'
这里面有一个特例就是 Date类型,Date类型直接执行toString方法进行转换,不会执行valueOf
const date = new Date();
date.valueOf = function(){ return 'jack' };
date.toString = function(){return 'tom' };
1 + date // '1tom'
余数运算符
余数运算符(%)返回前一个运算子被后一个运算子除,所得的余数。
11 %3; //2
自增和自减运算符
自增和自减运算符的作用是先将运算子(参与运算的值)转换为数字类型再加上或者减去1,这会产生副作用(side effect),修改变量的值。
先返回再运算
let a = 1;
a++; //1
先运算再返回
let a = 1;
++a; //2
数值运算符和负数值运算符
数值运算符也使用加号,但是它是一元运算符(只需要一个操作数),作用是将任何值转换为数值,功能与Number相同。
+ null; //0
+ {}; //NaN
+ undefined; //NaN
+ []; //0
负数值运算符与数值运算符的差别只在数值上的正负
+ null; //0
- null; //-0
+ true; //+1
- true; //-1
指数运算符
2 ** 3; //8
指数运算符是右结合,先计算右边再计算左边
2 ** 3 ** 2; //等同于 2 ** (3 ** 2);
//512
赋值运算符
const x = 1;
const y = x;
赋值运算符与其它运算符结合
x + = y; //等同于 x = x + y
x - = y; //等同于 x = x - y
x * = y; //等同于 x = x * y
x / = y; //等同于 x = x / y
x % = y; //等同于 x = x % y
x ** = y; //等同于 x = x ** y
总结
- 加号运算符再运算的时候分为数学运算和连接运算
- 对象进行连接运算的时候会先转换为原始值,转换的方法是先调用valueOf方法再调用toString方法,如果valueOf返回结果为基础数据类型则取valueOf的返回值作为结果,不再执行toString方法
- 可以自定义valueOf或者toString方法
- Date类型的数据在进行连接运算时直接调用toString方法