算术运算符主要用于算数操作,算术运算符包括一元算术运算符和二元算术运算符
一元算术运算符
在JS中一元算术运算符包括一元加法+
,一元减法-
,递增++
,递减--
一元加
一元加法运算符使用符号+
表示,放在数值前面,对数值不会产生任何影响
var num = 1;
num = +num; // 1
如果为非数值应用一元加法运算,会自动代用Number()
转型函数
var s1 = '01';
var s2 = '1.1';
var s3 = 'a';
var b = true;
var f = 1.1;
var o = {
valueOf: function() {
return '-1';
}
}
s1 = +s1; // 1
s2 = +s2; // 1.1
s3 = +s3; // NaN
b = true; // 1
f = +f; // 1.1
o = +o; // -1
new Date()
使用一元加运算,可以把日期字符串转换为毫秒数
new Date(); // Mon Apr 23 2018 18:11:18 GMT+0800 (中国标准时间)
+new Date(); // 1524478278112
一元减
一元减法运算主要用于表示负数
var num = 1;
num = -num; // -1
如果为非数值应用一元减法运算,会自动代用Number()
转型函数,再将得到的数值转换为负数
var s1 = '01';
var s2 = '1.1';
var s3 = 'a';
var b = true;
var f = 1.1;
var o = {
valueOf: function() {
return '-1';
}
}
s1 = -s1; // -1
s2 = -s2; // -1.1
s3 = -s3; // NaN
b = true; // -1
f = -f; // -1.1
o = -o; // 1
一元加和一元减运算符不仅用于基本的算符运算,也常用于转换数据类型
递增
递增运算符用于对操作数进行增量操作,运算符通过调用Number()
转型函数将操作数转换为数字,然后把数字加1后的结果重新赋值给变量或数字元素或对象属性
var num = 1;
++num;
var num2 = 1;
num2++;
console.log(num); // 2
console.log(num2); // 2
增量运算符的返回值依赖于它相对于操作数的位置,当运算符在操作数之前时,称为前增量运算符,前增量运算符返回计算后的值;当运算符在操作数之后时,称为后增量运算符,后增量运算符返回计算前的值。
var num = 1;
var ret = ++num;
console.log(num, ret) // 2 2
var num2 = 1;
var ret2 = num2++;
console.log(num2, ret2) // 2 1
注意: ++x
增量操作并不完全等于x = x + 1
,++
运算符不进行字符串拼接,而x = x + 1
会进行字符串拼接
var num = '1';
++num; // 2
var num2 = '1';
num2 = num2 + 1; // '11' 字符串拼接,返回字符串
递减
同递增运算符类似,递减运算符用于减量(减1)操作,运算符通过调用Number()
转型函数将操作数转换为数字,然后把数字减1后的结果重新赋值给变量或数字元素或对象属性
var num = 1;
--num;
var num2 = 1;
num2--;
console.log(num); // 0
console.log(num2); // 0
当运算符在操作数之前时,返回计算后的值;当操作符位于操作数之后时,返回计算前的值。
var num = 1;
var ret = --num;
console.log(num, ret) // 0 0
var num2 = 1;
var ret2 = num2--;
console.log(num2, ret2) // 0 1
二元算数运算符
二元算数运算符包括加法(+)、减法(-)、乘法(*)、除法(/)、求模(%)
加法
JS中的加法运算有很多特殊行为,不仅可以用于基本的算数运算,还可用于字符串拼接,它的特殊行为主要表现在以下几点:
- 如果其中一个操作数是对象,那么对象会转换为原始值。如果能通过
valueOf()
返回原始值,则调用valueOf()
方法,如果不能则通过toString()
方法执行转换。
1 + [1, 2, 3]; // '11, 2, 3'
var o = {
valueOf: function(){
return -1;
},
toString: function() {
return 2;
}
}
console.log(1 + o); // 0
- 对象转换为原始值后,如果其中一个操作数是字符串,另一个操作数也会转为字符串,进行字符串拼接操作
// 原生对象调用toString()方法后转换为字符串
1 + {}; // '1[object Object]'
1 + [1,2,3]; // '11, 2, 3'
1 + new Date(); // 1Mon Apr 23 2018 18:11:18 GMT+0800 (中国标准时间)
'' + null; // 'null'
'' + true; // 'true'
'' + undefined; // 'undefined'
- 对象转换为原始值后,如果操作数都是非字符串,则操作数将转换为数字或
NaN
,进行加法操作
false + false; // 0
true + true; // 2
null + null; // 0
undefined + undefined; // NaN
注意: Infinity
和符号0较为特殊
Number.MAX_VALUE + Number.MAX_VALUE === Infinity; // true
+0 === -0; // true
Infinity + (-Infinity); //NaN
减法
减法运算只进行基本的数字运算,通过Number()
转型函数将非数值类型转换为数值或NaN。
1 - {}; // NaN
1 - [1,2,3]; // NaN
1 - []; // 1
1 - undefined; // NaN
1 - false; // 1
1 - true; // 0
在和Date
对象进行运算时,加法和其他运算操作有些不同,加法运算是使用toString()
转换为字符串,其他运算(减、乘、除和求余)是使用Number()
转型函数将Date对象使用valueOf()
转为数字
new Date() - 1; // 1524478278111
new Date() + 1; // Mon Apr 23 2018 18:11:18 GMT+0800 (中国标准时间)1
乘法
乘法运算符用于计算数值的乘积,通过Number()
转型函数将非数值类型转换为数值或NaN。
1 * {}; // NaN
1 * [1,2,3]; // NaN
1 * []; // 0
1 * undefined; // NaN
1 * false; // 0
1 * true; // 1
Infinity * Infinity; // Infinity
除法
除法运算符用于计算第一个操作符除以第二个操作符的结果,通过Number()
转型函数将非数值类型转换为数值或NaN。
Infinity / Infinity; //NaN
0 / 0; //NaN
求模
求模就是求余,计算第一个操作符除以第二个操作符的余数。
求余结果同第一个操作符的符号保持一致
5 % 2; // 1
5 % -2; // 1
-5 % 2; // -1
-5 % -2; // -1
被除数是Infinity,或除数是0,则求模结果是NaN
Infinity % 2; // NaN
2 % 0; // NaN