一、js 隱式轉換規則
1. javascript 隱式轉換規則
隱式型別轉換是在一定場景下,js 運行環境自動呼叫這幾個方法,嘗試轉換成期望的資料型別
- ToString
- ToNumber
- ToBoolean
- ToPrimitive
注:有關 javascript 隱式轉換規則詳情,可參考 Javascript基礎:隱式型別轉換
2.兩個資料比較的情況
兩個資料比較時,如果兩邊資料不是同種型別的話,按以下規則進行相應的隱式型別型別轉換
- 物件 --> 字串 --> 數值
- 布林值 --> 數值
注:有關兩個資料相加的情況,可參考 “加號 +” 的運算原理(詳細!!!);
??有關隱式轉換規則的坑點詳細分析,可參考 js面試題大坑——隱式型別轉換
二、具體分析(六種基本情況 + 三種特殊情況)
1. 物件和字串比較
① 說明
隱式轉換規則:呼叫 ToPrimitive() 內部函式,將物件轉換為字串,然后兩者進行比較,
注:在 js 中,想要將物件轉換成原始值,必然會呼叫 toPrimitive() 內部函式,
??① 有關 ToPrimitive() 方法,可參考 JS原始值轉換演算法—toPrimitive()
??① 有關 valueOf() 方法,可參考 JS 中 valueOf() 方法的詳解
??① 有關 toString() 方法,可參考 有關 toString() 方法的初步認識
② 示例
// 陣列(Array)物件和字串比較
[1,2,3] == '1,2,3' // true
隱式轉換程序:
- 對左邊的陣列物件進行隱式轉換
ToPrimitive([1,2,3])->'1,2,3'; - 然后和右邊的
'1,2,3'比較,易得結果為true
// Object 物件和字串比較
let obj = {a:1}
obj == '[object Object]' // true
隱式轉換程序:
- 對左邊的陣列物件進行隱式轉換
ToPrimitive([1,2,3])->'[object Object]'; - 然后和右邊的
'[object Object]'比較,易得結果為true
2. 物件和數值比較
① 說明
隱式轉換規則:呼叫 ToPrimitive() 內部函式,將物件轉換為字串,再呼叫 ToNumber() 將字串轉換為數字,然后兩者進行比較,
ToNumber(argument) 轉換方式:
| argument型別 | 回傳值 |
|---|---|
| Undefined | return NaN |
| Null | return 0 |
| Boolean | true return 1; false return 0; |
| Number | return value |
| String | 若字串為純數字,回傳轉換后的數字;空字符則回傳 0;非純數字則回傳 NaN |
| Symbol | 拋出 TypeError 例外 |
| Object | 進行如右步驟:1.先進行 ToPrimitive(argument, hint Number) 得到 rs ;?2.然后回傳 ToNumber(rs) 的結果, |
② 示例
// 陣列(Array)物件和數值比較
[11] == 11 // true
隱式轉換程序:
- 物件轉換為字串
ToPrimitive([11])->'11'; - 字串轉換為數字
ToNumber('11')->11 - 然后和右邊的
11比較,易得結果為true
3. 物件和布林值比較
① 說明
隱式轉換規則:
??呼叫 ToPrimitive() 內部函式,將物件轉換為字串,再呼叫 ToNumber() 將字串轉換為數字;
??呼叫 ToNumber() 將布林值轉換為數字;
??然后兩者進行比較,
ToNumber(argument) 轉換方式:
| argument型別 | 回傳值 |
|---|---|
| String | 若字串為純數字,回傳轉換后的數字;空字符則回傳 0;非純數字則回傳 NaN |
| Boolean | true return 1; false return 0; |
② 示例
// 陣列(Array)物件和布林值比較
[] == false // true
左邊資料的隱式轉換程序:
- 物件轉換為字串
ToPrimitive([])->''; - 字串轉換為數字
ToNumber('')->0
右邊資料的隱式轉換程序:
- 布林值轉換為數字
ToNumber(false)->0 - 兩邊比較,易得結果
true
4. 字串和數值比較
① 說明
隱式轉換規則:
??呼叫 ToNumber() 將字串轉換為數字,然后兩者進行比較,
ToNumber(argument) 轉換方式:
| argument型別 | 回傳值 |
|---|---|
| String | 若字串為純數字,回傳轉換后的數字;空字符則回傳 0;非純數字則回傳 NaN |
② 示例
// 陣列(Array)物件和布林值比較
'11' == 11 // true
隱式轉換程序:
- 字串轉換為數字
ToNumber('11')->11 - 兩邊比較,易得結果
true
5. 字串和布林值比較
① 說明
隱式轉換規則:
??呼叫 ToNumber() 將字串轉換為數字;
??呼叫 ToNumber() 將布林值轉換為數字;
??然后兩者進行比較,
ToNumber(argument) 轉換方式:
| argument型別 | 回傳值 |
|---|---|
| String | 若字串為純數字,回傳轉換后的數字;空字符則回傳 0;非純數字則回傳 NaN |
| Boolean | true return 1; false return 0; |
② 示例
// 陣列(Array)物件和布林值比較
'1' == true // true
左邊資料的隱式轉換程序:
- 字串轉換為數字
ToNumber('1')->1
右邊資料的隱式轉換程序:
- 布林值轉換為數字
ToNumber(true)->1 - 兩邊比較,易得結果
true
6. 布林值和數值比較
① 說明
隱式轉換規則:
??呼叫 ToNumber() 將布林值轉換為數字,然后兩者進行比較,
ToNumber(argument) 轉換方式:
| argument型別 | 回傳值 |
|---|---|
| Boolean | true return 1; false return 0; |
② 示例
// 陣列(Array)物件和布林值比較
1 == true // true
隱式轉換程序:
- 布林值轉換為數字
ToNumber(true)->1 - 兩邊比較,易得結果
true
7. 存在 !運算子(特殊情況一)
① 說明
隱式轉換規則:
??若某資料前面存在 !運算子,則先將該資料轉換為布林值,其余的按照上述規則進行,
注:除 0、NaN、''、null、undefined 轉換為布林值為 false 外,其余資料轉換為布林值均為 true,此外,還應關注一下一些特殊數,
console.log( ! 0 ); // true
console.log( ! NaN ); // true
console.log( ! '' ); // true
console.log( ! null ); // true
console.log( ! undefined ); // true
console.log( ! [] ); // false
console.log( ! {} ); // false
console.log( ! Infinity ); // false
console.log( ! ( - Infinity )); // false
② 示例
[] == false; // true
見第 3 點 “物件和布林值比較” 的分析
![] == false; // true
隱式轉換程序:
- 由于存在
!運算子,故直接將[]轉換為布林值true,則![],為false - 兩邊比較,易得結果為
true
8. null 和 undefined 的比較(特殊情況二)
① 說明
- 實際上,undefined 值是派生自 null 值的,ECMAScript 標準規定對二者進行相等性測驗要回傳 true,可以理解為 null 和 undefined 都代表著無效的值,所以二者相等,但由于是兩種不同的原始資料型別,所以不全等,
- 除此之外其他的型別的值與它們都不相等,
注:有關 null 和 undefined 的詳情和區別,可參考 JS 中的 undefined 和 null 的區別
② 示例
undefined == null // true
undefined === null // false
9. 存在 NaN(特殊情況三)
① 說明
- NaN(Not a Number)表示一個非數字,但資料型別確是 Number 型別
- NaN 是 JavaScript 之中唯一不等于自身的值,不等于任何值,包括它本身
② 示例
NaN == NaN // false
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/304948.html
標籤:其他
下一篇:jQuery01基礎語法
