官术网_书友最值得收藏!

1.4.1 等于運算符

不同于其他編程語言,JavaScript中相等的比較分為雙等于(==)比較和三等于(===)比較。這是因為在Java、C等強類型語言中,一個變量在使用前必須聲明變量類型,所以在比較的時候就無須判斷變量類型,只需要有雙等于即可。而JavaScript是弱類型語言,一個變量可以聲明為任何類型的值,在比較時,采用的等于運算符不同,最后得到的結果也可能不同,具體表現(xiàn)如下。

· 雙等于運算符在比較時,會將兩端的變量進行隱式類型轉(zhuǎn)換,然后比較值的大小。

· 三等于運算符在比較時,會優(yōu)先比較數(shù)據(jù)類型,數(shù)據(jù)類型相同才去判斷值的大小,如果類型不同則直接返回“false”。

對于不同類型的數(shù)據(jù),在比較時需要遵循不同的規(guī)則。

1. 三等于運算符

① 如果比較的值類型不相同,則直接返回“false”。


1 === '1'; // false
true === 'true';  // false 

需要注意的是,基本類型數(shù)據(jù)存在包裝類型。在未使用new操作符時,簡單類型的比較實際為值的比較,而使用了new操作符后,實際得到的是引用類型的值,在判斷時會因為類型不同而直接返回“false”。


1 === Number(1);  // true
1 === new Number(1);  // false
'hello' === String('hello');  // true
'hello' === new String('hello'); // false

② 如果比較的值都是數(shù)值類型,則直接比較值的大小,相等則返回“true”,否則返回“false”。需要注意的是,如果參與比較的值中有任何一方為NaN,則返回“false”。


23 === 23;   // true
34 === NaN;  // false
NaN === NaN; // false

③ 如果比較的值都是字符串類型,則判斷每個位置的字符是否一樣,如果一樣則返回“true”,否則返回“false”。


'kingx' === 'kingx';   // true
'kingx' === 'kingx2';  // false

④ 如果比較的值都是Boolean類型,則兩者同時為true或者false時,返回“true”,否則返回“false”。


false === false;  // true
true === false;   // false

⑤ 如果比較的值都是null或者undefined,則返回“true”;如果只有一方為null或者undefined,則返回“false”。


null === null;   // true
unde?ned === unde?ned;   // tr
null === unde?ned;   // false

⑥ 如果比較的值都是引用類型,則比較的是引用類型的地址,當兩個引用指向同一個地址時,則返回“true”,否則返回“false”。


var a = [];
var b = a;
var c = [];
console.log(a === b); // true
console.log(a === c); // false
console.log({} === {}); // false

實際上,如果不是通過賦值運算符(=)將定義的引用類型的值賦予變量,那么引用類型的值在比較后都會返回“false”,所以我們會發(fā)現(xiàn)空數(shù)組或者空對象的直接比較返回的是“false”。


[] === [];  // false
{} === {};  // false

引用類型變量的比較還有一個很明顯的特點,即只要有一個變量是通過new操作符得到的,都會返回“false”,包括基本類型的包裝類型。


'hello' === new String('hello');  // false
new String('hello') === new String('hello');  // false

// 函數(shù)對象類型
function Person(name) {
   this.name = name;
}
var p1 = new Person('zhangsan');
var p2 = new Person('zhangsan');
console.log(p1 === p2);  // false

2. 雙等于運算符

相比于三等于運算符,雙等于運算符在進行相等比較時,要略微復雜,因為它不區(qū)分數(shù)據(jù)類型,而且會做隱式類型轉(zhuǎn)換。雙等于運算符同樣會遵循一些比較規(guī)則。

① 如果比較的值類型相同,則采用與三等于運算符一樣的規(guī)則。


123 === 123;    // true
false == false; // true
[] == [];       // false
{} == {};       // false

② 如果比較的值類型不同,則會按照下面的規(guī)則進行轉(zhuǎn)換后再進行比較。

· 如果比較的一方是null或者undefined,只有在另一方是null或者undefined的情況下才返回“true”,否則返回“false”。


null == unde?ned;      // true
null == 1;             // false
null == false;         // false
unde?ned == 0;         // false
unde?ned == false;      // false

· 如果比較的是字符串和數(shù)值類型數(shù)據(jù),則會將字符串轉(zhuǎn)換為數(shù)值后再進行比較,如果轉(zhuǎn)換后的數(shù)值相等則返回“true”,否則返回“false”。


1 == '1';     // true
123 == '123'; // true

需要注意的是,如果字符串是十六進制的數(shù)據(jù),會轉(zhuǎn)換為十進制后再進行比較。


'0x15' == 21;  // true

字符串'0x15'實際為十六進制數(shù),轉(zhuǎn)換為十進制后為1×16 + 5 = 21,與21比較后返回“true”。

字符串并不支持八進制的數(shù)據(jù),如果字符串以0開頭,則0會直接省略,后面的值當作十進制返回。


'020' == 16;  // false
'020' == 20;  // true

'020'會被直接當作十進制處理,前面的0省略,得到的是20,然后與20比較后返回“true”。· 如果任一類型是boolean值,則會將boolean類型的值進行轉(zhuǎn)換,true轉(zhuǎn)換為1,false轉(zhuǎn)換為0,然后進行比較。


'1' == true;    // true
'0' == false;   // true
'0.0' == false; // true
'true' == true; // false

上述代碼中,true會轉(zhuǎn)換為1,false會轉(zhuǎn)換為0,字符串'1'會轉(zhuǎn)換為1,'0'和'0.0'會轉(zhuǎn)換為0,然后進行比較。而字符串'true'不能正常轉(zhuǎn)換為數(shù)字,最終轉(zhuǎn)換為NaN,所以'true'與true的比較會返回“false”。

· 如果其中一個值是對象類型,另一個值是基本數(shù)據(jù)類型或者對象類型,則會調(diào)用對象的valueOf()函數(shù)或者toString()函數(shù),將其轉(zhuǎn)換成基本數(shù)據(jù)類型后再作比較,關于valueOf()函數(shù)和toString()函數(shù)會在1.5節(jié)中詳細講到。

主站蜘蛛池模板: 中方县| 凌源市| 潜山县| 保康县| 孟连| 桃江县| 垣曲县| 江西省| 社会| 临邑县| 铜川市| 高要市| 皮山县| 克什克腾旗| 竹山县| 夏河县| 临猗县| 金秀| 武邑县| 同仁县| 商洛市| 定日县| 玛纳斯县| 宣化县| 镇雄县| 合江县| 八宿县| 湛江市| 郓城县| 建水县| 常宁市| 天台县| 玉屏| 简阳市| 马山县| 时尚| 井冈山市| 昌图县| 玛沁县| 公安县| 蒙自县|