前面的话
JavaScript的操作符有46个,虽然语法简单,但也不能小觑,复杂的表达式运算,也是比较复杂的。掌握操作符的语法,才能正确使用这些操作符。这篇文章将介绍算数操作符:包括一元算数操作符、二元算数操作符
在谈算数操作符前,先谈什么是一元操作符
一元操作符
- 只能操作一个值的操作符叫做一元操作符,例如 ++ 、–、一元+、一元-等 。一元操作符的优先级很大,并且运算时,都是右结合。
二元操作符
- 可以操作两个值的操作符叫做二元操作符,例如 * 、% 、+ 、-等
三元操作符
- JavaScript只有一个三元操作符:例如 1< 2 ?2 : 1
一元算数操作符
包括 递增(++)、递减(–)、一元加(+) 、一元减(-)
[递增++]
var age = 29;
++ age;
相当于:
var age = 29;
age = age + 1;
分为两种类型:
-
前置型: 将++放在操作的变量之前。将操作变量的值加一,并且返回计算后的值
-
后置型: 将++放在操作的变量之后。将操作变量的值加一,但不放回计算后的值。
var a = 4; console.log(a++); // 4 console.log(a); // 5 console.log(++a);// 6
这个例子很好的区别前置型与后置型的区别:
a++ 其实此时a已经为5,但是a++的结果并不返回a = 5,它还继续停在a = 4;
而++a是在a = 5基础上加一,又由于是前置型,所以返回a = 6 ;
再看一个例子:
var a = 1;
var b = ++a ; // a = 2 b = 2
var c = b++ + a++;// 2 + 2 = 4 (此时a=3,b=3,但后置型返回的结果是改变之前的)
console.log(a); // 3
console.log(b); // 3
console.log©; // 4
[递减–]
var age = 29;
-- age;
相当于:
var age = 29;
age = age - 1;
同样也分为前置型与后置型。
var a = 4;
console.log(a--); // 4
console.log(a); // 3
console.log(--a);// 2
分析与前面一样:
a-- 其实此时a已经为3,但是–的结果并不返回a = 3,它还继续停在a = 4;
而–a是在a = 3基础上减一,又由于是前置型,所以返回a = 2 ;
[一元加(+)]
一元加操作符,用一个加号(+)表示,放在数值前面,对数值不会产生影响
var num = 25;
console.log(num === +num); // true
在对非数值应用一元加操作符时,回调用Number()转型函数对这个值进行转换
var s1 = '01';
var s2 = '1.1';
var s3 = 'z';
var a = false;
var b = 1.1;
var o = {
valueOf: function() {
return -1;
}
}
s1 = +s1;
console.log(s1); // 1
s2 = +s2;
console.log(s2); // 1.1
s3 = +s3;
console.log(s3); // NaN
a = +a;
console.log(a); // 0
b = +b;
console.log(b);// 1.1
o = +o;
console.log(o);// -1
[注意]:在new Date()前面使用一元加符号,可以把日期字符串转为日期毫秒数
console.log(new Date());
console.log(+ new Date())
[一元减(-)]
一元减操作符操作数值,用于表示负数:
var num = 25;
num = -num;
console.log(num) // -25
当操作数非数值时,会对该值使用Number ()转型函数进行转换,再将得到的数值换成负数
var s1 = '01';
var s2 = '1.1';
var s3 = 'z';
var a = false;
var b = 1.1;
var o = {
valueOf: function() {
return -1;
}
}
s1 = -s1;
console.log(s1);
s2 = -s2;
console.log(s2);
s3 = -s3;
console.log(s3);
a = -a;
console.log(a);
b = -b;
console.log(b);
o = -o;
console.log(o);
二元算数操作符
包括加法(+)、减法(-)、乘法(*)、除法(/)、求余(%)
[加法(+)]
加法操作符的转换规则相对而言要复杂些:
- 如果其中一个操作数是对象,则对象会转为原始值: 日期对象通过toString()方法进行转换,其他对象
如果可以使用valueOf()方法进行转换,就是用其方法转换,否则使用toString()方法来进行转换 - 进行转换后,如果其中一个操作数是字符串,则另一个操作数也会转换为字符串,进行字符串拼接。两个都是
字符串则直接拼接 - 否则,两个操作符都将转换成数字,或NaN进行加法操作
空数组和valueOf()方法返回值为数值的自定义对象会转为数值
console.log(1 + []); // 1
var o = {
valueOf() {
return -1;
}
}
console.log(1 + o);// 0
其他的对象则转为字符串
console.log(1 + {});
console.log(1 + [2]);
console.log(1 + [1,4]);
console.log(1 + new Date());
console.log(1 + /0/);
如果进行加法运算,undefined转为NaN,null转为0.
console.log(1 + undefined);
console.log(1 + null);
console.log(undefined + undefined);
console.log(null + null);
console.log(false + false);
如果进行字符串拼接,undefined转为’undefined’,null转为’null’,false转为’false’,true转为’true’
console.log(''+ undefined);
console.log(''+ null);
console.log(''+ false);
console.log(''+ true);
对于Infinity和带符号的0的处理较为特殊
console.log(Infinity + Infinity);// Infinity
console.log(Infinity + (-Infinity));// NaN
console.log((-Infinity) +(-Infinity));// -Infinity
console.log((+0) + (+0));// 0
console.log((-0)+(-0));// -0
console.log((+0)+(-0));// 0
[减法(-)]
相对于加法,减法要简单的多。减法的转换规则:
- 使用Number()将非数值类型转换为数值或NaN
console.log(1 - {});
console.log(1 - [1,2]);
console.log(1- /0/);
console.log(1 - []);// 1
``
- 进行减法运算时,undefined转为NaN,null转为0,false转为0,true转为1。
console.log(1 - undefined);//NaN
console.log(1 - null);//1
console.log(1 - false);//1
console.log(1 - true);//0
- 对于Infinity与带符号的0
console.log(Infinity - Infinity); // NaN console.log(-Infinity - (-Infinity)); // NaN console.log(Infinity - (-Infinity)); // Infinity console.log(-Infinity - Infinity); // - Infinity console.log(0 - 0); // 0 console.log(-0 - 0);// -0 console.log(-0 - (-0));// -0
[乘法 * ]
乘法操作符由一个星号表示,用于计算两个数值的乘积。通过Number()j将非数值类型转为数值或NaN。
- 一个操作数为NaN,则结果为NaN
console.log(1 * {});// NaN
- 对于Infinit与0
console.log(Infinity * Infinity);// Infinity
console.log(Infinity * (-Infinity));// -Infinity
console.log(Infinity * 0)// NaN
console.log(-Infinity * 0); //NaN
console.log(Infinity * 8)// Infinity
console.log(Infinity * -8)// -Infinity
[除法/]
除法操作符由斜线符号(/)表示。同样也会通过Number()转型函数将非数值类型转换为数值或NaN
- 一个操作数为NaN,则结果为NaN
console.log(1 / {});// NaN
- 对于Infinit与0
console.log(Infinity / Infinity);// NaN
console.log( 0 / 0);// NaN
console.log(8 / 0);// Infinity
console.log((-8) /0);//-Infinity
console.log(Infinity / 0); // Infinity
console.log( Infinity / 8);// Infinity
[求模%]
求模(余数)操作符是由一个百分号(%)表示,规则:
- 求模结果与第一个操作数的符号保持一致
console.log(5 % 2);//1
console.log(5 % -2);//1
console.log(-5 % 2);//-1
console.log(-5 % -2);//-1
- 被除数是Infinity,或除数是0,则求模结果是NaN
``
console.log(Infinity % 0);// NaN
console.log(Infinity % Infinity);// NaN
console.log(Infinity % 8);// NaN
console.log(8 % 0);// NaN