運算符
用于連接簡單表達式,組成一個復雜的表達式。
‘+’號
- 兩個操作數(shù)都是數(shù)字,會做加法運算
- 兩個參數(shù)都是字符串或有一個參數(shù)是字符串,做字符串拼接
- 在參數(shù)有對象的情況下,會調用其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的方法
- 在只有一個字符串參數(shù)時,會嘗試將其裝換為數(shù)字
+'4'//4
+true//1
+false//1
+'ac'//NaN
+new Date()//1482648206084
除法
x/y
余數(shù)
x%y 100/3等于1
a=345,b=22
parseInt(a/b)//商
a%b//余數(shù)
自增
++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為數(shù)值運算符
賦值運算符
用于給變量賦值,最常見的是等號,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//三元條件運算符
其他
小括號
如果把表達式放在圓括號之中,作用是求值。
如果跟在函數(shù)的后面,作用是調用函數(shù)
(1+1)//2
function(){}//報錯如果(function(){})當做表達式
void
作用是執(zhí)行一個表達式返回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//等號的優(yōu)先級高,a就等于3
var a=1,
b=2//等同于var a=1;var b=1;
運算符優(yōu)先級與結合性
- typeof的優(yōu)先級相當高
typeof 2*3//(typeof 2)*3等于NaN
- ++,--是右結合的操作符,比加減乘除的優(yōu)先級高
4++(不能這樣寫)
var a=0,b=0
a+++b//0
(a++)+b//0
- 賦值運算符的優(yōu)先級相當?shù)?br> a=b==c//等同于a=(b==c)
- 邏輯非!也在優(yōu)先級隊列的前端比加減乘除高,但邏輯與,邏輯或優(yōu)先級很低,不如加減乘除。
!2*0//0等價于(!2)*0
- 一個關于邏輯運算符有意思的地方是“短路功能,會結合表達式計算值來考察,了解了邏輯運算父母的“短路特點”,在知道原始表達式的“返回值”就是本身,題目就很簡單了。
“短路”:false&&(anything)計算結果為false;
true||(anything)計算結果為true; - ==與=的區(qū)別
=是右結合;==的優(yōu)先級高于=;0==false;''==false;
使用==的時候,js會幫助我們做類型轉換,造成一些匪夷所思的結果,那么使用==的時候會在哪些情況下做類型轉換又會換成什么樣子?
如果兩個值類型相同,則執(zhí)行嚴格相等的運算。
如果兩個值的類型不同:
如果一個是null,一個是undefined,那么相等。
如果一個是數(shù)字,一個是字符串,先將字符串轉為數(shù)字,然后比較。
如果一個值是true/false,則將其轉換為1/0比較
如果一個值是對象,一個是數(shù)字或字符串,則嘗試使用valueof和toString轉換后比較。
其他就不相等了。