91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Javascript中的valueOf與toString有什么不同

發布時間:2020-07-09 11:32:50 來源:億速云 閱讀:215 作者:Leah 欄目:web開發

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有什么不同問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

尉氏县| 榆树市| 张家港市| 柯坪县| 平陆县| 临城县| 本溪市| 炉霍县| 揭东县| 台东市| 贺州市| 磐石市| 民县| 麦盖提县| 长沙县| 会泽县| 四子王旗| 江北区| 芜湖市| 元阳县| 莎车县| 唐山市| 东阳市| 湖口县| 广丰县| 准格尔旗| 肃南| 荥经县| 施秉县| 民权县| 东台市| 岱山县| 通海县| 林口县| 武威市| 昌乐县| 娱乐| 武宁县| 紫阳县| 余姚市| 临高县|