Java的等號有=
,==
,===
三個運算符雖然都讀成「等於」,但概念是不同的,=
指的是賦值,在這篇文章中咱們不會進行更多的介紹;==
稱爲相等運算符,比較的是兩個操做數值是否相等;===
稱爲嚴格相等運算符,比較的是兩個操做數是不是「徹底相同」。數組
針對相等運算符==
和===
,有兩個對應的!=
和!==
運算符,這兩個不相等運算符的運算結果是==
和===
運算結果的相反值。bash
嚴格相等運算符在對操做數進對比運算時,是不進行類型轉換的。對比規則以下:函數
對比結果是falseui
1 === "1" // false
true === "true" // false
undefined === true //false
1 === true //false
複製代碼
若是兩個值都是原始類型值(數字、字符串、布爾值),值相同就返回true
,值不一樣就返回false
。編碼
對於原始類型值,要注意的是,0
和-0
是相等的;若是兩個值是字符串,須要它們在16
位編碼的相同位置上有相同的值纔是相等。若是是不一樣的16
位編碼序列,就算有相同的內容,相同的長度,結果也是不相等。spa
'1' === '0' //false
1 === 0x1 // true
複製代碼
若是兩個值是對象(數組、函數、對象、Symbol
),對於兩個對象比較的是引用,若是引用指向的是不一樣的對象,則結果是不相等。code
{} === {} // false
[] === [] // false
(function () {} === function () {}) // false
var v1 = {};
var v2 = v1; //v2和v1指向同一個引用地址
v1 === v2 // true
// 沒有參數的狀況
let s1 = Symbol();
let s2 = Symbol();
s1 === s2 // false
// 有參數的狀況
let s1 = Symbol('foo');
let s2 = Symbol('foo');
let s3 = s1;
s1 === s2 // false
s1 === s2 // true
複製代碼
若是兩個值都是null
或者都是undefined
,結果是true
對象
null === null //true
undefined === undefined //true
複製代碼
若是兩個值都是NaN
,結果是false
字符串
NAN === NAN //false
複製代碼
NaN
和任何數字都不相等,包括它自身string
應用嚴格相等運算符轉換規則的值類型相同規則(除:操做數類型不一樣)。
若是是不一樣原始類型值(數字、字符串、布爾值)進行比較,將非數字類型轉換成數字,再進行比較。
0 == undefined //false
// 等同於 0 == Number(undefined)
// 等同於0 == NAN
0 == null //false
// 等同於 0 == Number(null)
1 == true // true
// 等同於 1 == Number(true)
'true' == true // false
// 等同於 Number('true') == Number(true)
// 等同於 NaN === 1
'' == 0 // true
// 等同於 Number('') == 0
// 等同於 0 == 0
'1' == true // true
// 等同於 Number('1') == Number(true)
// 等同於 1 == 1
'\n 123 \t' == 123 // true
// 由於字符串轉爲數字時,省略前置和後置的空格
複製代碼
若是其中一個操做數是對象,另一個是原始類型值(數字、字符串、布爾值),按以下規則轉:
例1:對象對比數字
[1] == 1 //true
複製代碼
解析:
a. [1]
先轉換成原始值"1"
;
b. 轉換後與右邊的操做數1類型不同,將"1"
轉換成1
;
c. 1 == 1
結果是true
例2:對象對比字符串
[1] == "1"
複製代碼
解析:
a. [1]
先轉換成原始值"1"
;
b. 轉換後與右邊的操做數"1"
類型同樣,"1"
=="1"
,結果是true
;
例3:對象對比布爾值
[1] == true
複製代碼
解析:
a. [1]
先轉換成原始值"1"
;
b. 轉換後與右邊的操做數true
類型不同,將右邊的操做數true
轉換成1
;
c. 1 == 1
結果是true
若是其中一個值是null
,另一個是undefined
,結果是相等
null == undefined
複製代碼
比較操做符的操做數多是任意類型,然而只有數字和字符串才能真正執行比較操做,所以那些不是數字和字符串的類型都將進行類型轉換。轉換的規則以下:
Date
,會調用該對象的toString
();valueOf()
返回的是原始類型,會調用對象的valueOf()
;valueOf()
不存在或沒有返回原始類型),會調用toString()
方法,大部分狀況下是用的這種轉換。toString()
方法,則拋出一個類型異常錯誤上面的規則只是應用於+
、==
、!=
中涉及到的對象轉爲原始類型的轉換規則,若是是>
,<
等其餘運算符涉及的轉換,轉換規則中除去日期對象的特殊狀況,其餘是同樣的,也就是說規則是下面這樣的:
valueOf()
返回的是原始類型,會調用對象的valueOf()
;valueOf()
不存在或沒有返回原始類型),會調用toString()
方法,大部分狀況下是用的這種轉換。toString()
方法,則拋出一個類型異常錯誤嚴格相等運算符的比較是不對操做數進行類型轉換的,只要操做數類型不一致,返回就是false
;對於操做數都是原始類型,值相等就返回true
,反之返回fase
;對於對象,對比的是引用指向的地址,地址是同一個,就返回false
,反之返回true
;另外介紹了幾個特殊的操做數的對比,undefined
、null
、NaN
,其中null
和undefined
是嚴格相等的,而NaN
和任何類型的操做數都不會相等包括它本身。
相等運算符是會對操做數進行類型轉換的,若是操做數的類型相同,則按嚴格相等運算符的規則。如操做數是不一樣的原始值類型,則都轉換成數字再進行比較;若是是原始值類型和對象的比較,則對象先轉換成原始類型值再對比,再比較時若是是相同類型就比較值,若是仍是不一樣,都轉換成數字再進行比較;null
和undefined
是相等的
+
、==
、!=
在進行運算時若是涉及到對象類型轉爲原始值時,轉換規則和其餘的運算符是不同的。