特殊類型比較
不進行類型轉化,須要強記;code
null == undefined // true symbol(1) == 1 // false
類型轉化( == , > , < , != , >=, <= )對象
boolean, string, number 兩兩比較會轉化爲 number進行比較;
Number(boolean) == Number
Number(string) == Numberip
true == 2 // false true == 1 // true true == 0 // false true == '2' // false true == '1' // true true == '0' // false '1' == 2 // false '1' == 1 // true '1' == 0 // false true > 2 // false true > 1 // false true > 0 // true true > '2' // false true > '1' // false true > '0' // true '1' > 2 // false '1' > 1 // false '1' > 0 // true 'null' == 1 // false <=> Number('null') == 1 <=> NaN == 1 'null' == 2 // false 'null' == NaN // false <=> Number('null') == NaN <=> NaN == NaN 'undefined' == 1 // false <=> Number('undefined') == 1 <=> NaN == 1 'undefined' == 2 // false 'undefined' == NaN // false <=> Number('null') == NaN <=> NaN == NaN
若是一個對象與數字或字符串相比較,JavaScript會嘗試返回對象的默認值。操做符會嘗試經過方法valueOf和toString將對象轉換爲其原始值(一個字符串或數字類型的值)。若是嘗試轉換失敗,會產生一個運行時錯誤。字符串
既無自定義valueOf,又無自定義toString,則調用默認toStringget
const a = {name: 'andy'} a == '[object Object]' // true a > '4' // true a > '3' // true a > '2' // true a > 'p' // false <=> a.toString() > 'p' <=> '[object Object]' > 'p' a > 4 // false a > 3 // false a > 2 // false
只存在自定義toString,則調用自定義toStringstring
const a = {name: 'andy'} a.toString = () => 4 a == '[object Object]' // false a == 4 // true a > '4' // false a > '3' // true a > '2' // true
只存在自定義valueOf,則調用自定義valueOfobject
const a = {name: 'andy'} a.valueOf = () => 3 a == '[object Object]' // false a == 3 // true a > '4' // false a > '3' // false a > '2' // true
既存在自定義valueOf,又存在自定義toString方法,則自定義valueOf優先級更高;引用
// 同時存在 valueof 和 toString const a = {name: 'andy'} a.valueOf = () => 3 a.toString = () => 4 a == '[object Object]' // false a == 4 // false a == 3 // true a > '4' // false a > '3' // false a > '2' // true
必須值也相同,才返回true方法
NaN === NaN // false +0 === -0 // true null === null // true undefined === undefined //true
字符串比較基於Unicode 值developer
'5' > '10' // true
對象比較基於引用地址
{} == {} // false new String('foo') == new String('foo') // false new String('foo') == 'foo' // true 隱含了類型轉化 <=> new String('foo').valueOf() == 'foo'