JS优先级

运算符优先级与结合性

优先级什么意思大家都清楚,结合性是指多个具有同样优先级的运算符表达式中的运算顺序。有的运算符是左结合的,即运算从左到右执行,下面两个运算是一样的

w = x + y + z;
w = (x + y) + z;

有的运算符是右结合的

w = x = y = z;
w = (x = (y = z));
w = a: b: c ? d : e? f : g;
w = a? b : (c? d: (e? f : g));

运算符的优先级《JavaScript权威指南》中有个表阐述的很好(我去掉了位运算部分),其中R/L代表结合性是右结合还是左结合,num->num表示操作符期望的数据类型和计算结果类型,lval指左值

运算符操作结合性类型
++自增Rlval->num
--自减Rlval->num
-求反Rnum->num
+(一个操作数)转换为数字Rnum->num
~按位求反Rint->int
!逻辑非Rbool->bool
delete删除属性Rlval->bool
typeof检测数据类型Rany->str
void返回undefinedRany->undefined

*、/、%乘、除、求余Lnum,num->num

+、-加、减Lnum,num->num
+字符串拼接Lstr,str->str
<、<=、>、>=数字大小或字母表顺序Lnum/str,num/str->bool
instanceof对象类型Lobj,function->bool
in测试属性是否存在Lstr,obj->bool

==判断相等Lany,any->bool
!=判断不等Lany,any->bool
===判断恒等Lany,any->bool
!==判断非恒等Lany,any->bool

&&逻辑与Lany,any->any
||逻辑或Lany,any->any
?:条件运算符Rbool,any,any->any
=赋值 *=、/=、+=、-=赋值 运算且赋值Rlval,any->any
,忽略第一个操作数,返回第二个操作数Lany,any->any

MDN 参考

有几个我们需要注意的地方

  1. typeof的优先级相当的高,比加减乘除神马的都高,所以虽然是操作符,在在复杂表达式的时候我们还是习惯加括号,看个例子

     typeof 2*3;//NaN
     typeof (2*3);//"number"
     typeof 2+3;// "number3"
    
  2. ++--是右结合的操作符(优先级最高的几个都是右结合),而且比加减乘除优先级高。同时自增、自减运算符的运算数得是左值(可以放在赋值符号左边的值),而不能是常数

     4++; //ReferenceError: Invalid left-hand side expression in postfix operation
     var a=0,b=0;
     a+++b;//0
     a;//1,++优先级比+高,所以相当于(a++)+b
     b;//0
    
  3. 赋值运算符的优先级相当的低

     a = b == c; //等同于a = (b==c)
    
  4. 逻辑非!也在优先级队列的前端,比加减乘除高,但逻辑与、逻辑或优先级很低,不如加减乘除

     !2*0; //0, 等价于(!2)*0
    
  5. 一个关于逻辑运算符的有意思地方是其“短路”功能,相信大家都有所了解,但有些题目不那么单纯,会结合表达式计算值来考察

     1 && 3;
     1 && "foo" || 0;
     1 || "foo" && 0
    

了解了逻辑运算符的“短路”特点,在知道原始表达式的“返回值”就是本身,题目就很简单了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值