if條件與相等運算符判斷規(guī)則

作為Javascript的初學者,if判斷語句和 == 相等運算符的運算規(guī)則讓我頗為頭大,于是就查閱了相關(guān)資料,再次稍作總結(jié)。

相等運算符的判斷規(guī)則

== 與 ===

JavaScript 提供兩種相等運算符:== 和===。

簡單說,它們的區(qū)別是相等運算符( == )比較兩個值是否相等,嚴格相等運算符( === )比較它們是否為“同一個值”。如果兩個值不是同一類型,嚴格相等運算符( === )直接返回false,而相等運算符( == )會將它們轉(zhuǎn)換成同一個類型,再用嚴格相等運算符進行比較。

這里我主要說一下 == 和 === 的一些判斷規(guī)則。

嚴格相等運算符

(1)不同類型的值
如果兩個值的類型不同,直接返回false。

1 === "1" // false
true === "true" // false
上面代碼比較數(shù)值的1與字符串的“1”、布爾值的true與字符串"true",因為類型不同,結(jié)果都是false。

(2)同一類的原始類型值

同一類型的原始類型的值(數(shù)值、字符串、布爾值)比較時,值相同就返回true,值不同就返回false。

1 === 0x1 // true

上面代碼比較十進制的1與十六進制的1,因為類型和值都相同,返回true。

需要注意的是,NaN與任何值都不相等(包括自身)。另外,正0等于負0。

NaN === NaN  // false
+0 === -0 // true

(3)復合類型值

兩個復合類型(對象、數(shù)組、函數(shù))的數(shù)據(jù)比較時,不是比較它們的值是否相等,而是比較它們是否指向同一個地址。

{} === {} // false
[] === [] // false
(function () {} === function () {}) // false

上面代碼分別比較兩個空對象、兩個空數(shù)組、兩個空函數(shù),結(jié)果都是不相等。原因是對于復合類型的值,嚴格相等運算比較的是,它們是否引用同一個內(nèi)存地址,而運算符兩邊的空對象、空數(shù)組、空函數(shù)的值,都存放在不同的內(nèi)存地址,結(jié)果當然是false。

如果兩個變量引用同一個對象,則它們相等。

var v1 = {};
var v2 = v1;
v1 === v2 // true

注意,對于兩個對象的比較,嚴格相等運算符比較的是地址,而大于或小于運算符比較的是值。

new Date() > new Date() // false
new Date() < new Date() // false
new Date() === new Date() // false

上面的三個表達式,前兩個比較的是值,最后一個比較的是地址,所以都返回false。

(4)undefined 和 null

undefined和null與自身嚴格相等。

undefined === undefined // true
null === null // true
由于變量聲明后默認值是undefined,因此兩個只聲明未賦值的變量是相等的。

var v1;
var v2;
v1 === v2 // true

(5)嚴格不相等運算符

嚴格相等運算符有一個對應的“嚴格不相等運算符”(!==),它的算法就是先求嚴格相等運算符的結(jié)果,然后返回相反值。

1 !== '1' // true

相等運算符

相等運算符用來比較相同類型的數(shù)據(jù)時,與嚴格相等運算符完全一樣。

比較不同類型的數(shù)據(jù)時,相等運算符會先將數(shù)據(jù)進行類型轉(zhuǎn)換,然后再用嚴格相等運算符比較。類型轉(zhuǎn)換規(guī)則如下。

(1)原始類型的值

原始類型的數(shù)據(jù)會轉(zhuǎn)換成數(shù)值類型再進行比較。

1 == true // true
// 等同于 1 === Number(true)

0 == false // true
// 等同于 0 === Number(false)

2 == true // false
// 等同于 2 === Number(true)

2 == false // false
// 等同于 2 === Number(false)

'true' == true // false
// 等同于 Number('true') === Number(true)
// 等同于 NaN === 1

'' == 0 // true
// 等同于 Number('') === 0
// 等同于 0 === 0

'' == false  // true
// 等同于 Number('') === Number(false)
// 等同于 0 === 0

'1' == true  // true
// 等同于 Number('1') === Number(true)
// 等同于 1 === 1

'\n  123  \t' == 123 // true
// 因為字符串轉(zhuǎn)為數(shù)字時,省略前置和后置的空格

上面代碼將字符串和布爾值都轉(zhuǎn)為數(shù)值,然后再進行比較。

(2)對象與原始類型值比較

對象(這里指廣義的對象,包括數(shù)組和函數(shù))與原始類型的值比較時,對象轉(zhuǎn)化成原始類型的值,再進行比較。

[1] == 1 // true
// 等同于 Number([1]) == 1

[1] == '1' // true
// 等同于 Number([1]) == Number('1')

[1] == true // true
// 等同于 Number([1]) == Number(true)

上面代碼中,數(shù)組[1]與數(shù)值進行比較,會先轉(zhuǎn)成數(shù)值,再進行比較;與字符串進行比較,會先轉(zhuǎn)成數(shù)值,然后再與字符串進行比較,這時字符串也會轉(zhuǎn)成數(shù)值;與布爾值進行比較,兩個運算子都會先轉(zhuǎn)成數(shù)值,然后再進行比較。

(3)undefined 和 null

undefined和null與其他類型的值比較時,結(jié)果都為false,它們互相比較時結(jié)果為true。

false == null // false
false == undefined // false

0 == null // false
0 == undefined // false

undefined == null // true

絕大多數(shù)情況下,對象與undefined和null比較,都返回false。只有在對象轉(zhuǎn)為原始值得到undefined時,才會返回true,這種情況是非常罕見的。

(4)相等運算符的缺點

相等運算符隱藏的類型轉(zhuǎn)換,會帶來一些違反直覺的結(jié)果。

0 == ''             // true
0 == '0'            // true

2 == true           // false
2 == false          // false

false == 'false'    // false
false == '0'        // true

false == undefined  // false
false == null       // false
null == undefined   // true

' \t\r\n ' == 0     // true

上面這些表達式都很容易出錯,因此不要使用相等運算符( == ),最好只使用嚴格相等運算符( === )。

(5)不相等運算符

相等運算符有一個對應的“不相等運算符”(!=),兩者的運算結(jié)果正好相反。

1 != '1' // false

if判斷語句

這里的if(xxx)中對條件語句的判斷是將非布爾值的參數(shù)自動轉(zhuǎn)換為布爾值,下面我就總結(jié)一下自動轉(zhuǎn)換至布爾值的情況。

自動轉(zhuǎn)換為布爾值

除了以下五個值,其他都是自動轉(zhuǎn)為true。

  • undefined
  • null
  • +0或-0
  • NaN
  • ''(空字符串)

下面這個例子中,條件部分的每個值都相當于false,使用否定運算符后,就變成了true。

if ( !undefined
  && !null
  && !0
  && !NaN
  && !''
) {
  console.log('true');
} // true
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容