js中對象轉化成字符串、數字或布爾值的轉化規則


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

二、對象轉化成數字

需要轉化成數字的兩種主要情況:
  1. 函數里邊的參數需要是數字,如: Math.sin(obj) / isNaN(obj) 以及算術運算符: +obj ;
  2. 用於比較,如: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

根據上述,對象在相等性判斷中如何轉變?

在布爾上下文中, atrue , bfalse,a == b這是可能的 。

 [] == ![] //true

內部的轉化步驟:

1、右邊是![],將會被轉換成一個布爾值,[]為true,取非為false,此時表達式變成:

[]==false;

2、按照規則,右邊是布爾值,將false轉換成0,左邊是數組,數組也將進行數字轉換,先調用valueOf(),不能轉化成原始值,再用toString(),轉換為0

0 == 0

 3、結果為true

補充 == 和!=判斷規則(注意: ===!==  和 對象==對象 這三種情況不會進行類型轉換):

  1. 如果有一個操作數是布爾值,則在比較相等性之前先將其轉換為數值----false轉化為0,true轉化為1;
  2. 如果有一個數是字符串,另一個操作數是數值,將字符串轉化成數值;
  3. 如果一個操作數是對象,另一個操作數不是對象,將對象轉化為基本操作類型(先valueOf()再toString(),均不能得到基本類型的值則會報錯),再比較。

所以,對象在相等性判斷中:

  • 若兩邊都是對象,不會進行類型轉換,為同一個引用才會返回true
  • 若只有一邊為對象,則會先調用對象的valueOf()方法,不能返回基本類型,再調用對象的toString()方法,還是不能就會報錯,否則用轉化后的基本類型值繼續進行判斷

舉例,感受下~: 

[]==[]//false
[]==false//true
!![]//true
[]==![]//true

總結:


在JavaScript中,對象有三個轉換,這取決於具體情況:

  1. 字符串輸出,使用toString 。
  2. 數字:數學函數,操作符,使用valueOf 后使用 toString 。
  3. 布爾值:轉化為true。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM