1、赋值运算符
赋值运算符为=,如var value = 9,表示把9赋值给value,多个变量赋值:var a = 1,b = 2,c = 3。
赋值符和算术运算符的简写:a = a + 2,简写:a += 2,例子如下:
var value_01 = 9,
value_02 = 8,
value_03 = 7;
console.log(value_01);
console.log(value_02);
console.log(value_03);
value_01 += 1; // 等价于 value_01 = value_01 + 1;
value_02 -= 2; // 等价于 value_01 = value_01 - 2;
value_03 *= 2; // 等价于 value_01 = value_01 * 2;
console.log(value_01);
console.log(value_02);
console.log(value_03);
value_01 /= 2; // 等价于 value_01 = value_01 / 2;
console.log(value_01);
2、算术运算符
算术元算符有:+,-,*,/,表示加减乘除,%为取余元算符。
infinity表示无穷大,即数值结构超出了ECMAScript的限制,NaN属于数值类型,但是它的值不是一个数值,什么意思呢?比如:
var number = "spring";
console.log(+number); // 输出:NaN
+number表示将字符串number转换成数值类型,等同于Number(number),所以此时+number是数值类型的数据,但是它的值不能用数值表示,所以是NaN(Not a Number)。
在算术操作中,需要注意和infinity、NaN和0的运算,任何带有NaN的运算结构都是NaN,因为它不是一个数值,自然也不会有数值的结果,infinity又可分为正无穷和负无穷,不过它的意思也不是无穷,只是ECMAScript的规范里无法再表示出来了,例如infinity与非0数相乘结果是infinity,infinity与0相乘结果是NaN,不过infinity和NaN一般我们不会主动去使用的,除非是出现异常,因为这两个值没什么意义,尽量都是避免得出这样的结果。
自增运算符为++,–,又可分为前加和后加,如a++和++a,它们的区别在于,若参与表达式计算,a++先计算表达式再将a+1,++a表示先将a+1再进行表达式计算,例如:
var index = 100;
var current = (index++) + 1;
console.log(current); // 输出:101
console.log(index); // 输出:101
current = (++index) + 1;
console.log(current); // 输出:103
JavaScript中加法还可以连接字符串,例如var a = 1 + “22”表示字符串连接,a为“122”。
3、位操作符
位操作符一般平时比较少用,但是如果你需要写出更好的算法位操作必不可少,位运算比普通的加减乘除更快,另外例如在图片处理中也会用到。
位操作主要是基于计算机二进制进行操作的,例如1010,十进制为10。
位操作符有:
符号 | 描述 | 运算规则 |
& | 与 | 两个位都为1时,结果为1 |
| | 或 | 两个位都为0时,结果为0 |
^ | 异或 | 两个位相同为0,相异为1 |
~ | 取反 | 0变1,1变0 |
<< | 左移 | 各二进位全部左移若干位,高位丢弃,低位补0 |
>> | 右移 | 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移) |
例子:
// RGB十六进制颜色值
var color = 0xffab9d;
var red = color >> 16;
var green = (color >> 8) & 0xff;
var blue = color & 0xff;
console.log(red.toString(16)); // => ff
console.log(green.toString(16)); // => ab
console.log(blue.toString(16)); // => 9d
4、关系运算符
关系运算符返回的结构都是boolean类型,true或false,元算符有>大于,<小于,==等于,大于或等于>=,小于或等于<=,!=不等于,例如:
if(index < 1)
console.log("index < 1");
else if(index > 2)
console.log("index > 2");
else if(index == 100)
console.log("index == 100");
else
console.log("undefined");
关系元算符实质是对两个操作数进行数值比较,如果两个数是字符串,则比较两个字符串对于的ASCII编码值,如果操作数是对象,则调用valueOf()方法按照数值或字符串的比较方式比较,如果没有valueOf,则调用toString()方法执行同样的比较逻辑,如果两个数是布尔值,true转为1,false转为0进行比较。
5、逻辑运算符
逻辑与:&&,表示两边的结果同时为真结果为真,否则为假false。
逻辑或:||,表示两边的结果只要有一个为真则结果为真。
逻辑非:!,表示取反操作,!true结果为false。
&&短路运算符:返回第一个假的值或最后一个真值,例如3&&0&&null的结果为false。
||短路运算符:返回第一个真值或最后一个假值,例如null||undefined||1,结果为true。
三目条件运算符:?:,例如var result = index>2 ? 4 : 9,意思是计算index>2,如果index大于2,则result等于4,否则result等于9,例子:
var result;
if(index > 99)
result = 78;
else
result = 89;
// 等同于:
result = index > 99 ? 78 : 89;
console.log(result);
6、逗号运算符
逗号运算符一般有两种使用情况,第一个中是声明变量的时候可以多次声明多个变量,例如:var a,b,c。
另一种使用方式是赋值操作中,仅仅使用最后一个值,例如a = (2,3,4),仅a的结果是4。
7、运算符优先级
(1)结合性:
从右向左结合:一元运算符+-,后置++,后置–,!求反,(+-*/%)=,赋值=,typeof等,都是从右向左结合的,其它都是从左向右结合。
(2)下面是JavaScript的运算符优先级从高到低排列:
优先级 | 运算类型 | 关联性 | 运算符 |
20 | 圆括号 | n/a | ( … ) |
19 | 成员访问 | 从左到右 | … . … |
需计算的成员访问 | 从左到右 | … [ … ] | |
new (带参数列表) | n/a |
new … ( … ) |
|
函数调用 | 从左到右 |
… ( … ) |
|
18 | new (无参数列表) | 从右到左 | new … |
17 | 后置递增(运算符在后) |
n/a |
… ++ |
后置递减(运算符在后) | … — | ||
16 | 逻辑非 | 从右到左 | ! … |
按位非 | ~ … | ||
一元加法 | + … | ||
一元减法 | – … | ||
前置递增 | ++ … | ||
前置递减 | — … | ||
typeof | typeof … | ||
void | void … | ||
delete | delete … | ||
await | await … | ||
15 | 幂 | 从右到左 | … ** … |
14 | 乘法 |
从左到右 |
… * … |
除法 |
… / … |
||
取模 |
… % … |
||
13 | 加法 |
从左到右 |
… + … |
减法 |
… – … |
||
12 | 按位左移 | 从左到右 |
… << … |
按位右移 |
… >> … |
||
无符号右移 |
… >>> … |
||
11 | 小于 | 从左到右 |
… < … |
小于等于 |
… <= … |
||
大于 |
… > … |
||
大于等于 |
… >= … |
||
in |
… in … |
||
instanceof |
… instanceof … |
||
10 | 等号 |
从左到右 |
… == … |
非等号 |
… != … |
||
全等号 |
… === … |
||
非全等号 |
… !== … |
||
9 | 按位与 | 从左到右 |
… & … |
8 | 按位异或 | 从左到右 |
… ^ … |
7 | 按位或 | 从左到右 |
… | … |
6 | 逻辑与 | 从左到右 |
… && … |
5 | 逻辑或 | 从左到右 |
… || … |
4 | 条件运算符 | 从右到左 |
… ? … : … |
3 | 赋值 | 从右到左 |
… = … |
… += … |
|||
… -= … |
|||
… *= … |
|||
… /= … |
|||
… %= … |
|||
… <<= … |
|||
… >>= … | |||
… >>>= … |
|||
… &= … |
|||
… ^= … |
|||
… |= … |
|||
2 | yield | 从右到左 | yield … |
yield* | yield* … | ||
1 | 展开运算符 | n/a | … … |
0 | 逗号 | 从左到右 |
… , … |