將對象類型轉換爲原始類型web
ToPrimitive(obj,type)數組
1.先調用obj的toString方法,若是爲原始值,則return,不然進行第2步
2.調用obj的valueOf方法,若是爲原始值,則return,不然進行第3步
3.拋出TypeError 異常
複製代碼
1.先調用obj的valueOf方法,若是爲原始值,則return,不然進行第2步
2.調用obj的toString方法,若是爲原始值,則return,不然第3步
3.拋出TypeError 異常
複製代碼
1.該對象爲Date,則type被設置爲String
2.不然,type被設置爲Number
複製代碼
ToPrimitive轉成何種原始類型,取決於type,type參數可選。
若指定,則按照指定類型轉換。
若不指定,默認根據實用狀況分兩種狀況,Date爲string,其他對象爲number。
複製代碼
將其餘類型轉換爲字符串類型編輯器
null:轉爲"null"
undefined:轉爲"undefined"
布爾類型:true和false分別被轉爲"true"和"false"
數字類型:轉爲數字的字符串形式,如10轉爲"10"
數組:轉爲以","鏈接的字符串,空數組[]轉爲空字符串,數組中的null或undefined,會被當作空字符串處理
普通對象:轉爲字符串至關於直接使用Object.prototype.toString(),返回"[object Object]"
複製代碼
將其餘類型轉換爲數字類型ui
null: 轉爲0
undefined:轉爲NaN
字符串:若是是純數字形式,則轉爲對應的數字,空字符轉爲0, 不然一概按轉換失敗處理,轉爲NaN
布爾:true和false被轉爲1和0
數組:數組先被轉爲原始類型,而後在根據轉換後的原始類型按照上面的規則處理
對象:同數組的處理方式
複製代碼
將其餘類型轉換爲布爾類型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") } 複製代碼
利用對象在和原始類型的值比較是默認調用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。
三、後面的操做同理
複製代碼
利用對象在和原始類型的值比較是默認調用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。
三、後面的操做同理
複製代碼
利用對象在和原始類型的值比較是默認調用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 複製代碼