首頁 > web前端 > js教程 > 主體

Javascript中的valueOf與toString的比較介紹(程式碼範例)

不言
發布: 2019-02-13 10:18:18
轉載
2574 人瀏覽過

本篇文章帶給大家的內容是關於Javascript中的valueOf與toString的對比介紹(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

+{ a: 1, toString: function() { return '10' }, valueOf: function() { return '100' } }
登入後複製

以上引申出物件資料的轉換的問題:
所有物件繼承了兩個轉換方法:

  1. toString(): 它的作用是返回一個反映這個物件的字串

  2. valueOf():它的作用是傳回它對應的原始值

##toString( )

toString()函數的作用是傳回object的字串表示。

JavaScript中object預設的toString()方法傳回字串」[object Object]「。定義類別時可以實作新的toString()方法,從而傳回更有可讀性的結果。
JavaScript對於
陣列物件、函數物件、正規表示式物件以及Date日期物件都定義了更具可讀性的toString()方法:

Array的toString()方法將傳回以逗號分隔的陣列成員。

var arr = [1, 2, 3]
arr.toString() // "1,2,3"
登入後複製
Function的toString()方法將會傳回函數的文字定義。

var fun = function() { return 'fun' }
fun.toString() // "function() { return 'fun' }"
登入後複製
RegExp的toString()方法與Function的toString()方法類似,將傳回正規表示式的文字定義。

var reg = /d+/g
reg.toString() // "/d+/g"
登入後複製
Date的toString()方法將傳回一個具有可讀性的日期時間字串。

var date = new Date()
date.toString() // "Tue Feb 12 2019 14:04:36 GMT+0800 (中国标准时间)"
登入後複製
如果Boolean值是true,則傳回 “true”。否則,返回 “false”。

var boolean = true
boolean.toString() // "true"
登入後複製

valueOf()

valueOf()函數的作用是傳回該object本身。

與toString()一樣,定義類別時可以實作新的valueOf()方法,從而傳回所需的結果。
JavaScript對於Date物件定義了更具有可讀性的valueOf()方法:

Date的valueOf()方法將傳回時間戳數值,該數值為Date物件與

1970年1月1日零時的時間差(以毫秒為單位)。

var date = new Date()
date.valueOf() // 1549951476233
登入後複製
  • 其他一律回傳物件本身。

範例

var colors = ["red", "blue", "green"] // 创建一个包含3 个字符串的数组 
alert(colors.toString()) // red,blue,green 
alert(colors.valueOf()) // red,blue,green 
alert(colors) // red,blue,green
登入後複製

三個輸出全部一樣,那麼toString()和valueOf()差別到底是什麼?看下一個我寫的例子:

var arr = [1,2,3]
alert(Array.isArray(arr.valueOf())) // true
alert(Array.isArray(arr.toString())) // false
登入後複製
結果是第一個是true而第二個是false,為什麼呢,其實valueOf()調用完以後還是回傳一個陣列。這個陣列被alert的時候會呼叫toString()函數,所以不是valueOf()和toString()函數相同,而是間接的呼叫了toString()函數!

進一步測試下:

var arr = [1,2,3] 
arr.toString = function () { 
  alert("调用了toString函数");
} 
alert(arr.valueOf()) // "调用了toString函数"
登入後複製
結果就是我們會看到「呼叫了`toString函數」。

驗證如下程式碼:

var test = { 
  value: 10, 
  toString: function() { 
    console.log('toString')
    return this.value
  }, 
  valueOf: function() { 
    console.log('valueOf')
    return this.value
  } 
} 
alert(test) // 10 toString 
alert(+test) // 10 valueOf 
alert('' + test) // 10 valueOf 
alert(String(test)) // 10 toString 
alert(Number(test)) // 10 valueOf 
alert(test == '10') // true valueOf 
alert(test === '10') // false
登入後複製
valueOf的意思是傳回最適合該物件類型的原始值,而toString則是將在該物件類型的原始值以字串形式傳回。

範例1

alert(test) // 10 toString
登入後複製
這裡我們的alert函數需要是的字串,所以取得的是字串,而不是原始值,故而呼叫了toString

範例2

alert(+test) // 10 valueOf
登入後複製
同理,alert要的是字串不是原始值,其實是( test)的結果呼叫了toString,而test被呼叫了valueOf

為了驗證我們這樣寫:

var test = { 
  value: 1, 
  valueOf: function () { 
    alert("调用了test的valueOf函数")
    return this.value 
  }, 
  toString: function () { 
    alert("调用了test的toString函数") 
    return this.value 
  } 
}; 
var test2 = { 
  value: +test, 
  valueOf: function () { 
    alert("调用了test2的valueOf函数") 
    return this.value;
  }, 
  toString: function () { 
    alert("调用了test2的toString函数")
    return this.value 
  } 
}; 
alert(test2)
// 调用了test的valueOf函数
// 调用了test2的toString函数
// 1
登入後複製
其中讓test2 = test,那麼即可知道結果,果然如此,呼叫了test的valueOf和test2的toString

##範例3

alert('' + test) // 10 valueOf
登入後複製
同理,我們可以把上一段寫的程式裡面的test2: test改成test2:'' test

範例4

alert(String(test)) // 10 toString
登入後複製
String這個強制轉換其實在其內部是呼叫了傳入參數的toString函數

#範例5

alert(Number(test)) // 10 valueOf
登入後複製

範例6

alert(test == '10') // true valueOf
登入後複製

這個裡面的判等的順序是,取得原始值,然後判斷兩邊的原始值是否相等,所以呼叫valueOf

#範例7

alert(test === '10') // false
登入後複製

##=== 運算子不進行隱含轉換,判全等的第一個步驟是判斷類型,因為型別都不一樣了,所以後面什麼都不會呼叫

總結

valueOf偏向運算,toString偏向顯示。

在進行強轉字串類型時將優先呼叫toString方法,強轉為數字時優先呼叫valueOf。

在有運算運算子的情況下,valueOf的優先權高於toString。

下面給大家簡單說下valueof和tostring的差別:

valueOf():傳回最適合該物件類型的原始值

toString(): 將此對象的原始值以字串形式傳回

這兩個方法一般是交由JS去隱式調用,以滿足不同的運算情況。

在數值運算裡,會優先呼叫valueOf(),如a b

#在字串運算裡,會優先呼叫toString(),如alert(c)

以上是Javascript中的valueOf與toString的比較介紹(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:segmentfault.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板