最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析JavaScript對象轉換成原始值

 更新時間:2022年07月25日 11:11:22   作者:? 款冬_?  
這篇文章主要介紹了淺析JavaScript對象轉換成原始值,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下,需要的朋友可以參考一下

前言

首先拋出幾個問題:

console.log(Boolean({}));
console.log(Number([]));
console.log(Number([6]));
console.log(([] + []).length);
console.log(({} + {}).length);

打印結果都是啥?不知道各位能答對幾題。文章末尾,我們會揭曉答案。這篇文章建議大家耐心閱讀,相對來說比較繞而且乏味 - -。

三種算法

JavaScript 將對象轉換為原始值時遵循的算法規(guī)則比較復雜,這些規(guī)則冗長、晦澀,我們先簡單了解一下,具體實現(xiàn)后面再詳細展開。

對象轉換成原始值有三種基本算法:

  • 偏字符串算法。該算法返回原始值,而且只要可能就返回字符串。
  • 偏數值算法。該算法返回原始值,而且只要可能就返回數值。
  • 無偏好算法。該算法不傾向于任何原始值類型,而是由類定義自己的轉換規(guī)則。JavaScript 內置類除了 Date 類,其他都實現(xiàn)了偏數值算法。Date 類實現(xiàn)了偏字符串算法。

對象轉換成布爾值

對象到布爾值的轉換最簡單:所有對象都轉換為true。這個轉換不需要使用前面介紹的轉換算法,直接適用于所有對象,包括空數組、包裝對象:

console.log(Boolean([])); // => true

const wrapperObject = new Boolean(false); // 這是一個對象,而不是原始值
console.log(Boolean(wrapperObject)); // => true

對象轉換成字符串

在將對象轉換成字符串時,首先使用偏字符串算法將它轉換為一個原始值,然后將得到的原始值再轉換為字符串。

這種轉換會發(fā)生在把對象傳給一個接收字符串參數的內置函數時,比如將String()作為轉換函數,或者將對象插入模板字面量中時就會發(fā)生這種轉換:

console.log(String({})); // => '[object Object]'
console.log(String([])); // => ''
console.log(String(function () {})); // => 'function () {}'

對象轉換成數值

當需要把對象轉換為數值時,首先使用偏數值算法將它轉換為一個原始值,然后將得到的原始值再轉換為數值。

接收數值參數的內置函數和方法都以這種方式將對象轉換為數值,除數值操作符之外的多數操作符也按照這種方式把對象轉換為數值:

console.log(Number([])); // => 0
console.log(Number({})); // => NaN
console.log(+[]); // => 0

上面的栗子了解一下即可,具體的轉換算法后面會詳細解釋。

轉換時使用的方法

toString()、valueOf(),所有對象都會繼承這兩個在對象到原始值轉換時使用的方法,在接下來解釋偏字符串、偏數值、無偏好轉換算法之前,我們必須先了解這兩個方法。

toString()

toString()的任務是返回對象的字符串表示。

默認情況下,toString()方法會返回特殊值:

const obj = {
    x: 1,
    y: 2,
}
obj.toString(); // => '[object Object]'

但是很多類都定義了自己特有的toString()版本。

比如,Array類的toString()方法會將數組的每個元素轉換為字符串,然后再使用逗號作為分隔符將它們拼接起來:

const array = [1, 2, 3];
array.toString(); // => '1', '2', '3'

Function類的toString()方法會將用戶定義的函數轉換為 JavaScript 源代碼的字符串:

const f = function () {};
f.toString() // => 'function () {}'

Date類定義的toString()方法返回一個對人類友好的日期和時間字符串。

RegExp類定義的toString()方法會將RegExp對象轉換為一個看起來像RegExp字面量的字符串。

valueOf()

valueOf()方法的設計意圖是返回對象的原始值表示。

然而大多數對象都沒有缺省的原始值表示,為此valueOf()的默認實現(xiàn)是返回對象本身,內置的函數、數組等類型都是如此:

const obj = {x: 666};
const arr = [1, 2, 3];
const fn = function () {};

obj.valueOf(); // => {x: 666}
arr.valueOf(); // => [1, 2, 3]
fn.valueOf(); // => ? () {}

極少數對象才具有有意義的原始值表示,比如String、NumberBoolean這樣的包裝類定義的valueOf()方法會簡單地返回被包裝的原始值:

const wrapperObj1 = new String(666);
const wrapperObj2 = new Number(888);
const wrapperObj3 = new Boolean(false);

wrapperObj1.toString(); // => '666'
wrapperObj2.toString(); // => '888'
wrapperObj3.toString(); // => 'false'

還有Date對象定義的valueOf()方法返回時間戳:

const d = new Date(2022, 6, 24);
d.valueOf(); // => 1658592000000

了解完toString()valueOf()方法后,接下來我們看看轉換算法是如何實現(xiàn)的。

轉換算法

偏字符串算法

偏字符串算法首先嘗試toString()方法。如果這個方法有定義且返回原始值,則使用這個原始值,即使這個值不是字符串。如果toString()方法不存在,或者存在但返回對象,則嘗試valueOf()方法。如果valueOf()方法存在且返回原始值,就使用該值。否則,轉換失敗,報 TypeError。

偏數值算法

偏數值算法與偏字符串算法類似,只不過是先嘗試valueOf()方法,再嘗試toString()方法。

無偏好算法

無偏好算法取決于被轉換的對象。如果是一個Date對象,則使用偏字符串算法。如果是其他類型的對象,就使用偏數值算法。

以上規(guī)則適用于所有的內置 JavaScript 類型。

練習題

文章開頭列舉的五個問題,下面我們逐一揭曉答案。

console.log(Boolean({})):對象轉換成布爾值時,所有對象都轉換為true,所以打印true

console.log(Number([])):對象轉換成數值,首先使用偏數值算法把對象轉換為一個原始值,然后再把得到的原始值轉換為數值。偏數值算法會先嘗試valueOf(),將toString()作為備用。Array類繼承了默認的valueOf()方法,所以不會返回原始值,因此最終會調用toString()方法??諗到M會被轉換成空字符串,而空字符串轉換成數值為 0,所以打印 0。

console.log(Number([6])):同樣,使用偏數值算法,最終會調用toString()方法。因為數組中只包含一個數值,所以該數值首先會被轉換成字符串 '6',再轉換回數值 6,打印結果為 6。

console.log(([] + []).length):兩個數組相加,首先會將數組轉換為字符串,使用偏字符串算法,空數組會轉換為空字符串,空字符串相加還是空字符串,長度為 0,打印結果為 0。

console.log(({} + {}).length):兩個對象相加,首先會將對象轉換成字符串,使用偏字符串算法,對象轉換成字符串后是'[object Object]',兩個'[object Object]'拼接后的長度是 30,打印結果為 30。

到此這篇關于淺析JavaScript對象轉換成原始值的文章就介紹到這了,更多相關JS對象轉換內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JS常用函數和常用技巧小結

    JS常用函數和常用技巧小結

    這篇文章主要介紹了JS常用函數和常用技巧小結的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-10-10
  • JavaScript內置對象math,global功能與用法實例分析

    JavaScript內置對象math,global功能與用法實例分析

    這篇文章主要介紹了JavaScript內置對象math,global功能與用法,結合實例形式分析了javascript中內置對象math與global的基本概念、功能及使用方法,需要的朋友可以參考下
    2019-06-06
  • JS實現(xiàn)的仿淘寶交易倒計時效果

    JS實現(xiàn)的仿淘寶交易倒計時效果

    這篇文章主要介紹了JS實現(xiàn)的仿淘寶交易倒計時效果,涉及JavaScript針對時間與日期的動態(tài)操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • 維護loading加載狀態(tài)的幾個方法小結

    維護loading加載狀態(tài)的幾個方法小結

    在項目開發(fā)中,當頁面請求接口時,組件局部或者頁面全局顯示loading加載遮罩可謂是司空見慣了,下面來討論一下如何優(yōu)雅的使用loading狀態(tài),文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2024-09-09
  • 一文帶你了解promise并解決回調地獄

    一文帶你了解promise并解決回調地獄

    這篇文章主要介紹了Promise解決回調地獄問題,文中有詳細的代碼示例,具有一定的參考價值,需要的朋友可以閱讀參考
    2023-04-04
  • javascript貪吃蛇完整版(源碼)

    javascript貪吃蛇完整版(源碼)

    這篇文章主要是對javascript貪吃蛇完整版(源碼)進行了詳細的分析介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • js變形金剛文字特效代碼分享

    js變形金剛文字特效代碼分享

    這篇文章主要介紹了js變形金剛文字特效,實現(xiàn)效果超酷,很立體,感興趣的小伙伴們可以參考一下
    2015-08-08
  • JS打印組合功能

    JS打印組合功能

    這篇文章主要介紹了JS打印組合功能,包括JS實現(xiàn)簡單的頁面局部打印,感興趣的小伙伴們可以參考一下
    2016-08-08
  • js放大鏡放大購物圖片效果

    js放大鏡放大購物圖片效果

    這篇文章主要為大家詳細介紹了基于JavaScript實現(xiàn)放大鏡放大購物圖片效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • 通過JAVAScript實現(xiàn)頁面自適應

    通過JAVAScript實現(xiàn)頁面自適應

    通過JAVAScript實現(xiàn)頁面自適應...
    2007-01-01

最新評論

建平县| 利辛县| 南陵县| 双辽市| 和平区| 武汉市| 久治县| 枣庄市| 汉阴县| 阿城市| 泸定县| 庄浪县| 渑池县| 玉田县| 辉县市| 白银市| 罗源县| 郁南县| 郴州市| 永顺县| 武邑县| 特克斯县| 安康市| 阿勒泰市| 赣榆县| 光泽县| 乐至县| 邮箱| 巴林左旗| 临武县| 久治县| 大兴区| 阿尔山市| 洪雅县| 清原| 射洪县| 应用必备| 日土县| 卢龙县| 观塘区| 六安市|