- JavaScript重難點實例精講
- 周雄
- 1665字
- 2020-10-30 15:51:53
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é)中詳細講到。
- Python程序設計教程(第2版)
- MySQL 8 DBA基礎教程
- Swift細致入門與最佳實踐
- Mastering Xamarin.Forms(Second Edition)
- 打開Go語言之門:入門、實戰(zhàn)與進階
- ExtJS Web應用程序開發(fā)指南第2版
- Angular應用程序開發(fā)指南
- 智能手機故障檢測與維修從入門到精通
- Web Developer's Reference Guide
- 硬件產(chǎn)品設計與開發(fā):從原型到交付
- Vue.js 3應用開發(fā)與核心源碼解析
- Java程序設計教程
- Spring Boot學習指南:構建云原生Java和Kotlin應用程序
- 分布式系統(tǒng)架構與開發(fā):技術原理與面試題解析
- Python程序設計:基礎與實踐