运算符
用于连接简单表达式,组成一个复杂的表达式。
‘+’号
- 两个操作数都是数字,会做加法运算
- 两个参数都是字符串或有一个参数是字符串,做字符串拼接
- 在参数有对象的情况下,会调用其valueof或toString
obj={a:1,b:2}
obj+3//'[object object]3',先调用obj.toString()得出[object object]再和3相加
obj={a:1,b:2 valueof:function(){return 100}}//obj+3得出103,调用valueof的方法
- 在只有一个字符串参数时,会尝试将其装换为数字
+'4'//4
+true//1
+false//1
+'ac'//NaN
+new Date()//1482648206084
除法
x/y
余数
x%y 100/3等于1
a=345,b=22
parseInt(a/b)//商
a%b//余数
自增
++x或者x++
a=100,b=a++
console.log(a,b)//a=101,b=100先赋值再相加
c=100,d=++c
console.log(d,c)//d=101,c=101,先加再赋值
求负运算符
-x为求负运算符
+x为数值运算符
赋值运算符
用于给变量赋值,最常见的是等号,x=y就是将y父赋值给x
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
比较运算符
比较两个值,返回一个布尔值,表示是否满足比较条件
==
===
!=//不相等
!==//严格不相等
<
>
>=
布尔(逻辑)运算符
!//取反
&&//且
||//或
!''//!就是将后面的强调转换布尔值再取反
!!//就是将后面强制转换为布尔类型
condition?true case:false case//三元条件运算符
其他
小括号
如果把表达式放在圆括号之中,作用是求值。
如果跟在函数的后面,作用是调用函数
(1+1)//2
function(){}//报错如果(function(){})当做表达式
void
作用是执行一个表达式返回undefined
void(1+2)//undefined
function fn(){
var undefined=3;
var a;
if(a===undefined){
console.log('===')
}else{
console.log('!==')
}
}//fn() !==当把undefined赋值了就不能做判断了,方法就是a===voido
逗号运算符
用于对两个表达式求值,并返回后一个表达式的值。
3,4//4
a=(3,4)//4,括号表示求表达式的值
a=3,4//等号的优先级高,a就等于3
var a=1,
b=2//等同于var a=1;var b=1;
运算符优先级与结合性
- typeof的优先级相当高
typeof 2*3//(typeof 2)*3等于NaN
- ++,--是右结合的操作符,比加减乘除的优先级高
4++(不能这样写)
var a=0,b=0
a+++b//0
(a++)+b//0
- 赋值运算符的优先级相当低
a=b==c//等同于a=(b==c) - 逻辑非!也在优先级队列的前端比加减乘除高,但逻辑与,逻辑或优先级很低,不如加减乘除。
!2*0//0等价于(!2)*0
- 一个关于逻辑运算符有意思的地方是“短路功能,会结合表达式计算值来考察,了解了逻辑运算父母的“短路特点”,在知道原始表达式的“返回值”就是本身,题目就很简单了。
“短路”:false&&(anything)计算结果为false;
true||(anything)计算结果为true; - ==与=的区别
=是右结合;==的优先级高于=;0==false;''==false;
使用==的时候,js会帮助我们做类型转换,造成一些匪夷所思的结果,那么使用==的时候会在哪些情况下做类型转换又会换成什么样子?
如果两个值类型相同,则执行严格相等的运算。
如果两个值的类型不同:
如果一个是null,一个是undefined,那么相等。
如果一个是数字,一个是字符串,先将字符串转为数字,然后比较。
如果一个值是true/false,则将其转换为1/0比较
如果一个值是对象,一个是数字或字符串,则尝试使用valueof和toString转换后比较。
其他就不相等了。