一元操作符
一元操作符是仅仅只操作一个值的操作符
1. 递增/递减操作符(++,--)
递增操作符有两种 a++和++a,两种操作符最后都会将值转换为 Number 类型,并加 1,区别就是 ++a 会在表达式中先将值+1 之后再进行表达式的计算,而 a++则会在表达式计算完毕之后再对值进行+1,不会影响到表达式的计算
let age1 = 29;
let age2 = 29;
let anotherAge1 = ++age1 + 2;
let anotherAge2 = age2++ + 2;
console.log(anotherAge1); // 32
console.log(anotherAge2); // 31
递减操作符有两种 a--和--a,两者区别同上
let age1 = 29;
let age2 = 29;
let anotherAge1 = --age1 + 2;
let anotherAge2 = age2-- + 2;
console.log(anotherAge1); // 30
console.log(anotherAge2); // 31
2. 一元加和减(+,-)
一元加减符分别是 +val 和 -val,+val 会将后面的 val 转换为 Number 类型,而-val 则是转换为 Number 类型之后再取其负值
let s1 = "01";
let s2 = "1.1";
let s3 = "z";
let b = false;
let f = 1.1;
let o = {
valueOf() {
return -1;
},
};
s1 = +s1; // 值变成数值 1
s2 = +s2; // 值变成数值 1.1
s3 = +s3; // 值变成 NaN
b = +b; // 值变成数值 0
f = +f; // 不变,还是 1.1
o = +o; // 值变成数值-1
let s1 = "01";
let s2 = "1.1";
let s3 = "z";
let b = false;
let f = 1.1;
let o = {
valueOf() {
return -1;
},
};
s1 = -s1; // 值变成数值-1
s2 = -s2; // 值变成数值-1.1
s3 = -s3; // 值变成 NaN
b = -b; // 值变成数值 0
f = -f; // 变成-1.1
o = -o; // 值变成数值 1
位操作符
个人感觉没啥用,不讲了
布尔操作符(!,&&,||)
逻辑非(!)
!val 会将 val 的值转换为 bool 类型,然后进行取反
console.log(!false); // true
console.log(!"blue"); // false
console.log(!0); // true
console.log(!NaN); // true
console.log(!""); // true
console.log(!12345); // false
所以我们日常可以使用 !!val 来将 val 的值直接给转换为 bool 类型
console.log(!!"blue"); // true
console.log(!!0); // false
console.log(!!NaN); // false
console.log(!!""); // false
console.log(!!12345); // true
逻辑与(&&)
val1&&val2 是逻辑与的方式,&&操作符会将两侧的表达式或者值都转换为 bool 类型,如果两侧的 val 都为 true 则返回 true,否则返回 false,&&操作符左侧如果为 false,则不会执行右侧的表达式,所以可以用来做逻辑中断,例如:obj&&obj.name,这样就可以防止 obj 为 undefined 的时候直接调用 obj.name 而产生报错
true && true; // true
true && false; //false
false && true; //false
false && false; //false
逻辑或(||)
val1||val2 是逻辑或的方式,||操作符会将两侧的表达式或者值都转换为 bool 类型,如果两侧的 val 都为 false 时才会返回 false,否则返回 true
true || true; // true
true || false; //true
false || true; //true
false || false; //false
布尔操作符(*,/,%)
这三个操作符会将表达式中的数组转换为 Number 类型,然后进行操作
let result1 = 2 * 3; //6
let result2 = 66 / 11; //6
let result = 26 % 5; // 等于 1
指数操作符(**)
主要用来代替 Math.pow(),其右边的值就是左边的值的次方
console.log(Math.pow(3, 2); // 9
console.log(3 ** 2); // 9
console.log(Math.pow(16, 0.5); // 4
console.log(16** 0.5); // 4
加性操作符(+)
此操作符会根据他所在的表达式从而进行不同的转换,倘若两边的值都是数字,则会进行数字的相加,但如果有一边是字符串,则会将两侧的值都转换为字符串,从而进行拼接
let result1 = 5 - true; // true 被转换为 1,所以结果是 4
let result2 = NaN - 1; // NaN
let result3 = 5 - 3; // 2
let result4 = 5 - ""; // ""被转换为 0,所以结果是 5
let result5 = 5 - "2"; // "2"被转换为 2,所以结果是 3
let result6 = 5 - null; // null 被转换为 0,所以结果是 5
关系操作符(<,<=,>,>=)
一般情况下,会将两侧的值都转换为 Number 类型再进行相比较
let result1 = 5 > 3; // true
let result2 = 5 < 3; // false
但也有特殊情况需要注意,比如两侧如果是字符串,则会比较两侧值首字母的编码值,由于大小写对应不同的编码值,所以会出现下面这种情况
let result = "Brick" < "alphabet"; // true
还有一种特殊情况,如果有一边的值为 NaN 的话,则直接返回 false。
let result = "a" < 3; // 因为"a"会转换为 NaN,所以结果是 false
相等操作符(==,!=,===,!==)
== 是和===都是判断两个值是否相等,但是==会先将两边的值进行转换,转换成同类型,然后再比较他们的值,但是===需要两个值不仅值一样,类型也要一样,并不会对值进行转换,如果是对象的话,则会比较其内存地址
let result2 = "55" === 55; // false,不相等,因为数据类型不同
NaN 不等于 NaN,因为官方文档说的
NaN === NaN; //false
条件操作符(?:)
三元表达式,会将?左侧的值转换为 bool 类型,如果为真,则返回:左侧的值,为 false 就返回右侧的值
let max = num1 > num2 ? num1 : num2;
赋值操作符(=)
将=右侧的值赋给左侧
- 乘后赋值(*=)
- 除后赋值(/=)
- 取模后赋值(%=)
- 加后赋值(+=)
- 减后赋值(-=)
- 左移后赋值(<<=)
- 右移后赋值(>>=)
- 无符号右移后赋值(>>>=)
逗号操作符(,)
逗号操作符可以用来在一条语句中执行多个操作,如下所示:
let num1 = 1,
num2 = 2,
num3 = 3;
在一条语句中同时声明多个变量是逗号操作符最常用的场景。不过,也可以使用逗号操作符来辅助 赋值。在赋值时使用逗号操作符分隔值,最终会返回表达式中最后一个值:
let num = (5, 1, 4, 8, 0); // num 的值为 0