一次弄懂Javascript隱式轉換

四種轉換總覽

ToPrimitive

做用

將對象類型轉換爲原始類型web

語法

ToPrimitive(obj,type)數組

type不一樣值的說明

type爲string:

1.先調用obj的toString方法,若是爲原始值,則return,不然進行第2步
  2.調用obj的valueOf方法,若是爲原始值,則return,不然進行第3步
  3.拋出TypeError 異常
複製代碼

type爲number:

1.先調用obj的valueOf方法,若是爲原始值,則return,不然進行第2步
  2.調用obj的toString方法,若是爲原始值,則return,不然第3步
  3.拋出TypeError 異常
複製代碼

type參數爲空

1.該對象爲Date,則type被設置爲String
  2.不然,type被設置爲Number
複製代碼

ToPrimitive總結

ToPrimitive轉成何種原始類型,取決於type,type參數可選。
若指定,則按照指定類型轉換。
若不指定,默認根據實用狀況分兩種狀況,Date爲string,其他對象爲number。
複製代碼

ToString

做用

將其餘類型轉換爲字符串類型編輯器

規則(文字)

null:轉爲"null"
undefined:轉爲"undefined"
布爾類型:true和false分別被轉爲"true"和"false"
數字類型:轉爲數字的字符串形式,如10轉爲"10"
數組:轉爲以","鏈接的字符串,空數組[]轉爲空字符串,數組中的null或undefined,會被當作空字符串處理
普通對象:轉爲字符串至關於直接使用Object.prototype.toString(),返回"[object Object]"
複製代碼

規則(表格)

ToNumber

做用

將其餘類型轉換爲數字類型ui

規則(文字)

null: 轉爲0
undefined:轉爲NaN
字符串:若是是純數字形式,則轉爲對應的數字,空字符轉爲0, 不然一概按轉換失敗處理,轉爲NaN
布爾:true和false被轉爲1和0
數組:數組先被轉爲原始類型,而後在根據轉換後的原始類型按照上面的規則處理
對象:同數組的處理方式
複製代碼

規則(表格)

ToBoolean

做用

將其餘類型轉換爲布爾類型this

規則(文字)

null、undefined、0、NaN、」」轉爲false
其他轉爲 true
複製代碼

規則(表格)

==運算符規則

比較運算 x==y, 其中 x 和 y 是值,返回 true 或者 false。這樣的比較按以下方式進行
一、若 Type(x) 與 Type(y) 相同, 則
    1* 若 Type(x) 爲 Undefined, 返回 true。
    2* 若 Type(x) 爲 Null, 返回 true。
    3* 若 Type(x) 爲 Number, 則
        (1)、若 x 爲 NaN, 返回 false。
        (2)、若 y 爲 NaN, 返回 false。
        (3)、若 x 與 y 爲相等數值, 返回 true。
        (4)、若 x 爲 +0 且 y 爲 −0, 返回 true。
        (5)、若 x 爲 −0 且 y 爲 +0, 返回 true。
        (6)、返回 false。
    4* 若 Type(x) 爲 String, 則當 x 和 y 爲徹底相同的字符序列(長度相等且相同字符在相同位置)時返回 true。 不然, 返回 false。
    5* 若 Type(x) 爲 Boolean, 當 x 和 y 爲同爲 true 或者同爲 false 時返回 true。 不然, 返回 false。
    6*  當 x 和 y 爲引用同一對象時返回 true。不然,返回 false。
二、若 x 爲 null 且 y 爲 undefined, 返回 true。
三、若 x 爲 undefined 且 y 爲 null, 返回 true。
四、若 Type(x) 爲 Number 且 Type(y) 爲 String,返回比較 x == ToNumber(y) 的結果。
五、若 Type(x) 爲 String 且 Type(y) 爲 Number,返回比較 ToNumber(x) == y 的結果。
六、若 Type(x) 爲 Boolean, 返回比較 ToNumber(x) == y 的結果。
七、若 Type(y) 爲 Boolean, 返回比較 x == ToNumber(y) 的結果。
八、若 Type(x) 爲 String 或 Number,且 Type(y) 爲 Object,返回比較 x == ToPrimitive(y) 的結果。
九、若 Type(x) 爲 Object 且 Type(y) 爲 String 或 Number, 返回比較 ToPrimitive(x) == y 的結果。
十、返回 false。
複製代碼

例題解析

a 爲何值時,控制檯能輸出Hello world?spa

a = ? // 
if(a == 1 && a == 2 && a == 3){  console.log("Hello world") } 複製代碼

解法1

利用對象在和原始類型的值比較是默認調用ToPrimitive方法裏的ValueOf方法prototype

var a = {
 i: 1,  valueOf() {  return this.i++;  }  }  if (a == 1 && a == 2 && a == 3) {  console.log("Hello world");  } 複製代碼
一、在判斷a == 1時,由於a爲非原始類型,因此須要先調用ToPrimitive方法,調用valueOf方法。
二、返回this.i值爲1,並將i自加1,返回的1與等式右邊的1進行比較返回true。
三、後面的操做同理
複製代碼

解法2

利用對象在和原始類型的值比較是默認調用ToPrimitive方法裏的ToString方法3d

var a = {
 i: 1,  toString() {  return this.i++;  }  }  if (a == 1 && a == 2 && a == 3) {  console.log("Hello world");  } 複製代碼
一、在判斷a == 1時,由於a爲非原始類型,因此須要先調用ToPrimitive方法,調用valueOf方法,返回自身
 二、繼續調用toString方法,返回this.i的值爲1,並將i自加1,返回的1與等式右邊的1進行比較返回true。
 三、後面的操做同理
複製代碼

解法3

利用對象在和原始類型的值比較是默認調用ToPrimitive方法裏的ToString方法時隱式調用join方法code

var a = [1,2,3];
 a.join = a.shift;  if (a == 1 && a == 2 && a == 3) {  console.log("Hello world");  } 複製代碼
一、在判斷a == 1時,由於a爲非原始類型,因此須要先調用ToPrimitive方法,調用valueOf方法,返回自身
二、繼續調用toString方法,toString方法默認調用join方法
三、而對象a上的join方法被重寫,變成shift方法,所以執行shift方法返回被刪除的1,數組變成[2,3]
四、後面的操做同理
複製代碼

其餘解法

var val = 0;
 Object.defineProperty(window, 'a', {  get: function() {  return ++val;  }  });  // ---------------------------------  let a={  reg: /\d/g,  valueOf(){  return this.reg.exec(123)[0]  }  } 複製代碼
最後兩個解法不屬於隱式轉換,因此再也不展開
複製代碼

課後習題

null >0 // false
 null == 0// false  null >= 0 // true  [] == ![] // true   [] == 0 // true   [2]== 2 // true   ['0'] == false // true   '0' == false // true   [] == false // true   [null] == 0 // true   null == 0 // false   [null] == false // true   null == false // false   [undefined] == false // true   undefined == false // false 複製代碼
相關文章
相關標籤/搜索