JavaScript極易出錯的操做符運算

這是我參與8月更文挑戰的第8天,活動詳情查看:8月更文挑戰面試

算術運算符

+ - * / % ()markdown

非正常狀況1: 有特殊值字面量參與的運算

  • NaN參與的運算:獲得的結果都是NaNsvn

  • Infinity參與的運算,視狀況而定, 好比:post

5/Infinity=0
5%Infinity=5
Infinity%5=NaN
Infinity+5=Infinity
Infinity / Infinity = NaN
Infinity - Infinity = NAN
Infinity % Infinity = NAN
複製代碼

工做中並不會使用特殊值運算,沒有實際應用的意義,可是要了解,以防面試遇到flex

非正常狀況2: 其餘類型的數據參與數學運算。

  • 有字符串參與的 + 運算(包括只有符號一邊有字符的狀況):+ 號變爲連字符將先後鏈接成總體字符串。

例如:編碼

var a = 3 - "36" % 5 + "2" - 2
        console.log(a)
        var b = "36" % 5
        console.log(b)
        var c = 3 - "36" % 5 + "2"
        console.log(c)
複製代碼

輸出:url

20
1
22
複製代碼
  • 隱式轉換:除了字符串參與的 + 運算,其餘狀況下,全部其餘數據類型參與數學運算時,計算機暗中將其餘數據類型先自動轉換成數字類型,再參與運算,這個過程當中不須要使用parseInt()、Number() 等方法,過程是暗中進行,這就是一個隱式轉換的過程。

隱式轉換

其餘的數據類型會隱式轉換爲數字類型:spa

  • 對應數字:純數字字符串會轉爲對應的數字」123」→123
  • 轉換爲1: true
  • 轉換爲0:false、null、 「」空字符串、空白字符串
  • 轉換爲NaN:undefined、非空非純數字字符串

比較運算符

也叫做關係運算符。一個 比較運算符 comparison operator 比較它的操做數並返回一個布爾類型值。運算結果要麼是true,要麼是false。code

>  大於

<  小於

>= 大於等於

<= 小於等於

== 相等,只判斷值大小是否相等,不判斷數據類型

!= 不等,與相等徹底相反

===全等,不光判斷值相等,還要判斷數據類型相等

!==不全等,與全等於徹底相反
複製代碼

非正常狀況1: 特殊值參與比較運算

  • NaN參與:不等於和不全等於結果是 true,其餘的都獲得 false
  • Infinity參與的運算,視狀況而定, 好比:
Infinity == Infinity ->True
Infinity === Infinity ->True
Infinity > Infinity ->False
Infinity >= Infinity ->True
複製代碼

非正常狀況2: 其餘數據類型參與比較運算(排除字符串與字符串的比較

其餘數據類型也會隱式轉換爲數字參與比較。orm

「123」→123 true→1 false→0 null→0 undefined→NaN 「」→0 「abc」→NaN
複製代碼

null 的判斷比較特殊:null 與 0 判斷時,相等判斷爲 false,>= 和 <= 判斷爲 true

null == undefined -> True

非正常狀況3: 字符串與字符串比較

不會發生隱式轉換爲數字,而是比較兩個字符串的 Unicode 編碼順序 字符編碼順序:從前日後 0-9,A-Z,a-z,前面的小於後面的 比較時,不關心兩個字符串的長度,從第一個字符開始比較,依次日後順延比較,直到比較出大小,就再也不日後比較

邏輯運算符

邏輯運算符經常使用於布爾類型值之間; 當操做數都是布爾值時,返回值也是布爾值

&&      邏輯與運算符且
||      邏輯或運算符
!       邏輯非運算符
複製代碼

非正常狀況

  • 除了布爾類型的值以外,其餘數據類型的值也能夠參與邏輯運算。運算過程當中須要將操做數隱式轉換爲布爾類型的值,參與判斷計算,最終運算結果仍是原來的某個位置的數據.
  • 並非全部邏輯運算返回結果都是布爾值,其餘數據參與獲得的就是數據自己

隱式轉換爲布爾值的規律

  • 轉爲false:NaN、0、 「」空字符串、null、undefined
  • 轉爲true:非0 非NaN數字、非空字符串

當它們用於非布爾值的時候,返回值就多是非布爾值。其實這種運算很是簡單:

  • (邏輯與 a && b ) 若是a能被轉換爲false,那麼返回a;不然,返回b
  • (邏輯或 a || b ) 若是a能被轉換爲true,那麼返回a;不然,返回b

邏輯運算符運算順序

綜合運算順序:非、與、或

賦值運算符

=   等於
+=  加等於
-=  減等於
*=  乘等於
/=  除等於
%=  取餘等於
++  遞加
--  遞減
複製代碼

一元運算符

++ -- !
複製代碼

++ 或 -- 符號能夠寫在變量前和變量後面,位置不一樣可能致使程序運行結果不一樣

以 ++ 爲例:

  • a++: ++ 符號在變量以後,a++ 在參與程序過程當中使用的原始沒有加 1 的值,使用完後第二次用 a 變量時,a 用的就是加 1 後的新值。先參與,後自加.
  • ++a:++ 符號在變量以前,++a 在參與過程當中總體就使用 a 加 1 以後的新值,使用完後第二次用 a 變量時,a 用的也是加 1 的新值。先自加,後參與

例1

var a = 3; 
var b = a++; 
var c = ++a;
console.log(a,b,c)
複製代碼

輸出:

5 3 5
複製代碼

例2

image.png

輸出:

image.png

運算優先級

優先級從高到底:

1. () 優先級最高

2. 一元運算符 ++ -- !

3. 算數運算符 先* / % 後 + -

4. 關係運算符 > >= < <=

5. 相等運算符 == != === !==

6. 邏輯運算符 先&& 後||

7. 賦值運算符
複製代碼

var a = 4; var num = 1 * (2 + 3) && a++ || 5 > 6 && 7 < 8 || !9; 
console.log(num)
複製代碼

輸出:

4
複製代碼
相關文章
相關標籤/搜索