操作符

一元操作符

只可以操作一个表达式的操作符

一元加

一元加操作符,将要操作的数据类型转化为数字。所有数据类型都可以转换为数字

+1 //1 对数字操作返回数字
+-1 // -1 对数字返回数字本身
+true // 1 对布尔操作返回 0,1
+null  //0
+undefined //NaN
+'12qweqw' //NaN 对字符串操作不能转化数字返回 NaN
+'123' //123  字符串可以返回数字的返回数字
+object // NaN 或 数字
//一元加操作符,将要操作的数据类型转化为数字。

一元减

先进行一元加操作,将要操作的表达式转化为数字,然后再将它转化为负数

var b= false
b=-b //-0
0 === -0 //true js中0 和-0相等

递增和递减操作符 ++ --

同一元操作符一样,先将要操作的表达式返回值转化为数字,然后进行加减1操作。

前置型 :在js的解释器中,首先对表达式进行加/减1的操作,然后再参与运算。

后置型:先把整个表达式参与完运算,然后再把表达式进行加/减1操作。

var num1 = 2;
var num2 = 20;
var num3 = --num1 + num2; // 等于 21
var num4 = num1 + num2; // 等于 21
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2; // 等于 22
var num4 = num1 + num2; // 等于 21

如果表达式返回的不是数字进行递增递减操作符返回NaN

副效应

执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的。

var a=1 
var b=a+++a
// a:2, b:3
//1. js先运算b这个表达式返回b,遵循运算顺序从左向右原则
//2. a++ 再暂时称为C 因是后置型C返回结果为1,此时变量a变成了2
//3. c+a 为1 + 2  返回给b 就是3了
a=1 
b=(a++)+a
// a:2, b:3

var a=1;
var b=a++ + ++a
  • 优先级

    属性访问 > 一元操作符 > 乘除 > 加减 > 比较 > 相等=== == !=== !== > 与运算>或运算>三木元算>赋值运算

    1. 属性访问表达式有最高优先级 .[]
    2. 赋值操作 =最低优先级,赋值操作
    3. 运算当中 ,一元运算符最高
    var a=3
    ++a == 3  //false
    
  • 结合性

    相同优先级同时存在时先算那个?如乘除

    左结合:其他

    右结合:一元操作符,三元运算符 ,赋值运算符

    !a++ //false  ++ 和! 都是一元操作符所有从右向左
    x=a?b:c?d!:e?f:g //三目运算符  
    x=a?b:(c?d:(e?f:g)) // 都是三目操作符从右向左
    a=b=c=d //赋值操作符从右向左
    
  • 运算顺序

    表达式中包含子表达式时如何运算?

    永远从左向右运行

  • 注意

    • 一元加/减 和递加/减 操作符对所有的数据类型都有效,都是先把数据类型转为number然后再操作

    • 递减操作可能会不精确

      var f = 1.1;
      f--; // 值变成 0.10000000000000009(由于浮点舍入错误所致)
      

按位非(NOT) ~

var num1 = 25; // 二进制 00000000000000000000000000011001
var num2 = ~num1; // 二进制 11111111111111111111111111100110
alert(num2); // -26

将数字转化为负数,然后减一

逻辑非

逻辑非操作符由一个叹号(!)表示。

先将数据类型转化为布尔类型,然后取反。

将其他类型转化为布尔类型用 (!!)

对象转化为布尔类型都是true

在js中只有6个类型进行逻辑非会转化为true:

undefines null NaN 0 -0 “”

其他一元操作符 (单词形式操作符)

  • typeof 返回后面表达式的操作类型

    typeof() 不是函数,()是为了先计算()内部的表达式

    ()的优先级跟,属性访问表达式.[] 是同级别的。

  • void 返回undefined

  • delete 删除属性


二元操作符

instanceof

on