1. 程式人生 > >js中物件轉化成字串、數字或布林值的轉化規則

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。