首頁 web前端 前端問答 JavaScript型別轉換(詳解及實例)

JavaScript型別轉換(詳解及實例)

Jan 12, 2022 pm 06:05 PM
html javascript 前端

這篇文章為大家帶來了JavaScript中類型轉換的相關知識,將值轉換為原始值、轉換為數字和轉換為字串,這剛好對應了引擎內部的三種抽像操作:ToPrimitive() 、ToNumber()、ToString(),希望對大家有幫助。

JavaScript型別轉換(詳解及實例)

JavaScript 加法規則

#在JavaScript中,加法的規則其實很簡單,只有兩種情況:

  • 數字和數字相加

  • #字串和字串相加

所有其他類型的值都會自動轉換成這兩種類型的值

在JavaScript中,一共有兩種類型的值:

  • 原始值有: undefined、null、 布林值(boolean)、 數字(number)、字串(string)、symbol

  • 物件值:其他的所有值都是物件類型的值,包括陣列(arrays)和函數(functions)

型別轉換

加法運算子會觸發三種型別轉換:將值轉換為原始值、轉換為數字、轉換為字串,這剛好對應了JavaScript引擎內部的三個抽像操作:ToPrimitive()、ToNumber()、ToString()

透過ToPrimitive() 將值轉換為原始值

ToPrimitive(input, PreferredType?)
登入後複製

可選參數PreferredType可以是Number或String,它只代表了一個轉換的偏好,轉換結果不一定必須是這個參數所指的型別,但轉換結果一定是一個原始值.如果PreferredType被標誌為Number,則會進行下面的操作來轉換輸入的值(§9.1):

  • 如果輸入的值已經是個原始值,則直接回傳它.

  • 否則,如果輸入的值是一個物件.則呼叫該物件的valueOf()方法.如果valueOf( )方法的回傳值是一個原始值,則傳回這個原始值.

  • 否則,呼叫這個物件的toString()方法.如果toString()方法的回傳值是一個原始值,則回傳這個原始值.

  • 否則,拋出TypeError異常.

如果PreferredType被標誌為String,則轉換操作的第二步和第三步的順序會調換.如果沒有PreferredType這個參數,則PreferredType的值會按照這樣的規則來自動設定: Date類型的物件會被設定為String,其它類型的值會被設定為Number .

透過ToNumber()將值轉換為數字

JavaScript型別轉換(詳解及實例)

如果輸入的值是對象,則會先呼叫ToPrimitive(obj, Number)將該物件轉換為原始值,然後在呼叫ToNumber()將這個原始值轉換為數字.

透過ToString()將值轉換為字串

JavaScript型別轉換(詳解及實例)

如果輸入的值是物件,則會先呼叫ToPrimitive(obj, String)將該物件轉換為原始值,然後再呼叫ToString()將這個原始值轉換為字串.

#demo

var obj = {
    valueOf: function () {
        console.log("valueOf");
        return {}; // 没有返回原始值
    },
    toString: function () {
        console.log("toString");
        return {}; // 没有返回原始值
    }
}
登入後複製

Number作為一個函數被呼叫(而不是作為建構子呼叫)時,會在引擎內部呼叫ToNumber()操作:

Number(obj)
// output
valueOf
toString
Uncaught TypeError: Cannot convert object to primitive value
String(obj)
// output
toString
valueOf
Uncaught TypeError: Cannot convert object to primitive value
登入後複製

##加法

    value1 + value2
登入後複製

在計算這個表達式時,操作步驟是這樣的:

  • 將兩個運算元轉換為原始值(下面是數學表示法,不是JavaScript程式碼):

  • #
        prim1 := ToPrimitive(value1)
        prim2 := ToPrimitive(value2)
    登入後複製
PreferredType被省略,因此Date 類型的值採用String,其他類型的值採用Number.

  • 如果prim1 或prim2 中的任一個為字串,則將另外一個也轉換成字串,然後返回兩個字串連接操作後的結果;

  • #否則,將prim1 和prim2 都轉換為數字類型,返回他們的和。

[] []

# 輸出: ''

[]會轉換成一個原始值,先嘗試valueOf() 方法,傳回數組本身(this):

> var arr = [];
> arr.valueOf() === arr
true
登入後複製

這樣的結果不是原始值,所以再呼叫toString() 方法,傳回一個空字串(是一個原始值)。因此,[] [] 的結果其實是兩個空字串的連結.

> [] + {}
'[object Object]'
登入後複製

#{} {}

輸出: NaN

  • JavaScript引擎將第一個{}解釋成一個空的程式碼區塊並忽略了它

  • 這裡的加號並不是代表加法的二元運算符,而是一個一元運算符,作用是將它後面的運算元轉換成數字,和Number() 函數完全一樣。例如:

+{}
Number({})
Number({}.toString())  // 因为{}.valueOf()不是原始值
Number("[object Object]")
NaN
登入後複製
> {} + []
0
登入後複製
  • {} 忽略

  • +[] = Number([]) = Number([].toString()) = Number("") = 0

有趣的是,Node.js的REPL在解析类似的输入时,与Firefox和Chrome(和Node.js一样使用V8引擎)的解析结果不同.下面的输入会被解析成一个表达式,结果更符合我们的预料:

> {} + {}
'[object Object][object Object]'
> {} + []
'[object Object]'
登入後複製

总结

对象.valueOf() === 对象

数组对象.toString() === 数组对象.join()

对象.toString() === "[object Object]"

Javacript 中 + 号工作:

  • 数字 + 数字

  • 字符串 + 字符串

【相关推荐:javascript学习教程

以上是JavaScript型別轉換(詳解及實例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

HTML 中的表格邊框 HTML 中的表格邊框 Sep 04, 2024 pm 04:49 PM

HTML 表格邊框指南。在這裡,我們以 HTML 中的表格邊框為例,討論定義表格邊框的多種方法。

HTML 中的巢狀表 HTML 中的巢狀表 Sep 04, 2024 pm 04:49 PM

這是 HTML 中巢狀表的指南。這裡我們討論如何在表中建立表格以及對應的範例。

HTML 左邊距 HTML 左邊距 Sep 04, 2024 pm 04:48 PM

HTML 左邊距指南。在這裡,我們討論 HTML margin-left 的簡要概述及其範例及其程式碼實作。

HTML 表格佈局 HTML 表格佈局 Sep 04, 2024 pm 04:54 PM

HTML 表格佈局指南。在這裡,我們詳細討論 HTML 表格佈局的值以及範例和輸出。

HTML 輸入佔位符 HTML 輸入佔位符 Sep 04, 2024 pm 04:54 PM

HTML 輸入佔位符指南。在這裡,我們討論 HTML 輸入佔位符的範例以及程式碼和輸出。

HTML 有序列表 HTML 有序列表 Sep 04, 2024 pm 04:43 PM

HTML 有序列表指南。在這裡我們也分別討論了 HTML 有序列表和類型的介紹以及它們的範例

HTML onclick 按鈕 HTML onclick 按鈕 Sep 04, 2024 pm 04:49 PM

HTML onclick 按鈕指南。這裡我們分別討論它們的介紹、工作原理、範例以及各個事件中的onclick事件。

在 HTML 中移動文字 在 HTML 中移動文字 Sep 04, 2024 pm 04:45 PM

HTML 中的文字移動指南。在這裡我們討論一下marquee標籤如何使用語法和實作範例。

See all articles