1 運算符
定義:
運算符也叫操作符,通過運算符可以對一個或多個值(變量/常量/字面量)進行運算,并獲取運算結(jié)果
typeof就是運算符,可以來獲得一個值的類型,他會將該值的類型以字符串的形式返回:number string等
作用:
運算符是告訴程序執(zhí)行特定算數(shù)或邏輯操作的符號
例如告訴程序,某兩個數(shù)相加/相減等
分類:
1.1 按照功能劃分
算數(shù)運算符
位運算符
關(guān)系運算符
邏輯運算符
2.2 按照操作數(shù)個數(shù)劃分
單目運算:只有一個操作數(shù),如:i++!
雙目運算:有兩個操作數(shù),如:a+b;
三目運算:三目運算也稱為問號表達式a>b?1:0;
運算符的結(jié)合性:
JavaScript中各種運算符的結(jié)合性分為兩種
左結(jié)合性(自左至右),即先左后右
例如:
x-y+z;
//y應先與"-"結(jié)合,執(zhí)行x-y運算,然后再執(zhí)行+z的運算
//這種自左至右的的結(jié)合方式就稱為"左結(jié)合性"
右結(jié)合性(自右至左),即先右后左
例如:
x=y=z=10;
//由于"="的右結(jié)合性,應先執(zhí)行z=10,再執(zhí)行y=z,x=y運算
2 算數(shù)運算符
加法運算:
格式:
Number1+Number2
var res=1+1;
console.log(res); //2
var num1=10;
var num2=20;
var res2=num1+num2;
console.log(res2); //30
注意:
非number類型的值進行運算時,會將這些值轉(zhuǎn)換為Number然后運算
var res=true+100;
console.log(res); //101
var res1=true+true;
console.log(res1); //2
任何值和NaN做運算都得NaN
var res2=1+NaN;
console.log(res2); //NaN
任何的值和字符串做加法運算,都會先轉(zhuǎn)換為字符串,然后再和字符串做拼串的操作
var res3=10+"123";
console.log(res3); //10123
res3=1+"true";
console.log(res3); //1true
減法運算:
格式:
Number1-Number2;
非number類型的值進行運算時,會將這些值轉(zhuǎn)換為Number然后運算
任何值和NaN做運算都得NaN
字符串做減法也會轉(zhuǎn)換為number
乘法運算:
Number1*Number2
其他規(guī)律和減法一樣
除法運算:
Number1/Number2
分母為0,輸出無窮大
var res=100/0;
console.log(res): //Infinity
取余運算(重點):
Number1%Number2
m%n求余,相當于m/n獲取余數(shù)
var res=10%3;
console.log(res); //輸出1
var res2=10%3.5;
console.log(res2); //輸出3
var res3=10%4;
console.log(res3); //輸出2
var num1=10;
var num2=2.5;
var res4=num1%num2;
console.log(res4); //輸出0
n(分母)等于0,返回NaN 如100%0
m(分子)等于0,返回0 如0%100
m>n正常求余 如8%3=2
m<n結(jié)果是m 如2%4=2
其他規(guī)律一樣
3 一元運算符
只需要一個操作數(shù)
正號:
1)正號不會對數(shù)字產(chǎn)生任何影響
var num=123;
num=+num;
console.log(num); //123
對于非Number類型的值,會先轉(zhuǎn)換為Number,然后再運算
var boo1=true;
var res=+boo1;
console.log(res); //1
var str="123";
res=+str;
console.log(res); //123
res=+str2;
console.log(str2); //NaN
2)負號
負號可以對數(shù)字進行負號的取反
var num=456;
num=-num;
console.log(num); //-456
4 賦值運算符
1)簡單的賦值運算 "="
格式:
變量=數(shù)據(jù)
var num=100;
賦值運算符左邊只能是變量
多個賦值運算符可以組成"賦值表達式",賦值表達式具備右結(jié)合性
2)復合賦值運算符
var num1=10;
var num2=20;
console.log(num2-=num1); //相當于num2=num2-num1
console.log(num2+=num1); //相當于num2=num2+num1
console.log(num2*=num1); //相當于num2=num2*num1
console.log(num2/=num1); //相當于num2=num2/num1
console.log(num2%=num1); //相當于num2=num2%num1
3)復合賦值表達式運算:
格式:
a*=1+2;
由于賦值運算符是右結(jié)合性,所以會先計算等號右邊,然后再進行復合運算
var value=5;
value*=2-2;
console.log(value); //0
5 自增/自減運算符
在程序設(shè)計中,經(jīng)常遇到"i=i+1"和"i=i-1"這兩種極為常見的操作
JS語言為這種操作提供了兩個更為簡潔的運算符,即++和--,分別叫做自增運算符和自減運算符
求值過程:
無論運算符號在前還是在后,變量在自身基礎(chǔ)上都會改變
var num=1;
num++; //num=num+1 num+=1
console.log(num); //2
num=1;
num--; //num=num-1 num-=1
console.log(num); //0
num=1;
--num;
console.log(num); //0
后綴表達式:x++,x--;先用x的當前值作為表達式的值,再進行自增自減1運算.即"先用后變",也就是先用變量的值參與運算,變量的值再進行自增自減變化.
var a,b;
a=20;
b=30;
var res=(a++)+(b++);
console.log(res,a,b); //50 21 31
a=10;
b=20;
res=(a--)+(b--);
console.log(res,a,b); //30 9 19
前綴表達式:++x;--x;其中x表示變量名,先完成變量的自增自減1運算,再用x的值作為表達式的值.即"先變后用",也就是變量的值先變,再用變量的值參與運算.
var a,b;
a=10;
b=20;
var res=(++a)+(++b);
console.log(res,a,b); //32 11 21
a=10;
b=20;
res=(--a)+(--b);
console.log(res,a,b); //28 9 19
6 邏輯運算符
有時候,我們需要在多個條件同時成立的時候才能執(zhí)行某段代碼
比如同時輸出了QQ和密碼,才能執(zhí)行登錄
1)邏輯 與
格式:
條件A&&條件B
運算結(jié)果:
只有當條件A和條件B都成立時,結(jié)果才為true;其余情況的結(jié)果都為false.因此,條件A或條件B只要有一個不成立,結(jié)果都為false.
一假則假
短路測試:
true&&alert("我來了"); //會執(zhí)行彈窗
false&&alert("我沒有來"); //不會執(zhí)行彈窗
注意點:
對于非Boolean類型的數(shù)值,邏輯與會自動將其轉(zhuǎn)換為Boolean類型來判斷
如果條件A不成立,則返回條件A數(shù)值本身
如果條件A成立,不管條件B成不成立都返回條件B數(shù)值本身
var result="123"&&"abc";
console.log(result); //abc
result="123"&&0;
console.log(result); //0
result="null"&&0;
console.log(result); //null
2)邏輯 或
格式:
條件A||條件B
運算結(jié)果:
當條件A或條件B只要有一個成立時(也包括都成立),結(jié)果為true;只有條件都不成立時,結(jié)果才為false
一真為真
短路測試:
true||alert("123"); //不會執(zhí)行彈窗
false||alert("123"); //會執(zhí)行彈窗
注意事項:
對于非Boolean類型的數(shù)值,邏輯與會自動將其轉(zhuǎn)換為Boolean類型來判斷
如果條件A不成立,則不管條件B成不成立都返回條件B數(shù)值本身
如果條件A成立,則返回條件A數(shù)值本身
var result=null||0;
console.log(result); //0
result="123"||"abc";
console.log(result); //123
result="123"||0;
console.log(result); //123
3)邏輯 非
格式:
!條件A
運算結(jié)果:
對條件A進行取反:若條件A成立,結(jié)果就為false;若條件A不成立,結(jié)果就為true.也就是說:真的變假,假的變真,
真變假,假變真
注意點:
對一個值進行兩次取反,他不會變化
var boo1=true;
var res=!!boo1;
console.log(res); //true
對非布爾值進行操作,則會將其轉(zhuǎn)換為布爾值,然后再取反
var num=10;
var res=!num; //先將10轉(zhuǎn)換為true,然后再取反
console.log(res); //false
7 關(guān)系運算符
存在意義:
默認情況下,我們再程序中寫的每一句正確代碼都會被執(zhí)行.但很多時候,我們想在某個條件成立的情況下才執(zhí)行某一段代碼
JS中的真假性
在JS當中,條件成立稱為"真",條件不成立稱為"假".因此判斷條件是否成立就是判斷條件的真假
JS中已經(jīng)定義好了一個Boolean類型的值
//以下結(jié)合性都為"左結(jié)合性"
> 大于
< 小于
>= 大于等于
<= 小于等于
== 判斷值是否相等
!= 判斷值是否不相等
=== 判斷值和類型是否相等
!== 判斷值和類型是否不相等
var a,b;
a=100;
b=100;
console.log(a>b); //f
console.log(a<b); //f
console.log(a>=b); //t
console.log(a<=b); //t
console.log(a==b); //t
console.log(a!=b); //f
注意事項:
對于非數(shù)值進行比較時,會將其轉(zhuǎn)換為數(shù)值然后再比較
console.log(1>false); //true
console.log(1>true); //false
如果符號兩側(cè)的值都是字符串時,不會將其轉(zhuǎn)換為數(shù)字進行比較,而會分別比較字符串中字符的Unicode編碼
null undefined NaN 比較
比較兩個字符串類型的數(shù)字,可能會得到不可預期的結(jié)果
所以,在比較兩個字符串類型的數(shù)字時,一定要轉(zhuǎn)型
8 逗號運算符
功能是把多個表達式連接起來組成一個表達式,稱為逗號表達式
表達式1,表達式2,......表達式n;
例如:
a=1+1,b=3*4,c=10/2;
運算過程:
先算表達式1,再算表達式2,以此類推
整個逗號表達式的值是最后一個表達式的值
var a,b,c,d;
d=(a=1+1,b=3*4,c=10/2);
console.log(d); //5
var a,b;
b=(a=3,--a,a*5);
console.log(a,b); //2 10
9 三目運算符
格式:
條件表達式?語句1:語句2;
求值規(guī)則:
如果條件表達式為true,則執(zhí)行語句1,并返回執(zhí)行結(jié)果
如果條件表達式為false,則執(zhí)行語句2,并返回執(zhí)行結(jié)果
true?alert("語句1"):alert("語句2");
false?alert("語句1"):alert("語句2");
注意點:
條件運算符?和:是一對運算符,不能夠分開使用,
如果條件的表達式的求值結(jié)果是一個非布爾值,會將其轉(zhuǎn)換為布爾值然后再運算
null?alert("語句1"):alert("語句2");
"abc"?alert("語句1"):alert("語句2");
10 運算符的優(yōu)先級
優(yōu)先級:
JS中,運算符的運算優(yōu)先級共分為15級.1級最高,15級最低
在表達式中,優(yōu)先級較高的先運算
優(yōu)先級相同則左結(jié)合計算
可以使用()來改變優(yōu)先級