操作符
一元操作符
只能操作一个值的操作符叫一元操作符。
递增(++)、递减(--)操作符
递增、递减操作符有两种方式:前置和后置,前置就是操作符在变量前面,后置就是操作符在变量后面。如:++ a、-- b、a ++、b --。
前置操作
var a = 20;
++ a;
console.log(a); //21
等同于:
var a = 20;
a = a + 1;
console.log(a); //21
前置递减操作与递增操作类似。
var a = 20;
a --;
console.log(a); //19
等同于:
var a = 20;
a = a - 1;
console.log(a); /* 得到结果19 */
var a = 20,
b = 50;
console.log((++ a) + (++ b)); //72 = 21 + 51
后置操作
后置操作与前置操作有个最大不同是:递增和递减 是在 包含它们的语句被求值后 才执行的。即:在包含它们的这条语句执行完所在
操作后,才执行递增或递减操作的。
递增:
var a = 50,
b = 10;
//此时先执行所在语句的操作即a、b两个值相加,得到结果60,再执行递增操作,a、b各自加1。
var c = a++ + b++;
// 此时a的值为51,b的值为11,最后得到d的结果62
var d = a + b;
console.log(c); //60
console.log(a); //51
console.log(b); //11
console.log(d); //62
效果:
递减:
var a = 50,
b = 10;
//此时先执行所在语句的操作即a、b两个值相加,得到结果60,再执行递增操作,a、b各自减1。
var c = a-- + b--;
//此时a的值为49,b的值为9,最后得到d的结果58
var d = a + b;
console.log(c); //60
console.log(a); //49
console.log(b); //9
效果:
递增、递减操作符有以下规则:
1、运用于 包含有效数字字符的字符串时,先将其转换成数字值,再执行加减1操作,最后将字符串变量变成数字变量。
2、运用 不包含有效数字字符的字符串时,返回NaN,最后将字符串变量变成数字变量。
3、运用于布尔型的false时,先将其转换成0,再执行加减1操作,最后将布尔变量变成数字变量。
4、运用于布尔型的true时,先将其转换成1,再执行加减1操作,最后将布尔变量变成数字变量。
5、运用于浮点数字时,执行加减1操作。
6、运用对象时,先使用对象的valueof()方法或toString()方法,再执行加减1操作。
var a = "21"; //有效数字字符串
var b = "hello"; //无效数字字符串
var c = 1.1; //数字
var d = false; //false
a --; /* 值变成20 */
b ++; /* 值变成NaN */
c --; /* 值变成0.1 */
d ++; /* 值变成1 */
console.log(b); //NaN
console.log(d); //1
一元加、减操作符
一元加、减操作符就是在变量前面加上一个"+"或"-",变量前面加"+",不会对值产生影响,加"-"是将值变成负值。
对于非数值,首先就像Number()方法一样,先将非数值转换成数值,后在前面加上"+"或"-"。也就是说,如果是布尔值,则将true转换为1,false转换为0,如果是对象,则调用对象的toString()方法或valueof()方法。
格式: a = +a; b = -b;
var a = "21";
var b = "hello";
var c = 1.1;
var d = false;
a = +a; /* 值变成20 */
b = -b; /* 值变成NaN */
c = -c; /* 值变成-1.1 */
d = +d; /* 值变成0 */
位运算操作符
位操作是最底层的操作,javascript中的数值都是以64位存储的,但64位是透明的,所以是操作的32位数值,前31位是数值,第32位表示的符号位。
负数操作是在正数的基础上进行的,
1、求这个负数值绝对值的二进制码。
2、再求这个二进制码的反码(即:1变为0,0变为1)
3、最后在反码的基础上加1。
按位非(NOT)
按位非只有一个操作数,用波浪线(~)表示,机制:就是返回数值的反码,即:操作数的负值减1。
var a = 40;
var b = ~a;
console.log(b); /* a的负值-40再减1得到-41 */
按位与(AND)
按位与有两个操作数,用和号(&)表示,机制:两个二进制数,每一位对齐,对应位全是1返回1,有一个为0返回0。通俗说”全1为1,有0则0“
010101
101101
结果就是:000101
按位或(OR)
按位或也有两个操作数,用竖线(|)表示,机制:两个二进制数,第一位对齐,对应位有一个是1返回1,全是0返回0。通俗说”有1则1,全0为0“
100110
010100
结果就是:110110
按位异或(XOR)
按位异或有两个操作数,用(^)表示,机制:对应位相同的返回0,不相同的返回1,即:相异为1,相同为0
01110010
01011001
结果就是:00101011
左移(<<)
左移操作用(<<)表示,将二进制向左移动多少位。如:向左移动n位,得到的结果 相当于 该变量乘以2的n次方。
var a = 2;
var b = a << 5;
表示的是将2的二进制数 10向左移动5位,不中的位用0补全,即得到:1000000,数值是64,相当于2乘以2的5次方。
有符号右移(>>)
有符号右移用(>>)表示,将二进制向右移动多少位,如:向右移动n位,得到的结果 相当于 该变量乘以2的-n次方。
var b = 64;
var a = b >> 5;
表示的是将64的二进制数1000000值向右移动5们,即得到:10,数个2。相当于乘以2的-5次方。
布尔操作符
布尔操作符包括:逻辑非(NOT)、逻辑与(AND)、逻辑或(OR)。
逻辑非(!)
逻辑非用感叹号(!)表示,非操作符只有一个操作数,首先将操作数转换成布尔值,再将其取反。
规则:
1、操作数是一个对象,返回false。
2、操作数是一个空字符,实则为false,返回true。
3、操作数是一个非空字符,返回false。
4、操作数是null,返回true。
5、操作数是undefiend,返回true。
6、操作数是NaN,返回true。
console.log(!true); //false
console.log(!false); //true
console.log(!""); //true
console.log(!undefined); //true
console.log(!NaN); //true
对于有两个逻辑非,首先将 操作数转换为布尔值,再将其取反。 也就是说第一个非运算将操作数转换成布尔值,第二个非运算再将其取反。
console.log(!!null); //返回false
逻辑与(&&)
逻辑与有两个操作数,它的规则如下:
1、如果第一个操作数是对象,返回第二个操作数。
2、如果第二个操作数是对象,在第一个操作数的求值结果是true的前提下,才会返回这个对象。
3、如果两个操作数均为对象,返回第一个操作数
4、如果第一个操作数是null,返回null。
5、如果第一个操作数是undefined,返回undefined。
6、如果第一个操作数是NaN,返回NaN。
逻辑与操作也称短路操作,即:当逻辑与 左边的结果为false时,逻辑与 右边的操作不行执行。
var a = false;
var b = 3;
var c = a && b++; //a为false,b++不会执行,直接将a赋值给c
console.log(c); //false
console.log(b); //3
如上,因为a的结果是false,所以c的结果直接为false,逻辑与右边的操作不会执行,即b不会递增,还是为3.
逻辑或(||)
逻辑或 左边的结果为true时,逻辑或右边的操作不会执行。
规则如下:
1、如果第一个操作数是对象,返回第一个对象。
2、如果第一个操作数的结果为false,返回第二个操作数。
3,如果第一个操作数是NaN,返回NaN。
4、如果第一个操作数是null,返回null。
5、如果第一个操作数是undefined,返回undefined。
6,如果两个操作数是对象,返回第一个操作数。
var a = true;
var b = 3;
var c = a || b++; //第一个操作数结果为true,第二个操作数就不会执行操作。仍然为3.
console.log(c);
console.log(b);
逻辑或 左边的结果为true时,逻辑或右边的操作不会执行,即不会执行b++这个操作,b的值仍然为3,
乘性操作符
乘性操作符包括:乘法(*)、除法(/)、求余(%)。
乘法(*)
乘法返回操作数的乘积。
注意:
无穷大与0相乘得NaN。
无穷大与无穷大相乘得无穷大。
如果有一个操作数是NaN,则结果为NaN。
除法(/)
注意:
0除以0得NaN。
有一个操作数为NaN,结果为NaN。
无穷大除以无穷大得NaN。
求余(%)
求余的规则与除法规则相似。
求余可以用于求个位、十位、百位、千位、万位等。
加性操作符
加性操作符包括加法、减法。
加法(+)
规则如下:
如果有一个操作数是NaN,则结果是NaN。
正无穷与正无穷相加,结果是正无穷。
负无穷与负无穷相加,结果是负无穷。
正无穷与负无穷相加,结果是NaN。
如果几个操作数是字符,则将两个字符拼接起来即可。
如果有一个操作数是字符,则需要将其它操作数转换为字符,再将它们拼接起来。
a、 如果其它的操作数是布尔值、对象、数值,则用它们的toString()方法将其转换为字符,再拼接。
b、如果操作数是undefined和null,则用String()方法转换为字符,再拼接。
减法(-)
规则:
如果有一个操作数是NaN,则结果是NaN。
正无穷与正无穷相减,结果是NaN。
负无穷与负无穷相减,结果是NaN。
正无穷与负无穷相减,结果是无穷大。
如果有一个操作数是布尔值、对象、数值、null、nudefined,则用Number()方法将其转换为数值,再根据前面的规则相减.
var a = 5 - true;//结果为4,true转换为1
var b = 5 - NaN;//结果为NaN
var c = 5 - "";//结果为5,空字符转换为0
var d = 5 - "4";//结果为1,"4"转换为4
var e = "" - 5;//结果为-5,空字符转换为0
关系操作符
关系操作数有:小于(<)、大于(>)、小于等于(<=)、大于等于(>=)。关系操作符,对比的结果就是一个布尔值(true或false)
规则:
如果操作数是数值,则执行数值大小对比。
如果两个操作数是字符,则比较字符对应的字符编码大小。
如果有一个操作数是数值,则将另一个操作数转换为数值,再对比大小。
如果两个操作数是布尔值,将布尔值转换为数值,再作比较。
var a = "abc";
var b = "Abc";
var c = 5;
var d = "a"
console.log(a > b); /* 返回true */
console.log(a < b); /* 返回false */
console.log(c > d); /* 字符a转换数值为NaN 返回false */
小写字母的字符编码比大写字母的字符编码大。
相等操作符
相等操作符也是一种比较操作,比较的是相等性,比较的结果是布尔值。
相等与不相等操作符:将转换再比较,全等与不全等操作符:仅比较不转换。
相等与不相等操作符
相等(==)不相等(!=)
相等:比较的是数值大小是否相等。
规则:
1、如果两个操作数是布尔,则需将布尔值转换为数值。
2、一个是数值,一个是字符,先将字符转换成数值,再比较相等性。
3、null与undefined是相等的,但不是全等的。
4、NaN与任何类型数据相比,均不相等。
5,如果两个操作数是对象,则比较是不是同一个对象,是不是指向同一个对象。
全等与不全等
全等(===)不全等(!==)
全等:数据类型相同,且数值大小相等。
例子
null == undefined; //返回true
null === undefined; //返回false
注:因为相等不相等操作符存在类型转换问题,为了保持代码的完整性,所以建议使用全等与不全等。
条件操作符
条件操作符: var e = a >b ? c : d
如果a > b结果为true,则将c赋值于e,若a > b 为false,则将d赋值于e。
条件操作符常用于求绝对值。
赋值操作符
赋值操作符:var a = b;
将"="右边的值赋值给左边的变量。
逗号操作符
逗号操作符一般在定义多个变量时使用,如:var a, b, c, d;
除了定义多个变量用逗号操作符外,有时赋值也可以用,不过这种情况少见。
逗号操作符赋值:会将表达式最后一项赋值于变量。
如:var a = (1, 2, 3, 4, 5);
以上会将5赋值给变量a.