- > 大於運算符
- < 小於運算符
- <= 小於等於運算符
- >= 大於等於運算符
- == 相等運算符
- === 嚴格相等運算符
- != 不相等運算符
- !== 嚴格不相等運算符
非相等的比較
對於非相等的比較,演算法是先看兩個運運算元是否全是字元串,如果都是字元串的話,就按照Unicode碼的大小一個字元一個字元來比較;否則的話,將兩個運運算元都轉成數值,再比較大小
- 字元串的比較是按照字典(Unicode)順序進行比較的.
- 非字元串的比較
- 原始值類型
先轉換成數值然後再比較
注意點: 任何值與NaN(包括NaN)比較,都返回false - 對象
如果運運算元是對象,會轉為原始類型的值再進行比較
對象轉換為原始類型的值,演算法是先調用對象的valueOf方法;如果返回的還是對象,再接著調用toString方法。var x = [2]; // 輸出true // x的valueOf()返回[2],是對象類型,所以再調用toString(),結果是"2">"11",因為兩個都是字元串,所以先比較第一個字元,"2">"1",返回true x > '11' x.valueOf = function(){ return '2'; } // 返回false,因為x是對象,對象的比較先調用對象的valueOf()將對象轉為原始值類型,x的valueOf()方法返回的是基本類型,不再調用toString(),結果為'2'>'21',返回false x > '21'
- 原始值類型
相等運算符和嚴格相等運算符
相等運算符(==)比較的是兩個值是否相等,嚴格相等運算符(===)比較是否為'同一個值'; '==='先比較類型,如果類型不一樣,則直接返回false, '=='會先將他們轉換為同一個類型,再用嚴格相等運算符進行比較
兩個複合類型(對象,數組,函數)的數據比較時,不是比較它們的值是否相等,而是比較它們是否指向同一個地址
注意: 對於兩個對象的比較,嚴格運算符比較的是地址,而大於或小於運算符比較的是值
嚴格不相等運算符
嚴格不相等運算符的演算法是先求嚴格運算符的結果,然後再返回相反值
相等運算符
相等運算符比較同類型的數據時,與嚴格相等運算符完全一樣;比較不同類型的數據時,相等運算符會先將數據類型轉換,然後再用嚴格相等運算符比較
- 原始數據類型會先轉換成數值再進行比較(字元串轉換為數字時,會省略前置和後置空格)
// 等同於1 === Number(true) 1 == true // true // false 等同於 Number('true') === Number(true) ==> NaN === 1 'true' == true - 對象與原始類型值比較
- 對象與數值類型比較,對象轉為數值
- 對象與字元串類型比較,對象轉為字元串
- 對象與布爾值比較時,兩邊都是數值
// 對象與數值類型比較,對象轉為數值 // true 等同於 Number([2]) == 2 [2] == 2 // 對象與字元串比較,對象轉為字元串 // true 等同於 String([3,4]) == '3,4' [3,4] == '3,4' // 對象與布爾值比較,兩邊都轉為數值 // false 等同於 Number([5]) == Number(true) [5] == true - null和undefined與其他類型的值比較時,結果都為false,他們相互比較時為true: null == undefined // true
- 相等運算符隱藏的類型轉換,會帶來違反直覺的結果,因此不建議使用想的運算符(==),最好只使用嚴格相等運算符(===): 0 == '' 返回true
不相等運算符
它的演算法就是先求相等運算符的結果,然後再返回相反值
