当前位置: 首页 > Web前端 > JavaScript

运算符:索引-链式判断-空判断-逻辑赋值

时间:2023-03-27 16:25:43 JavaScript

指数运算符//2*2console.log(2**2);//4//2*2*2*2console.log(2**4);//16个指数运算符是右结合的,当多个指数运算符一起使用时,从右开始计算。控制台日志(2**3**2);//512//2**(3**2)//2**9//2*2*2*2*2*2*2*2*2指数运算符可以与等号结合使用成为赋值运算符**=leta=2a**=4console.log(a)//这里的16相当于a=2**一段中的4个链式判断运算符在业务逻辑中,往往需要获取a对象中的某些属性。该属性在某些场景下可能不存在,需要判断。在读取对象的深层属性时,需要层层判断安全的写法,避免报错。letdata={user:{goods:{num:100}}}错误的写法:不安全,因为直接读取对象的深层值,如果前面的值(user,goods)不存在,会报错。//错误的写法:unsafeletnum=data.user.goods.num||0正确的写法:逐层判断,如果其中一个链接不存在,则立即返回//正确的写法,逐层判断,数据存在,data.user存在....有不存在,返回0letnum2=data&&data.user&&data.user.goods&&data.user.goods.num||0console.log(num2);//100三个元表达式:正确写法,逐层判断,直到找到最后一层letnum3=data?数据.用户?数据.用户.商品?data.user.goods.num?data.user.goods.num:0:'还没有产品':'用户不存在':[]console.log(num3);//100但是这种写法很麻烦,需要逐层判断,所以es2020引入了“链式判断运算符”。链式判断运算符:语法:?。链式判断运算符用来简化上面的写法,如果其中一个不满足,则返回右边的值letnum4=data?.user?.goods?.num||0console.log(num4);//100个链判断运算符可以判断对象中的函数是否存在,存在则立即执行,不存在则返回undefinedletdata2={chains(){return'exists'}}console.log(data2.chains?.());//存在console.log(data2.chains2?.());//undefined注意:普通函数不能用链式判断运算符判断。如果不存在,直接报错functionchains(){return'Exist'}console.log(chains?.());//存在//console.log(chains2?.());//错误链判断运算符有几种使用方式letw='hello'letdata3={[w]:'world',//表达式键名:"东方无敌",//公共属性sayHi(){return'hello'}//对象内部的函数}console.log(data3?.[w]||'default');//worldconsole.log(data3?.name||'default');//东方无敌console.log(data3.sayHi?.());//helloconsole.log(data3.sayHi2?.());//undefinedconsole.log(data3?.sayHi?.());//hello链判断运算符其实有一个短路机制,如果不满足条件就终止执行。以下场合使用链式判断算子报错:1.构造函数2.链式判断算子右边有模板字符串3.链式判断算子左边是super4,链式判断算子是用在赋值运算符左边//构造函数报错newa?.()//右边有一个模板字符串a?.`${w}`//Supersuper?.()ontheleftside//Assignmenta?.b=100ontherightside注意:chain运算符右边如果是数字,则无效,会被解析为三元运算符。它将被解析为小数点letnum5={1:100}console.log(.123);//0.123console.log(num5?.1:undefined);//这实际上被解析为num5?.1:未定义,成为三元运算符。Null判断运算符在读取对象属性时判断属性是否存在。如果当属性的值为null或undefined时,给属性一个默认值。一个常见的做法是使用||运算符判断是否存在,不存在则返回右边的值。||运算符有隐式转换,0、null、undefined、空字符串都会被转换为falseletn={user:'东方无敌',status:0}letu=n.user||'用户不存在'让u2=n.user2||'用户不存在'console.log(u);//东方不败console.log(u2);//用户不存在letu3=n.status||'不存在'console.log(u3);//不存在的||运算符更适合判断一个属性是否为假(false),而不是null,undefineddes2020提供了一个新的null判断运算符,语法:??它的行为与||相同运算符基本相同,唯一不同的是没有隐式转换,只有当左边的值为null或undefined时才返回右边的值。letjudge={user:"东方无敌",num:0,status:false,em:null}letback=judge.user??'不存在'让back2=judge.num??'不存在'让back3=judge.status??'不存在'让back4=judge.em??'不存在'console.log(back);//东方无敌console.log(back2);//0console.log(back3);//falseconsole.log(back4);//没有多个逻辑运算符一起使用,必须用括号表示优先级,否则会报错//Errora&&b??CA??b&&ca||??CA??b||c//正确写法,加括号表示优先级(a&&b)??c;a&&(b??c);(a??b)&&c;a??(b&&c);(a||b)??c;一个||(b??c);(a??b)||c;一个??(b||c);逻辑赋值运算符es2021引入了三个逻辑赋值运算符,结合了逻辑运算符和赋值运算符letx=0lety=5letz=x||=yletz2=x??=yletz3=x&&=yconsole.log(z);//5console.log(z2);//5console.log(z3);//5console.log(x);//5其实这个逻辑赋值运算符和逻辑运算符是一样的,只是看起来更直观逻辑运算符:如果左边的值不存在,就把右边的值赋给对象逻辑赋值运算符:如果左边的值不存在,则右边的值等于左边的值,将左边的值赋给对象注意:逻辑赋值运算符会改变赋值的原值。在上面的例子中,右边的y赋给了左边的x,左边的x=5,所以下面的??运算符判断x=5,导致and右边的y逻辑赋值运算没有用到。让b=0让m=5让f=b??=mconsole.log(f);//0案例源码:https://gitee.com/wang_fan_w/es6-science-institute如果觉得本文对您有帮助,欢迎点亮star