一.運算符
運算符(Operators,也翻譯為操作符)凌蔬,是發(fā)起運算的最簡單形式厌小。
運算符的分類見仁見智贮缅,我們的課程對運算符進行如下分類:
數學運算符(Arithmetic operators)
比較運算符(Comparison operators)
邏輯運算符(Logical operators)
賦值運算符(Assignment operators)
按位運算符 (Bitwise operators)
條件 (三元) 運算符(Conditional operator)
1. 數學運算符
加+? 減? -? 乘 * 除? /? 取余數? %? ? 括號 ()
下面的結果都是3:
console.log(1+2);
console.log(8-5);
console.log(1.5*2);
console.log(12/4);
console.log(13%5);//13÷5=2……3 得幾不重要,要的是余數
取余數這個運算百侧,實際上也是除砰识,要的是余數:
//取余數
console.log(12%3);//0
console.log(121%11);//0
console.log(5%8);//5
console.log(8%5);//3
console.log(5%5);//0
// 測試
console.log(1%0)
默認的計算順序,先乘除佣渴,后加減仍翰。乘除取余是平級,先遇見誰观话,就算誰予借。
console.log(1+2*3);//7
console.log(1+2*3%3);//1
console.log(1+2%3*3);//7
我們可以用小括號來改變計算先后順序,注意沒有中括號和大括號频蛔,一律用小括號灵迫。
vara=4*(3+(1+2)*3);
console.log(a);
1.1. 隱式轉換
所有帶有字符串的運算都會盡可能的轉為數字進行計算,加號比較特殊晦溪。(加好在字符串中有拼接的意思)
數學運算符的正統(tǒng)瀑粥,是number和number的數學運算,結果是number三圆。出于面試的考慮狞换,有一些奇奇怪怪的數學運算.
發(fā)生隱式轉換
數學運算中,只有純字符串舟肉、布爾值修噪、null能夠幫你進行隱式轉換
//隱式轉換:就是沒有寫parseInt()、parseFloat()自己幫你轉格式
console.log(3*"8");//24
console.log("3"*"8");//24
console.log("48"/"2");//24
console.log("24"%55);//24
console.log(3*null);//0 ?
//隱式轉換的時候null將被轉為0
console.log(3*false);//0 ?
//隱式轉換的時候false將被轉為0
console.log(3*true);//3 ?
//隱式轉換的時候true將被轉為1
不能隱式轉換
不純的字符串和undefined是不能幫你進行隱式轉換的路媚,結果都是NaN, 沒辦法計算
console.log(3*"8天");//NaN ?
//數學運算中黄琼,不純的字符串沒法隱式轉換
console.log(3*undefined);//NaN ?
//數學運算中,undefined不能進行隱式轉換
加法的特殊性
加法比較特殊整慎,因為+同時是加法和連字符的符號脏款,所以加法在面對字符串的時候沒有隱式轉換,就是字符串拼接
數學運算,字符串拼接
任何數據類型加字符串都等于字符串
//加法對于字符串沒有隱式轉換
console.log(3+"8");//38
console.log(3+undefined);//NaN ?
console.log(3+null);//3
console.log(3+false);//3
console.log(3+true);//4
總結:
無論哪種運算围苫,只要出現了undefined參與運算,結果都是NaN撤师。
然后純數字字符串("4")剂府、false、true剃盾、null都能進行隱式轉換周循。
加號比較特殊,面對純數字字符串("4")沒有隱式轉換的
1.2? 特殊數值的計算万俗,
特殊的數字運算湾笛,就是NaN、Infinity參與的運算,很多公司在考闰歪,考你對面試的重視程度嚎研,因為這個知識實戰(zhàn)中一輩子用不到
舉幾個例子
Infinity+1000//Infinity
Infinity-1000//Infinity
Infinity/1000//Infinity
Infinity*1000//Infinity
Infinity%1000// NaN
Infinity-Infinity//NaN
Infinity/Infinity//NaN
Infinity*Infinity//Infinity
0/0//NaN
6/0//Infinity
NaN/8//NaN
1.3 補充幾個數學API
JS中的數學運算符就這么幾個,如果我想算n次冪怎么辦?
像這樣 43
那我們就先學一個API,
一個數的n次冪
Math.pow(4,3);//
這是一個新的API库倘,記住就行了临扮,后面的課程將會告訴你,Math是一個內置對象教翩,pow是它的一個方法杆勇。
Math就是數學,pow就是power乘方饱亿。
開根號
Math.sqrt(81);
例子:
vara=Math.pow(3,2+Math.pow(3,4));
console.log(a);
2.比較(關系)運算符
>? ? 大于
< 小于
>=? 大于等于
<=? ? 小于等于
==? ? 等于? 判斷兩個值是否相等
!=? ? 不等于判斷兩個值是否不相等
===? 全等于? 判斷兩個值是否嚴格相等
!==? 不全等 判斷兩個值是否嚴格不相等
正統(tǒng)的數字比較
關系運算符的正統(tǒng)蚜退,number和number進行數學運算,得到的答案boolean彪笼。
console.log(8>6);// true
console.log(7<5);// false
console.log(8>=7);//true
console.log(8>=8);//true
console.log(5<=8);//true
console.log(5<=5);//true
console.log(5<=4);//false
實例中結果是布爾類型,boolean類型只有兩個值钻注,就是true和false。表示真配猫、假幅恋。
== 我們叫做“相等判斷”,它會幫你進行一個隱式轉換泵肄,盡可能的得到true的答案:
//==表示相等捆交,會幫你進行隱式轉換
console.log(6==8);//false
console.log(6==6);//true
console.log(6=="6");//true
console.log("6"==6);//true
===我們叫做“全等判斷”,不僅僅比較數值是否相等腐巢,還比較類型是否相等,沒有隱式轉換
//===表示全等品追,不僅僅比較數值是否相等,還比較類型是否相等
console.log(6===6);//true
console.log(6==="6");//false
console.log("6"===6);//false
!= 是==的反面系忙,如果==運算是true诵盼,那么!=就是false
!==是===的反面,如果===運算是true银还,那么!==就是false
console.log(6!="6");//false 风宁,
//腦子要反著想一下,6=="6"結果是true蛹疯,所以就是false
console.log(6!=="6");//true 戒财,
//腦子要反著想一下,6==="6"結果是false捺弦,所以就是true
正統(tǒng)的運算講完了饮寞,number和number進行關系運算,結果是boolean列吼。
string 和 string 也能夠進行關系運算幽崩,
比較的就是字符編碼即unicode編碼值順序。
字符編碼順序寞钥,就是數字慌申、大寫字母、小寫字母
"a"<"b"http://true
"A"<"B"http://true
"A"<"a"http:// true 理郑,大寫字母在字符集里面是在小寫字母前面
"1"<"A"http://true 蹄溉,數字在字母前端
"blank"<"blue"http://true ? 因為一位一位比,直到比出大小
"23"<"3"http://true 因為是string和string比您炉,比的是字符編碼順序
與數字進行關系運算時柒爵,純數字字符串被轉為數字,null轉換為0赚爵,true轉換轉為1棉胀, false轉換為0
null不能進行和0的相等判定
null<0.00001//true
null>-0.0001//true
null==0//false? 具體原因,我們后面講解Object的時候介紹
false==0//true
true==1//true
undefined==0;//false
"a"<3// false
"a">3// false ? 因為"a"會被轉為NaN
"23"<3//false 因為"23"會被轉為23
NaN不等于自己冀膝,不全等于自己
NaN==NaN//false
NaN===NaN//false
NaN!=NaN//true
NaN!==NaN//true
其他類型的比較
null==undefined//true
null===undefined//false
需要注意的是膏蚓,我們已經了解了一些不正統(tǒng)的運算,所以千萬不要連續(xù)使用關系運算符;础驮瞧!
比如我們想驗證3大于2,2大于1:
3>2>1// false
原理:
(3>2) >1
= true > 1? ? ? ? ? 因為true會被當做1來與1進行比較
=? false
也就是說,不能連續(xù)使用關系運算符?莘摇论笔!因為一旦連續(xù)使用了,實際上還是從左至右計算千所,所以就有上一步的boolean參與了下一步的運算狂魔。
總結:
如果比較的兩個操作數都是數值,那么就進行數值比較
如果比較的兩個操作數都是字符串,那么就會比較字符串編碼值
如果有一個操作數是數字,另一個操作數就會被轉換為數值進行比較
測試:
console.log(1<2<3);
3. 邏輯運算符
邏輯運算符就三個
且 或 非
&&? 邏輯與運算 (且)
||? 邏輯或運算 (或)
!? ? ? 邏輯非運算 (非)
正統(tǒng)的來說,參與邏輯運算的Boolean和Boolean,得到的結果也是Boolean值
值按照真值表來定
3.1 && 邏輯與的真值表
a &&? b
ab結果
真真真
真假假
假真假
假假假
都真才真,有假就假
例子
命題1: "地球是個圓的"? ? ? ? 真的
命題2:? "胡歌演技超棒"? ? ? 真的
命題1 且 命題2? ? 真
命題1:“1+1=3”? 假的
命題2:“地球是方的” 假的
命題1 且 命題2? 假的
//邏輯與運算符
console.log(true&&true);//ture
console.log(true&&false);//false
console.log(false&&true);//false
console.log(false&&false);//false
3.2? ||? 邏輯或,或者的意思
a || b
ab結果
真真真
真假真
假真真
假假假
有真就真,都假才加
命題1: 1 + 1 = 2? ? ? ? ? ? 真的
命題2:“你很帥”? ? ? ? ? ? ? 存在歧義
命題1 或者 命題2 總結果是真
//邏輯或運算符
console.log(true||true);//ture
console.log(true||false);//ture
console.log(false||true);//ture
console.log(false||false);//false
3.3? ! 就是'邏輯非', 就是相反的意思
//邏輯非運算符
console.log(!true);//false
console.log(!false);//true
console.log(!!!!!!!!!false);//ture
3.4 邏輯運算符的順序
順序: 非,與 或
true||false&&!true||false
解式 = true || false && false || false
=? true ||? false? || false
= true || false
= true
3.5 短路語法
邏輯運算符最最有意思的事情,就是所謂的“短路語法”淫痰。
邏輯與的短路運算
計算運算且運算的時候最楷,比如a && b,a如果就是一個false,那么就不會管b是什么籽孙,直接輸出false就行了烈评,等于說直接輸出a。
也就是說犯建,本質上計算機進行a&&b運算的時候讲冠,不是在進行邏輯分析,而是在根據邏輯判斷返回哪一個值
? ? ? ?? —— 短路語法适瓦。 要么a被短路竿开,要么b被短路。
負性就是在隱式轉換成布爾值的時候,轉換為false 叫負性
false null 0 NaN ""? undefined
正性的:除了上面的玻熙,全是正性的否彩。也就是隱式轉換為布爾值的時候,全部非true
false&&8//false ?
//因為計算機發(fā)現,且運算a已經是false了嗦随,直接輸出false
null&&8//null ?
//因為計算機發(fā)現列荔,且運算a已經是false性的了,直接扔出來null
true&&13//13 ?
//因為計算機發(fā)現称杨,且運算a是true肌毅,所以總結果就是看b,直接扔出b
12&&13//13 ?
//因為計算機發(fā)現姑原,12當做true悬而,所以總結果看b,直接扔出b
13&&12//12 ? ?
//因為計算機發(fā)現锭汛,13當做true笨奠,所以總結果看b,直接扔出b
undefined&&哈哈//undefined ?
//不報錯唤殴,因為a已經是負性的了般婆,所以直接扔出a,哈哈不管
哈哈&&undefined//報錯
true&&NaN//NaN? 扔后面
邏輯或的短路運算
|| 邏輯或的短路也是類似的朵逝,a||b
計算機發(fā)現a是真蔚袍,那么返回a;如果a是假配名,返回b
0||18//18 前面假啤咽,扔后面
18||0//18 前面真,扔前面
undefined||NaN//NaN? 前面假渠脉,扔后面
NaN||undefined//undefined 前面假宇整,扔后面
例子:
88 || 99 && 66 || 55
解式:
= 88 ||? 66 || 55
= 88 ||55
= 88
undefined && ("3" != 3) || NaN && null
解式
= undefined && false || NaN && null
= undefined || NaN
= NaN
總結一下短路語法:
a&&b, 計算機要么執(zhí)行a要么執(zhí)行b芋膘。a真執(zhí)行b鳞青,a假執(zhí)行a霸饲;
a||b, 計算機要么執(zhí)行a要么執(zhí)行b臂拓。a真執(zhí)行a厚脉,a假執(zhí)行b。
測試:
console.log("0 || 1 = "+(0||1));
console.log("1 || 2 = "+(1||2));
console.log("0 && 1 = "+(0&&1));
console.log("1 && 2 = "+(1&&2));
例子:根據年齡判斷用戶是否成年
//第1步埃儿,用戶輸入一個年齡
varage=parseInt(prompt("請輸入你的年齡"));
//第2步輸出
// (age >= 18) && alert("你已經成年了F髡獭融涣!");
// (age < 18) && alert("你沒有成年巴!M埂剃斧!");
// 也可以這么寫,程序是對的:
(age<18)||alert("你已經成年了");
(age>=18)||alert("你沒有成年昂瞿恪S锥!");
4. 賦值運算
= 賦值
+=? ? 簡便寫法
-=? ? 簡便寫法
*=? ? 簡便寫法
/=? ? 簡便寫法
%=? ? 簡便寫法
++
--
賦值運算的參與者科雳,一定是變量根蟹。賦值運算是先計算右邊,然后將最終的值賦值給左邊
vara=2;
a+=2;//這行語句等價于a = a + 2;
console.log(a);//4
vara=10;
a+=10+1;
console.log(a);// 21
varb=6;
b/=3;//等價于b = b / 3
console.log(b);//2
varc=100;
c%=10;//等價于c = c % 10;
console.log(c);//0
vara="我";
a+="愛";
a+="你";
console.log(a);
4.1 ++ 自增運算符
vare=10;
e++;//等價于e=e+1
console.log(e);//11
++可以與輸出語句寫在一起,++寫在變量前和寫在變量后不是一個意思
a++ : 先用a的原值參與運算糟秘,然后a自己加1简逮;
++a :先給a自己加1,然后用a的新值參與運算
varf=10;
console.log(f++);//10 尿赚,先引用原值散庶,然后加1
等價于
//等價于
varf=10;
console.log(f);//先輸出f
f++;//然后f加1
varg=10;
console.log(++g);//11 , 這次是先加1凌净,然后輸
++? 的特殊用法
vara=8;
console.log(4+a++);//12? 悲龟, 先使用原來的a的值,就是4+8冰寻,輸出12.然后a加1
console.log(a);//9
vari=9;
console.log(++i%5);//0? , 先把i加1须教,然后使用i,10%5=0
console.log(i);//10
vara=10;
varb=++a-1+a++;
console.log(b+" "+a);
// 賦值的順序? 在自右向左? 計算的順序, 自左向右
4.2? -- 自減運算符
與自增運算符相同
練習:
vara=(10*3-4/2+1)%2;
varb=3;
b%=a+3;
console.log(a++);// 1
console.log(--b);// 2
vara=123;
varb=234;
// 請交換a,b的值
// 普通寫法.
// 利用中間變量
varc=a;
a=b;
b=c;
// 方法二
a=a+b;
b=a-b;
a=a-b;
5. 運算符的計算順序
貼身的( ++ -- !)? →→→ 數學 →→→ 比較 →→→ 邏輯? →→→ 賦值
vara=3<8&&8<14;//true
解式
=? 3 < 8 && 8 < 14;
=? true && true
= ture
vara=1+2<3+3&&3+4<2*7;
解式
=? 3 < 6 && 7 < 14
= true && true
true
vara=false+true&&13;
解式
= 1 && 13
= 13
vara=15;
false+a+++true>8&&13||6
解式
=? false + 15 + true? > 8 && 13 || 6
= 16 >8 && 13 || 6
= 13 || 16
=13
注意:
像++? --? !? 這種只需要一個操作符參與的叫做 一元運算符, 同時一元操作符還包括+ -
兩個操作數參與的叫二元運算符
三個操作數參與的叫做三元運算符
特殊一元操作符 +? -
對于數值+沒有變化,- 會將數值變?yōu)樨摂?如果數值為負值,那么結果就是正數
vara=1;
console.log(+a);
console.log(-a);
如果是非數字,就會像Number一樣將其他類型轉換為數值類型
console.log(+true);//1
console.log(+false);//0
console.log(+undefined);//NaN
console.log(+null);//0
console.log(+"33");//33
console.log(+"aa");//NaN
測試:
varn1=10,n2=20;
varn=n1++;
console.log("n = "+n);// 10
console.log("n1 = "+n1);// 11
n=++n1;
console.log("n = "+n);// 12
console.log("n1 = "+n1);// 12
n=n2--;
console.log("n = "+n);// 20
console.log("n2 = "+n2);//19
n=--n2;
console.log("n = "+n);// 18
console.log("n2 = "+n2);// 18