一、运算符
运算符也称为操作符,它是完成一系列操作的符号。运算符用于将一个或几个值进行计算而生成一个新的值,对其进行计算的值称为操作数,操作数可以是常量或变量。
JS 中的运算符按操作的 个数 可以分为 单目运算符、双目运算符 和 三目运算符。按操作的 功能 可以分为 算术运算符、自增自减运算符、比较运算符、赋值运算符、字符串运算符、逻辑运算符、条件运算符 和 其它运算符;
二、算术运算符
算术运算符用于在程序中进行 加、减、乘、除、取余等运算。
算术运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
+ | 加运算符 | 1 + 2 | 3 |
- | 减运算符 | 5 - 2 | 3 |
* | 乘运算符 | 2 * 3 | 6 |
/ | 除运算符 | 3 / 2 | 1.5 |
% | 求模运算符 | 3 % 2 | 1 |
** | 幂运算 | 2 ** 3 | 8 |
let a = 1 + 2;
console.log(a);
a = 5 -2;
console.log(a);
a = 2 * 3;
console.log(a);
a = 3 / 2;
console.log(a);
a = 3 % 2;
console.log(a);
a = 2 ** 3;
console.log(a);
// 3 - '1' --> 3 -1
a = 3 - '1';
console.log(a);
// 3 + true --> 3 + 1
a = 3 + true;
console.log(a);
// 3 + null --> 3 + 0
a = 3 + null;
console.log(a);
// 3 + undefined --> 3 + NaN
a = 3 + undefined;
console.log(a);
a = 3 + '2';
console.log(a);
console.log(typeof a);
JS 是一门弱类型语言,当进行运算时会通过自动的类型转换类完成运算;
算数运算时,除了字符串的加法,其它运算的操作数是非数值时,都会转换为数值,然后再进行运算;
当任意一个值和字符串做加法运算时,它会将它值转换为字符串,然后再做拼串操作;
三、自增自减运算符
++ 和 -- 即可以放在变量的前面,也可以放在变量的后面;++ 和 -- 无论是放在变量的前面还是后面,单独写一行的结果是一样;如果 前++ 和 前-- 参与运算的话,那 先用后加(减) ;如果 后++ 和 后-- 参与运算的话,那 先加(减)后用 ;
自增自减运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
++ | 变量的值加1 | a = 2; b = ++a; a = 2;b = a++; |
a = 3; b = 3; a = 3; b = 2; |
-- | 变量的值减1 | a = 2; b = --a; a = 2; b = a--; |
a = 1; b = 1; a = 1; b = 2; |
let a = 2;
let b = 2;
b = a++;
console.log('b = a++:');
console.log('a = ' + a);
console.log('b = ' + b);
a = 2;
b = 2;
b = ++a;
console.log('b = ++a:');
console.log('a = ' + a);
console.log('b = ' + b);
a = 2;
b = 2;
b = a--;
console.log('b = a--:');
console.log('a = ' + a);
console.log('b = ' + b);
a = 2;
b = 2;
b = --a;
console.log('b = --a:');
console.log('a = ' + a);
console.log('b = ' + b);
四、赋值运算符
赋值运算符用来将一个值赋值给一个变量,是把右侧的值赋值给左边的变量。
赋值运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
= | 将右边表达式的值赋值给左边的变量 | a = 3 | 将 3 赋值给变量a |
+= | 将运算符左边的变量加上右边表达式的值赋值给左边的变量 | a += b | 将 a + b 的值给 a |
-= | 将运算符左边的变量减去右边表达式的值赋值给左边的变量 | a -= b | 将 a - b 的值给 a |
*= | 将运算符左边的变量乘以右边表达式的值赋值给左边的变量 | a *= b | 将 a * b 的值给 a |
/= | 将运算符左边的变量除以右边表达式的值赋值给左边的变量 | a /= b | 将 a / b 的值给 a |
%= | 将运算符左边的变量用右边表达式的值求模,并将结果赋值给左边的变量 | a %= b | 将 a % b 的值给 a |
**= | 将运算符左边的变量用右边表达式的值进行幂运算,并将结果赋值给左边的变量 | a **= b | 将 a ** b 的值给 a |
??= | 只有当变量的值为 null 或 undefined 时,才会赋值成功 | a ??= 100 | 如果 a 的值为 null 或 undefined,则 a = 100; 否则 a 为原来的值; |
let a = 3;
let b = 2;
console.log('a = ' + a);
console.log('b = ' + b);
a = 3;
a += b;
console.log('a += b: ' + a);
a = 3;
a -= b;
console.log('a -= b: ' + a);
a = 3;
a *= b;
console.log('a *= b: ' + a);
a = 3;
a /= b;
console.log('a /= b: ' + a);
a = 3;
a %= b;
console.log('a %= b: ' + a);
a = 3;
a **= b;
console.log('a **= b: ' + a);
a = 3;
a ??= 100;
console.log('a 不为 null 或 undefined 时,a ??= b: ' + a);
a = null;
a ??= 100;
console.log('a 为 null 或 undefined 时,a ??= b: ' + a);
五、一元运算符
一元运算符 | 描述 | 示例 |
---|---|---|
+ | 不会改变数值的符号 | +a |
- | 可以对数值进行符号取反 | -a |
let a = 10;
let b = +a;
console.log(b);
b = -a;
console.log(b);
b = '123';
b = +b;
console.log(b);
当我们对非数值类型进行正负运算时,会先将其转换为数值然后再运算;
五、关系运算符
关系运算符 也被称为 比较运算符;关系运算符的结果都是 boolean 型,其结果要么是 true 要么是 false;
关系运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
< | 小于 | 3 < '5' | true |
> | 大于 | 3 > '5' | false |
<= | 小于等于 | 3 <= '5' | true |
>= | 大于等于 | 3 >= '5' | false |
== | 等于,只根据表面值进行判断,不涉及数据类型 | 3 == '3' | true |
=== | 绝对等于,根据表面值和数据类型同时进行判断 | 3 === '3' | false |
!= | 不等于,只根据表面值进行判断,不涉及数据类型 | 3 != '3' | false |
!== | 不绝对等于,根据表面值和数据类型同时进行判断 | 3 !== '3' | true |
console.log('3 < "5": ' + (3 < '5'));
console.log('3 > "5": ' + (3 > '5'));
console.log('3 <= "5": ' + (3 <= '5'));
console.log('3 >= "5": ' + (3 >= '5'));
console.log('3 == "3": ' + (3 == '3'));
console.log('3 === "3": ' + (3 === '3'));
console.log('3 != "3": ' + (3 != '3'));
console.log('3 !== "3": ' + (3 !== '3'));
console.log('"abc" < "b": ' + ('abc' < 'b'));
console.log('"12" < "2": ' + ('12' < '2'));
// null和undefined进行相等比较时返回true
console.log('null == undefined: ' + (null == undefined));
console.log('null === undefined: ' + (null === undefined));
// NaN不和任何值相等,包括它自身
console.log('NaN == NaN:' + (NaN == NaN));
当对非数值进行关系运算时,它会先将其转换为数值,然后再比较;
当关系运算符的两端都是字符串时,它不会将字符串转换为数字,而是逐位的比较字符的 Unicode编码。
使用相等运算符(==)比较两个不同类型的值时,它会将其转换为相同的类型(通常转换为数值),然后再比较类型转换之后值相同也会返回 true;
null 和 undefined 进行相等比较时返回 true;
NaN 不和任何值相等,包括它自身;
全等运算符(===)用来比较两个值是否全等,它不会进行自动的类型转换,如果两个值的类型不同直接返回 false;
六、逻辑运算符
逻辑运算符 | 描述 | 示例 |
---|---|---|
&& | 逻辑与,当运算符左右两边表达式都为真时,结果为真 | a && b |
|| | 逻辑或,只要运算符任意一边的表达式为真,结果为真 | a|| b |
! | 逻辑非,对表达式的结果取反 | !a |
// 逻辑与,当运算符左右两边表达式都为真时,结果为真
console.log('true && true: ' + (true && true));
console.log('true && false: ' + (true && false));
console.log('false && true: ' + (false && true));
console.log('false && false: ' + (false && false));
// 逻辑或,只要运算符任意一边的表达式为真,结果为真
console.log('true || true: ' + (true || true));
console.log('true || false: ' + (true || false));
console.log('false || true: ' + (false || true));
console.log('false || false: ' + (false || false));
// 逻辑非,对表达式的结果取反
console.log('!true: ' + (!true));
console.log('!false: ' + (!false));
// 短路与
let a = 3;
false && (--a);
console.log(a);
// 短路或
a = 3;
true || (++a);
console.log(a);
// 对非布尔值进行逻辑与
let result = 1 && 2;
console.log(result);
result = 1 && 0;
console.log(result);
result = 0 && NaN;
console.log(result);
// 对非布尔值进行逻辑或
result = 1 || 2;
console.log(result);
result = 'hello' || NaN;
console.log(result);
result = NaN || 1;
console.log(result);
如果对一个非布尔值进行取反,它会先将其转换为布尔值然后取反;
与运算是短路的与,如果第一个值为 false,则不看第二个值;
与运算是找 false 的,如果找到 false 则直接返回,没有 false 才会返回 true;
对非布尔值进行与运算,它会转换成布尔值然后运算,但是最终返回原值;如果第一个值为 false,则直接返回第一个值,否则,返回第二个值;
或运算也是短路的或,如果第一个值为 true,则不看第二个值;
对于非布尔值进行或运算,它会转换成布尔值然后运算,但是最终返回原址;如果第一个值为 true,则直接返回第一个值,否则,返回第二个值;
七、条件运算符
- 格式:
- 条件表达式 ? 表达式1 : 表达式2
- 执行顺序
- 条件表达式在执行时,会先对条件表达式进行求值判断:
- 如果结果为 true,则执行表达式1;
- 如果结果为 false,则执行表达式2;
- 条件表达式在执行时,会先对条件表达式进行求值判断:
let a = 10;
let b = 20;
a > b ? alert('a > b') : alert('a < b');
八、运算符的优先级
我们可以使用小括号来提升运算符的优先级;
优先级 | 运算符 |
---|---|
1 | .、[]、() |
2 | ++、--、-、!、deelete、new、typeof、void |
3 | *、/、% |
4 | +、- |
5 | <<、>>、>>> |
6 | <、>、<=、>=、in、instanceof |
7 | ==、!=、===、!=== |
8 | & |
9 | ^ |
11 | | |
12 | && |
13 | || |
14 | ? : |
15 | = |
16 | *=、/=、%=、+=、-=、<<=、>>=、>>>=、&=、^=、|= |
17 | , |