第三節(jié): JavaScript 運算符

一.運算符

運算符(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

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末斩芭,一起剝皮案震驚了整個濱河市轻腺,隨后出現的幾起案子,更是在濱河造成了極大的恐慌秒旋,老刑警劉巖约计,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異迁筛,居然都是意外死亡煤蚌,警方通過查閱死者的電腦和手機耕挨,發(fā)現死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尉桩,“玉大人筒占,你說我怎么就攤上這事≈├纾” “怎么了翰苫?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長这橙。 經常有香客問我奏窑,道長,這世上最難降的妖魔是什么屈扎? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任埃唯,我火速辦了婚禮,結果婚禮上鹰晨,老公的妹妹穿的比我還像新娘墨叛。我一直安慰自己,他們只是感情好模蜡,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布漠趁。 她就那樣靜靜地躺著,像睡著了一般忍疾。 火紅的嫁衣襯著肌膚如雪闯传。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天膝昆,我揣著相機與錄音丸边,去河邊找鬼。 笑死荚孵,一個胖子當著我的面吹牛妹窖,可吹牛的內容都是我干的。 我是一名探鬼主播收叶,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼骄呼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了判没?” 一聲冷哼從身側響起蜓萄,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎澄峰,沒想到半個月后嫉沽,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡俏竞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年绸硕,在試婚紗的時候發(fā)現自己被綠了堂竟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡玻佩,死狀恐怖出嘹,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情咬崔,我是刑警寧澤税稼,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站垮斯,受9級特大地震影響郎仆,放射性物質發(fā)生泄漏。R本人自食惡果不足惜甚脉,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一丸升、第九天 我趴在偏房一處隱蔽的房頂上張望铆农。 院中可真熱鬧牺氨,春花似錦、人聲如沸墩剖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岭皂。三九已至郊霎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間爷绘,已是汗流浹背书劝。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留土至,地道東北人购对。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像陶因,于是被迫代替她去往敵國和親骡苞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內容