js中對象可以轉化成 字元串、數字、布爾值 一、對象轉化成字元串: 規則: 1、如果對象有toString方法,則調用該方法,並返回相應的結果;(代碼通常會執行到這,因為在所有對象中都有toString方法) 2、如果對象有valueOf方法,則調用該方法,並返回相應的結果; 3、否則拋出異常。 通 ...
js中對象可以轉化成 字元串、數字、布爾值
一、對象轉化成字元串:
規則:
1、如果對象有toString方法,則調用該方法,並返回相應的結果;(代碼通常會執行到這,因為在所有對象中都有toString方法)
2、如果對象有valueOf方法,則調用該方法,並返回相應的結果;
3、否則拋出異常。
通常,所有對象都有toString方法,且內置對象都有自己toString方法的
實現
alert( {key: 'value'} ) // [object Object]
alert( [1,2] ) // "1,2"
alert( new Date() ) // "Sat Sep 15 2018 15:58:01 GMT+0800 (中國標準時間)"
在界面輸出中, 比如 alert() 和 document.write() ,將優先調用 toString,如果過得不到 標量 或 undefined、null ,再嘗試 valueOf ,如果仍然返回對象則報錯。
其實 parseInt()、 alert()、 document.write() 這些函數的調用中,參數所進行的類型轉換,應當視為"被動的" , 是函數的實現方式使之優先調用 toString, 而非數據對象自動調用 toString。
可以自定義toString()
var obj = {
age:23,
toString:function(){
return this.age;
}
}
obj.toString();//23
二、對象轉化成數字
需要轉化成數字的兩種主要情況:- 函數裡邊的參數需要是數字,如:
Math.sin(obj)
/isNaN(obj) 以及
算術運算符:+obj
; - 用於比較,如:
obj == 'John'
PS:下麵兩種比較不會發生類型轉換,
a)在嚴格比較(===)中,不會發生任何的類型轉換,
b)在非嚴格比較中,如果參數都是對象,不會發生類型轉換,通常,如果兩個對象引用統一對象,則返回true.
轉化成數字的規則:
1、如果對象有valueOf方法,則調用該方法,並返回相應的結果;
2、當調用valueOf返回的依然不是數字,則會調用對象的toString方法,並返回相應的結果;
3、否則拋出異常。
對象的valueOf方法返回的是對象本身,而不是字元串(比如數組、函數,它們的valueOf方法是從Object.prototype上繼承下來的,預設行為是返回對象本身),所以才會採用toString
對於對象型參與 算術運算和 "==" 運算, 不等於比較元算(> 、<、>=、<=),自動發生數據類型轉換,先調用 valueOf ,如果 valueOf 不能返回標量(number、string、boolean) 和 undefined、 null ,
將繼續調用 toString, 如果仍然返回對象型數據,報錯。
Date 類型的例外: 在 + 和 == 運算中,優先 toString ,這應該是規範對該數據類型的特殊對待。
補充:調用valueOf()的結果:
參數類型 | 返回結果 |
Undefined | 拋出TypeError異常 |
Null | 拋出TypeError異常 |
Number | 創建一個Number對象,它內部的初始值為傳入的參數值 |
String | 創建一個String對象,它內部的初始值為傳入的參數值 |
Boolean | 創建一個Boolean對象,它內部的初始值為傳入的參數值 |
Object | 對象本身 |
可以重寫對象的valueOf()方法(百度一道面試題,定義一個對象,使obj == '1' ,結果為true):
var obj = {
valueOf: function(){
return 1;
}
};
console.log(obj == '1');//true
三、對象轉化成布爾值:
對象在JS中總是返回true
根據上述,對象在相等性判斷中如何轉變?
在布爾上下文中, a
是true
, b
是false,
。a == b
,這是可能的
[] == ![] //true
內部的轉化步驟:
1、右邊是![],將會被轉換成一個布爾值,[]為true,取非為false,此時表達式變成:
[]==false;2、按照規則,右邊是布爾值,將false轉換成0,左邊是數組,數組也將進行數字轉換,先調用valueOf(),不能轉化成原始值,再用toString(),轉換為0
0 == 03、結果為true
補充 == 和!=判斷規則(註意: ===!== 和 對象==對象 這三種情況不會進行類型轉換):
- 如果有一個操作數是布爾值,則在比較相等性之前先將其轉換為數值----false轉化為0,true轉化為1;
- 如果有一個數是字元串,另一個操作數是數值,將字元串轉化成數值;
- 如果一個操作數是對象,另一個操作數不是對象,將對象轉化為基本操作類型(先valueOf()再toString(),均不能得到基本類型的值則會報錯),再比較。
所以,對象在相等性判斷中:
- 若兩邊都是對象,不會進行類型轉換,為同一個引用才會返回true
- 若只有一邊為對象,則會先調用對象的valueOf()方法,不能返回基本類型,再調用對象的toString()方法,還是不能就會報錯,否則用轉化後的基本類型值繼續進行判斷
舉例,感受下~:
[]==[]//false
[]==false//true
!![]//true
[]==![]//true
總結:
在JavaScript中,對象有三個轉換,這取決於具體情況:
- 字元串輸出,使用
toString
。 - 數字:數學函數,操作符,使用
valueOf
後使用toString
。 - 布爾值:轉化為true。