操作符
一元操作符
只可以操作一个表达式的操作符
一元加
一元加操作符,将要操作的数据类型转化为数字。所有数据类型都可以转换为数字
+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
优先级
属性访问 > 一元操作符 > 乘除 > 加减 > 比较 > 相等=== == !=== !== > 与运算>或运算>三木元算>赋值运算
- 属性访问表达式有最高优先级 .[]
- 赋值操作 =最低优先级,赋值操作
- 运算当中 ,一元运算符最高
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