酒業(yè)網(wǎng)站建設(shè)優(yōu)化大師免費(fèi)版下載
JS對(duì)象到原始值轉(zhuǎn)換的復(fù)雜性 主要由于某些對(duì)象類(lèi)型存在不止一種原始值的表示
對(duì)象到原始值轉(zhuǎn)換的三種基本算法
在解釋三種算法前需要了解
toString
valueOf
這兩個(gè)方法
toString
- 返回對(duì)象的字符串表示
Array
類(lèi)的toString
方法會(huì)將每個(gè)元素轉(zhuǎn)換為字符串,再使用逗號(hào)作為分隔符拼接起來(lái)Function
類(lèi)的toString
方法將定義的函數(shù)轉(zhuǎn)換為JS源代碼的字符串Date
類(lèi)型的toString
方法返回一個(gè)人類(lèi)友好(且JS可解析)的日期和時(shí)間字符串RegExp
類(lèi)定義的toString
方法將RegExp對(duì)象
轉(zhuǎn)換為一個(gè)看起來(lái)像RegExp字面量的字符串
valueOf
- 把對(duì)象轉(zhuǎn)換為代表對(duì)象原始值(如果存在這樣一個(gè)原始值)
- 對(duì)象是復(fù)合值,且多數(shù)對(duì)象不能真正通過(guò)一個(gè)原始值標(biāo)識(shí),
valueOf
方法默認(rèn)情況只返回對(duì)象本身 String
Number
Boolean
包裝類(lèi)定義的valueOf
返回被包裝的原始值Array
Function
RegExp
繼承默認(rèn)方法,返回對(duì)象本身Date
對(duì)象返回日期的內(nèi)部表示形式:自1970年1月1日至今的毫秒數(shù)
偏字符串
(該算法返回原始值,只要可能就返回字符串)
- 首先嘗試
toString
方法 - 方法有定義且返回原始值,則使用該原始值(即使這個(gè)值不是字符串)
- 不存在或者存在但返回對(duì)象,則嘗試使用
valueOf
方法 - 方法存在且返回原始值,則使用該值。
- 否則,轉(zhuǎn)換失敗
TypeError
偏數(shù)值
(該算法返回原始值,只要可能就返回?cái)?shù)值)
- 與
偏字符串算法
類(lèi)似,先嘗試valueOf
再?lài)L試toString
無(wú)偏好
(該算法不傾向于任何原始值類(lèi)型,而是由類(lèi)定義自己的轉(zhuǎn)換規(guī)則)
- 取決于被轉(zhuǎn)換對(duì)象的類(lèi)
- 如果是
Date
對(duì)象,則使用偏字符串算法
- 其他類(lèi)型使用
偏數(shù)值算法
JS內(nèi)置類(lèi)型除了Date類(lèi)都實(shí)現(xiàn)了偏數(shù)值算法;Date類(lèi)實(shí)現(xiàn)了偏字符串算法
對(duì)象轉(zhuǎn)換為布爾值
- 所有對(duì)象都轉(zhuǎn)換為
true
- 不需要使用前面的轉(zhuǎn)換算法
- 包括空數(shù)組、
new Boolean(false)
包裝對(duì)象
Boolean({}) // true
Boolean([]) // true
Boolean(new Boolean(false)) /// true
對(duì)象轉(zhuǎn)換為字符串
- 使用
偏字符串
算法轉(zhuǎn)換為一個(gè)原始值 - 再將原始值轉(zhuǎn)換為字符串
String({}) // '[object Object]'
String([]) // ''
String(new Date(2023)) // 'Sun Jan 01 2023 08:00:00 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)'
String(new RegExp(/[a-z]/i)) // '/[a-z]/i'
對(duì)象轉(zhuǎn)換為數(shù)值
- 使用
偏數(shù)值
算法轉(zhuǎn)換為一個(gè)原始值 - 將原始值轉(zhuǎn)換為數(shù)值
Number({}) // NaN
Number([]) // 0
Number([6]) // 6
Number(new Date(2023)) // 1672531200000
Number(new RegExp(/[a-z]i/)) // NaN
操作符轉(zhuǎn)換特例
+
操作符
- 執(zhí)行數(shù)值加法和字符串拼接
- 如果一個(gè)操作數(shù)是對(duì)象,則使用
無(wú)偏好算法
將對(duì)象轉(zhuǎn)換為原始值 - 如果兩個(gè)操作數(shù)都是原始值,則檢查類(lèi)型
- 有一個(gè)是字符串,則將另一個(gè)轉(zhuǎn)換為字符串進(jìn)行拼接
- 否則轉(zhuǎn)換為數(shù)值進(jìn)行相加
==
!=
操作符
- 允許類(lèi)型轉(zhuǎn)換的寬松方式執(zhí)行相等和不相等測(cè)試
- 如果一個(gè)操作數(shù)是對(duì)象 另一個(gè)是原始值,則使用
無(wú)偏好算法
轉(zhuǎn)換為原始值 再比較
< <= > >=
關(guān)系操作符
- 既可比較數(shù)值也可比較字符串
- 如果有一個(gè)操作數(shù)是對(duì)象 則使用
偏數(shù)值算法
將對(duì)象轉(zhuǎn)換為原始值 - 與對(duì)象到數(shù)值轉(zhuǎn)換不同 這個(gè)
偏數(shù)值算法
返回的原始值不會(huì)再被轉(zhuǎn)換為數(shù)值