运算符
运算符优先级
1、成员访问:寻找对象里的属性名所对应的属性值就是成员访问(19)
Fn.aa
2、new(带参数列表):就是构造函数执行有括号(19)
3、new(无参数列表):就是构造函数执行没有括号(18)
优先级一样,从左到右运算
符号:&&、||、%、+=/-=、i++/i–、 ==/===、!/!!
- && 逻辑且 : && 左右两边都成立,这个条件成立
- 如果前边转布尔是true,那就取后边的,反之就取前边的。
let num = 1&&2;
console.log(num);//2
let num1 = 0&&1;
console.log(num1)//0
if(1=="1"&&2==="2"){
console.log(100)
}
- || : 或 只有左右两边一个成立的,整体结果就是true;
- 如果前边转布尔是false,就取后面的,反之就是前面的
let num = 1||2;
console.log(num);//1
let num1 = 0||1;//1
let num3 = 0&&1||1&&2;//2
if(1==true||2===3){
console.log(200)
}
-
% 在语句执行中,%代表取模,俗称取余数
-
+=/-=
- let num =2;
- num+=3 =>num=num+3
- console.log(num);
-
i++ : 在自身的基础上+1,正常运算;
- i++ : 先取值,后运算
- ++i : 先运算,后赋值
-
= : 赋值 先算等号右侧,再算等号左侧
-
== : 会进行比较,返回一个布尔值:会默认进行数据类型之间的转换
-
!= 不等
-
=== :全等,绝对比较;不进行数据类型转换,只要数据类型不一样,返回false
-
!== 绝对不等
-
[]获取变量只能用中括号
- 中括号法可以用变量作为属性名,而点方法不可以;
- 中括号法可以用数字作为属性名,而点语法不可以;
-
!/!!
- !:把其他数据类型先转布尔,然后取反
- !null//true
- !! 把其他数据类型转布尔,然后取反再取反
- !:把其他数据类型先转布尔,然后取反
ES2020
可选链操作符(Optional Chaining)
- 当检查嵌套对象内部的属性时,通常必须检查中间对象的存在。
- ES2020的可选链接运算符让我们可以新加一个?(可选链操作符语法?.),检查对象深处是否存在值。
- 不用像以前用&&去判断前一项是否存在或者部分情况用三元去判断。
const res = {
"result": true,
"message": "success",
"data": {
"id": 726,
"title": "你要努力的去生活,因为你只有努力了,才知道自己真的不行。",
"hits": 31,
"status": 1,
"user_id": 1 ,
"obj":{
"name":"zhainanya"
}
}
}
let a=res.data?.obj?.name;
//如果返回的对象中有data,就取res.data.obj,没有返回undefined
//如果data中有obj,就取res.data.obj.name,没有返回undefined
console.log(a);
空位合并运算符(Nullish coalescing Operator)
- 空位合并运算符是一个非常简单的名称,使我们能够检查一个值是否为null或undefined,如果是,则默认为另一个值,仅此而已。
- 转布尔为false是下面五种情况
- null
- undefined
- 空字符串 “”
- 0
- 没有数字-NaN
const result={
"result":true,
"message":"success",
"data":{
"a":0,
"b":"",
"c":null,
"d":undefined,
"e":NaN,
}
}
let b=result.data.a?result.data.a:"";
console.log(b);//想要0但是结果是""
let c=result.data.a??""
console.log(c);//0
let d=result.data.c??"";
console.log(d);//""
let f=result.data?.c??"";
console.log(f);//""
let e=result.data?.a??"";
console.log(e);//0
//如果result.data存在,就取result.data.a
// 如果result.data.a其值不为null或undefined,就取自身,反之取??后面的"""