js運算子 “==” 與 “===”

陳廣亮發表於2018-09-14

"=="運算子遵循幾個規則:

  1. 如果有一個運算元是布林值,則在比較前將其轉換為數值 false => 0,true => 1
true == 1 // true 
false == 0 // true
複製程式碼
  1. 如果有一個運算元為字串,另一個運算元為數值,則在比較前將字串轉換為數值(更正下應該是用Number轉換)
"1" == 1 => Nunber("1") == 1 => 1 == 1
"1" == true => "1" == 1 => Number("1") == 1 
"1a" == 1 => Number("1a") == 1 => NaN == 1 // false parseInt("1a") => 1
複製程式碼
  1. 如果有一個運算元是物件,另一個不是,則呼叫物件的valueOf()方法,在按前2條規則比較 如果valueOf()不返回一個原始值則呼叫toString() 注: Date型別直接呼叫toString()
function test(){}
test.prototype.valueOf = function(){ return 1; }
var t = new test();
t == 1 => t.valueOf() == 1 =>  1 == 1
複製程式碼

所以得注意物件的valueOf方法了。。。預設的是繼承的Object的valueOf方法

還有一些特殊的規則

  1. null == undifined //true
  2. null和undifined比較前不轉換
  3. 如果有一個運算元是NaN則恆返回false,即使NaN == NaN也返回false
  4. 如果2個運算元都是物件,則比較是不是同一個物件,如果指向通一個物件則返回true。
true == true // true
new Boolean(true) == true // true 呼叫Boolean.valueOf 方法
new Boolean(true) == new Boolean(true) // false 比較是不是同一個物件
複製程式碼

"==="就是不轉換比較數值。。

相關文章