表达式与运算符
表达式
- 表达式是一个值.或者说能计算得到的一个值
- 2*(2+2)
- a + b
- 3 > 2
- a = 2
- 以上都是表达式,表达式就是一个值
运算符
- 用于链接表达式,组成一个更加复杂的表达式
- 比如上方表达式中的 * + > = ( )
加法运算符
规则
- 在两个操作数都是数字的时候,会做加法运算
- 两个参数都是字符串或在有一个参数是字符串的情况下会把另外一个参数转换为字符串做字符串拼接
- 在参数有对象的情况下会调用其valueOf或toString
- 在只有一个字符串参数的时候会尝试将其转换为数字
- 在只有一个数字参数的时候返回其正数值
2 + 4 // 6
'2' + '4' // "24"
2 + '4' // "24"
let obj = {
a: 1,
valueOf: function() {
return 3
}
}
console.log(1 + obj) // 4
console.log(+'4') // 4 强制变为数字
- 当对象+数字时,对象会转化为字符串.
算数运算符
- 加法运算符(Addition):x + y
- 减法运算符(Subtraction): x - y
必须使用数字类型进行运算,否则会强制转换为数字NaN(是数字类型但不是数字).
- 乘法运算符(Multiplication): x * y
需要注意的是,如果x**y,意思是x^y指数运算. - 除法运算符(Division):x / y
- 余数运算符(Remainder):x % y
以上都只能是数字类型进行运算. - 自增运算符(Increment):++x 或者 x++
- 自减运算符(Decrement):–x 或者 x–
- 求负运算符(Negate):-x
会强制转换成数字. - 数值运算符(Convert to number): +x
- 会强制转换成数字.
-
++x
含义
含义
- 这是一个表达式(结果/值),x++是自增之前的结果,就是x. 这个结果x++=x,然后x=x+1.
比较运算符
- == 相等
- === 严格相等
1.对于相同的类型,浏览器会做一个相同的判断,但是对于不同类型,浏览器会做一个类型转换.得到一个近似相等的结果.
2.而对于严格相等,在比较值之外,还会比较类型.全部相等时才算相等. - !=不相等
- !== 严格不相等
- < 小于
- <= 小于或等于
-
大于
-
= 大于或等于
用表达式连接表达式.最终得到的值是true或false.
这样就可以根据rue或false,来做一个判断.
布尔运算符
用于取得true or falsu的结果
- !取反运算符
- 对于true or false.取反
- 对于其他的数据类型,会转换成布尔类型true or false再取反
- !!强制转换成布尔类型.
- $$且运算符
- ||或运算符
- 三元运算符condition? true case : false case
设置变量a,a大于85不?大于就输出1.小于就输出2.
会被转换为 false 的表达式有:
- null;
- NaN;
- 0;
- 空字符串("" or ‘’ or ``);
- undefined。
位运算符
- 或运算(or):符号为|,表示两个二进制位中有一个为1,则结果为1,否则为0。
- 与运算(and):符号为&,表示两个二进制位都为1,则结果为1,否则为0。
- 否运算(not):符号为~,表示将一个二进制位变成相反值。
- 异或运算(xor):符号为ˆ,表示两个二进制位中有且仅有一个为1时,结果为1,否则为0。
- 左移运算(left shift):符号为<<
- 右移运算(right shift):符号为>>
小括号
- 在JavaScript中,圆括号是一种运算符,它有两种用法:如果
把表达式放在圆括号之中,作用是求值;如果跟在函数的后面,
作用是调用函数。 - 把表达式放在圆括号之中,将返回表达式的值
void
返回一个underfined
逗号运算符
逗号运算符用于对两个表达式求值,并返回后一个表达式的
值
typeof
这也是一个运算符
运算符的结合性与优先级
当我们遇到一个运算符时,实际上它是有计算顺序的/
结合性
从左到右 or 从右到左
- a=b=1 赋值是从右到左
- a=3+2-5 加法或乘法从左到右.
优先级
谁的优先级高先处理谁
常见优先级
优先级从低到高
- 逗号(,) < 赋值(=) < 逻辑或(||) < 逻辑与(&&) < 相等判断(===) < 大小判断(>,<)< 加减 < 乘除 < typeof < 前置递减递增(++…) < 逻辑非(!..) < 后置递减递增
(…++) < new < 成员访问(x[y]或x.y) < 小括号
以下举例
typeof 2*3 //(typeof 2)*3=NaN
typeof 2+3 //(typeof 2)+3=number3
typeof (2+3) //NaN
let a = 2, b = 3
a+++b //(a++)+b=5
let c = d = 5 //从右往左计算
let x = (a = 1, b = 2) // 2赋值给x
let y = !!"Hello" + (!"world", !!"from here!!") //=true + true = 1+1 = 2
typeof typeof 2+3 //(typeof (typeof 2))+3=(typeof "number")+3=string3