JavaScripte运算符与优先级简述

什么是JavaScript

JavaScript中运算符主要用于连接简单表达式,组成一个复杂的表达式
一些运算符可以作用于任何数据类型typeof,但大部分操作符希望操作数是特定的类型,而且大部分操作符会计算出(我们也常说返回)一个特定类型的值(typeof返回的全是string

有些操作符对不同的数据类型有不同的含义,比如 +

  • 在两个操作数都是数字的时候,会做加法运算
    console.log(2+4);//6
  • 两个参数都是字符串或在有一个参数是字符串的情况下会把另外一个参数转换为字符串做字符串拼接
    console.log("2"+"4");//"24"
  • 在参数有对象的情况下会调用其valueOf或toString
    console.log(2+"4");//"24"
  • 在只有一个字符串参数的时候会尝试将其转换为数字
    console.log(2+new Date());//"2Mon Jan 20 2014 17:15:01 GMT+0800 (China Standard Time)"
  • 在只有一个数字参数的时候返回其正数值
    console.log(+"4");//4

JavaScript运算符有哪些种类

  • 算数运算符
  • 赋值运算符
  • 比较运算符
  • 布尔运算符
  • 位运算符
  • 逻辑运算符
  • 字符串运算符
  • 条件(三元)运算符
  • 逗号运算符
  • 一元运算符
  • 关系运算符

算数运算符

最基础用来计算的运算符号,也是我们最熟悉的

  • 加法运算符:x + y
  • 减法运算符:x - y
  • 乘法运算符:x * y
  • 除法运算符:x / y
  • 余数运算符:x % y
  • 自增运算符:++x 或者 x++
    其中++x代表x先自加1,然后赋值给x,再输出;x++表示先输出,然后x自加1,再赋值给x;++x的优先级大于x++
  • 自减运算符:--x 或者 x--
  • 求负运算符:-x
  • 数值运算符: +x

赋值运算符

赋值运算符用于给变量赋值,最常见的赋值运算符,当然就是等号,表达式x=y表示将y赋值给x。除此之外,JavaScript还提供其他11个赋值运算符

  • x += y 等同于 x = x + y
  • x -= y 等同于 x = x - y
  • x *= y 等同于 x = x * y
  • x /= y 等同于 x = x / y
  • x %= y 等同于 x = x % y
  • x >>= y 等同于 x = x >> y
  • x <<= y 等同于 x = x << y
  • x >>>= y 等同于 x = x >>> y
  • x &= y 等同于 x = x & y
  • x |= y 等同于 x = x | y
  • x ^= y 等同于 x = x ^ y

比较运算符

比较运算符比较两个值,然后返回一个布尔值,表示是否满足比较条件。JavaScript提供了8个比较运算符。

  • == 相等
  • === 严格相等
  • !=不相等
  • !== 严格不相等
  • < 小于
  • <= 小于或等于
  • > 大于
  • >= 大于或等于

布尔运算符

  • ! 取反运算符
  • && 且运算符
  • || 或运算符
  • condition? true case : false case 三元条件运算符

位运算符

  • 或运算:符号为|,表示两个二进制位中有一个为1,则结果为1,否则为0。
  • 与运算:符号为&,表示两个二进制位都为1,则结果为1,否则为0。
  • 否运算:符号为,表示将一个二进制位变成相反值。
  • 异或运算:符号为ˆ,表示两个二进制位中有且仅有一个为1时,结果为1,否则为0。
  • 左移运算:符号为<<
  • 右移运算:符号为>>
  • 带符号位的右移运算:符号为>>>

运算符优先级与结合性

优先级指的就是在多个运算符的情况下先使用哪个运算符生成一个表达式,跟我们数学的优先级类似。结合性是指多个具有同样优先级的运算符表达式中的运算顺序
有的运算符是左结合的,即运算从左到右执行

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

有的运算符是右结合的

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

具体运算符的优先级可以参考:
MDN 参考

有几个需要注意的地方

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

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

     4++; 
     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. 一个关于逻辑运算符的有意思地方是其“短路”功能,当左侧为true时,才会计算右操作数的值并且返回,如果左操作数本身值就为false,那么会直接返回左操作数的值,而且 与 的优先级大于 或

     1 && 3;//
     1 && "foo" || 0;//
     1 || "foo" && 0
    
    
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容