JavaScript 中的類型轉換機制(詳細講解)

文章目錄

    • 一、概述
    • 二、顯示轉換
      • Number()
      • parseInt()
      • String()
      • Boolean()
    • 三、隱式轉換
      • 自動轉換為布爾值
      • 自動轉換成字符串
      • 自動轉換成數值

一、概述

前面我們講到,JS中有六種簡單數據類型:undefinednullbooleanstringnumbersymbol,以及引用類型:object

但是我們在聲明的時候只有一種數據類型,只有到運行期間才會確定當前類型

上面代碼中,x的值在編譯階段是無法獲取的,只有等到程序運行時才能知道

雖然變量的數據類型是不確定的,但是各種運算符對數據類型是有要求的,如果運算子的類型與預期不符合,就會觸發類型轉換機制

常見的類型轉換有:

  • 強制轉換(顯示轉換)
  • 自動轉換(隱式轉換)

二、顯示轉換

顯示轉換,即我們很清楚可以看到這里發生了類型的轉變,常見的方法有:

  • Number()
  • parseInt()
  • String()
  • Boolean()

Number()

將任意類型的值轉化為數值

先給出類型轉換規則:

實踐一下:

Number(324) // 324// 字符串:如果可以被解析為數值,則轉換為相應的數值
Number('324') // 324// 字符串:如果不可以被解析為數值,返回 NaN
Number('324abc') // NaN// 空字符串轉為0
Number('') // 0// 布爾值:true 轉成 1,false 轉成 0
Number(true) // 1
Number(false) // 0// undefined:轉成 NaN
Number(undefined) // NaN// null:轉成0
Number(null) // 0// 對象:通常轉換成NaN(除了只包含單個數值的數組)
Number({a: 1}) // NaN
Number([1, 2, 3]) // NaN
Number([5]) // 5

從上面可以看到,Number轉換的時候是很嚴格的,只要有一個字符無法轉成數值,整個字符串就會被轉為NaN

parseInt()

parseInt相比Number,就沒那么嚴格了,parseInt函數逐個解析字符,遇到不能轉換的字符就停下來

String()

可以將任意類型的值轉化成字符串

給出轉換規則圖:

實踐一下:

// 數值:轉為相應的字符串
String(1) // "1"//字符串:轉換后還是原來的值
String("a") // "a"//布爾值:true轉為字符串"true",false轉為字符串"false"
String(true) // "true"//undefined:轉為字符串"undefined"
String(undefined) // "undefined"//null:轉為字符串"null"
String(null) // "null"//對象
String({a: 1}) // "[object Object]"
String([1, 2, 3]) // "1,2,3"

Boolean()

可以將任意類型的值轉為布爾值,轉換規則如下:

實踐一下:

Boolean(undefined) // false
Boolean(null) // false
Boolean(0) // false
Boolean(NaN) // false
Boolean('') // false
Boolean({}) // true
Boolean([]) // true
Boolean(new Boolean(false)) // true

三、隱式轉換

在隱式轉換中,我們可能最大的疑惑是 :何時發生隱式轉換?

我們這里可以歸納為兩種情況發生隱式轉換的場景:

  • 比較運算(==!=><)、ifwhile需要布爾值地方
  • 算術運算(+-*/%

除了上面的場景,還要求運算符兩邊的操作數不是同一類型

自動轉換為布爾值

在需要布爾值的地方,就會將非布爾值的參數自動轉為布爾值,系統內部會調用Boolean函數

可以得出個小結:

  • undefined
  • null
  • false
  • +0
  • -0
  • NaN
  • “”

除了上面幾種會被轉化成false,其他都換被轉化成true

自動轉換成字符串

遇到預期為字符串的地方,就會將非字符串的值自動轉為字符串

具體規則是:先將復合類型的值轉為原始類型的值,再將原始類型的值轉為字符串

常發生在+運算中,一旦存在字符串,則會進行字符串拼接操作

'5' + 1 // '51'
'5' + true // "5true"
'5' + false // "5false"
'5' + {} // "5[object Object]"
'5' + [] // "5"
'5' + function (){} // "5function (){}"
'5' + undefined // "5undefined"
'5' + null // "5null"

自動轉換成數值

除了+有可能把運算子轉為字符串,其他運算符都會把運算子自動轉成數值

'5' - '2' // 3
'5' * '2' // 10
true - 1  // 0
false - 1 // -1
'1' - 1   // 0
'5' * []    // 0
false / '5' // 0
'abc' - 1   // NaN
null + 1 // 1
undefined + 1 // NaN

null轉為數值時,值為0undefined轉為數值時,值為NaN

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/719041.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/719041.shtml
英文地址,請注明出處:http://en.pswp.cn/news/719041.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(sub)三次握手四次揮手

TCP的三次握手與四次揮手理解及面試題 序列號seq&#xff1a;占4個字節&#xff0c;用來標記數據段的順序&#xff0c;TCP把連接中發送的所有數據字節都編上一個序號&#xff0c;第一個字節的編號由本地隨機產生&#xff1b;給字節編上序號后&#xff0c;就給每一個報文段指派一…

(學習日記)2024.03.03:UCOSIII第五節:常用匯編指令+OS初始化+啟動任務+任務切換

寫在前面&#xff1a; 由于時間的不足與學習的碎片化&#xff0c;寫博客變得有些奢侈。 但是對于記錄學習&#xff08;忘了以后能快速復習&#xff09;的渴望一天天變得強烈。 既然如此 不如以天為單位&#xff0c;以時間為順序&#xff0c;僅僅將博客當做一個知識學習的目錄&a…

雙重檢驗鎖

雙重檢驗鎖&#xff1a;設計模式中的單例模式&#xff0c;細分為單例模式中的懶加載模式。 單例模式 單例模式&#xff1a;指的是一個類只有一個對象。最簡單的實現方式是設一個枚舉類&#xff0c;只有一個對象。缺點是當對象還沒有被使用時&#xff0c;對象就已經創建存在了…

Backend - 日志記錄

目錄 1. settings.py 文件設定 2. book_log.py 文件設定 3. view 視圖文件調用 1. settings.py 文件設定 文件位置&#xff1a;BookProject 目錄下 LOG_PATH os.path.join(os.getcwd(), logs) # 設定日志文件位置&#xff1a;項目名下的logs文件夾中 2. book_log.py 文…

C++ 創建并初始化對象

創建并初始化C對象 當我們創建一個C對象時&#xff0c;它需要占用一些內存&#xff0c;即使我們寫一個完全為空的類&#xff0c;類中沒有成員&#xff0c;什么也沒有&#xff0c;它至少也要占用一個字節的內存。但是我們類中有很多成員&#xff0c;它們需要存儲在某地方&#…

【擴散模型】生成模型中的Residual Self-Attention UNet 以及 DDPM的pytorch代碼

參考&#xff1a; [1] https://github.com/xiaohu2015/nngen/blob/main/models/diffusion_models/ddpm_cifar10.ipynb [2] https://www.bilibili.com/video/BV1we4y1H7gG/?spm_id_from333.337.search-card.all.click&vd_source9e9b4b6471a6e98c3e756ce7f41eb134 TOC 1 UNe…

視黃酸誘導基因-1敲除誘導樹突狀細胞的不成熟特性并延長異體移植小鼠的存活時間研究【AbMole】

器官移植是一種用于替換因疾病、損傷或其他原因受損的人體器官的醫療程序。盡管器官移植可以挽救生命并顯著提高生活質量&#xff0c;但存在供體器官短缺、排斥反應、器官功能障礙、感染和藥物副作用等問題。為了提高移植成功率和受體健康&#xff0c;需要有效的免疫策略。樹突…

如何使用支付寶沙箱環境本地配置模擬支付并實現公網遠程訪問【內網穿透】

文章目錄 前言1. 下載當面付demo2. 修改配置文件3. 打包成web服務4. 局域網測試5. 內網穿透6. 測試公網訪問7. 配置二級子域名8. 測試使用固定二級子域名訪問 前言 在沙箱環境調試支付SDK的時候&#xff0c;往往沙箱環境部署在本地&#xff0c;局限性大&#xff0c;在沙箱環境…

原理篇-- 定時任務xxl-job-服務端(admin)項目啟動過程--JobFailMonitorHelper初始化 (5)

文章目錄 前言一、JobFailMonitorHelper作用&#xff1a;二、JobFailMonitorHelper源碼內容&#xff1a;2.1 start() 初始化2.1.1 任務失敗重試:2.1.2 任務失敗告警信息發送:2.1.2.1 JobAlarmer 告警類&#xff1a;2.1.2.2 alarm 告警信息發送&#xff1a; 2.2 toStop() 終止線…

數據可視化原理-騰訊-3D網格熱力圖

在做數據分析類的產品功能設計時&#xff0c;經常用到可視化方式&#xff0c;挖掘數據價值&#xff0c;表達數據的內在規律與特征展示給客戶。 可是作為一個產品經理&#xff0c;&#xff08;1&#xff09;如果不能夠掌握各類可視化圖形的含義&#xff0c;就不知道哪類數據該用…

壁爐火焰溫和而寧靜,警惕火焰兇猛的潛在危害

在寒冷的冬夜&#xff0c;壁爐散發的溫暖和閃爍的火焰成為家庭的心靈港灣。然而&#xff0c;我們在享受壁爐帶來的溫馨時&#xff0c;有時候也要關注火焰的兇猛度&#xff0c;因為它可能引發一系列潛在危害。 首先&#xff0c;壁爐的火焰過于兇猛可能導致空氣質量下降。當火焰過…

從零開始手寫RPC框架(4)

這一節主要講述網絡傳輸模塊的代碼&#xff0c;并且幾乎每一行代碼都加上了我個人理解的注釋&#xff0c;同時也講述了其中一些以前沒見過的函數&#xff0c;和大致的底層運行邏輯。 目錄 網絡傳輸實體類網絡傳輸實現基于Socket實現網絡傳輸基于Netty實現網絡傳輸客戶端服務端 …

【JavaEE進階】 Linux常用命令

文章目錄 &#x1f343;前言&#x1f334;ls 與 pwd&#x1f6a9;ls&#x1f6a9;pwd &#x1f38d;cd&#x1f6a9;認識Linux目錄結構 &#x1f340;touch與cat&#x1f6a9;touch&#x1f6a9;cat &#x1f332;mkdir與rm&#x1f6a9;mkdir&#x1f6a9;rm &#x1f384;cp與…

GD庫沒有安裝FreeType 支持Call to undefined function App\Services\imagettfbbox()

GD庫是一個功能強大的圖像處理庫&#xff0c;廣泛用于生成和處理圖像。然而&#xff0c;默認情況下&#xff0c;GD庫不包含FreeType擴展&#xff0c;該擴展用于處理字體和文本。如果您需要在GD庫中使用更多的字體和文本效果&#xff0c;您可以按照以下步驟安裝和啟用FreeType擴…

十五、單詞造句

描述 GG Bond在和妹妹做一個游戲&#xff0c;GG Bond給定了妹妹一些單詞字符串&#xff0c;他想讓妹妹把這些單詞拼接成以空格間隔開的句子&#xff0c;很可惜妹妹Python沒有學好&#xff0c;你能使用join函數幫幫她嗎&#xff1f; 輸入描述&#xff1a; 多行輸入多個字符串…

Java基礎 - 7 - 常用API(二)

API&#xff08;全稱 Application Programming Interface&#xff1a;應用程序編程接口&#xff09; API就是Java幫我們已經寫好的一些程序&#xff0c;如類、方法等&#xff0c;可以直接拿過來用 JDK8 API文檔&#xff1a;Java Platform SE 8 一. Object Object類的作用 Ob…

mybatis多數據源切換

1.前提 項目中有可能需要去其他的數據庫取其他的表的信息 2.思路 2.1 直接使用原生jdbc&#xff08;不推薦&#xff09; 2.2 不使用我們全局配置的mybatis&#xff0c;對指定文件夾下使用我們指定的Session 3.解決辦法 指定該配置的范圍 package com.maycur.openapi.dao.my…

『Linux從入門到精通』第 ? 期 - 管道

文章目錄 &#x1f490;專欄導讀&#x1f490;文章導讀&#x1f427;進程間通信的目的&#x1f427;如何進行進程間通信&#x1f427;進程間通信的分類&#x1f427;管道&#x1f426;什么是管道&#x1f426;管道原理 &#x1f427;實例代碼&#x1f427;管道的特點&#x1f4…

Protobuf學習筆記以及序列化的一些概念要點(暫放C++筆記專欄)

Protobuf學習筆記以及序列化的一些概念要點 —— 杭州 2024-03-03 文章目錄 Protobuf學習筆記以及序列化的一些概念要點1.Protobuf概念2.實際測試2.1.準備一個test.proto2.2.使用 protoc 命令行工具來編譯一個 Protocol Buffers 文件 test.proto3.3.創建一個main.cpp寫C++代碼…

mysql 事務的隔離級別

一、事務的隔離級別要解決的問題&#xff1a; 1&#xff09;臟讀&#xff1a;讀到了其它事務未提交的數據即臟讀&#xff0c;未提交意味著數據有可能會被回滾&#xff0c;也就是最終有可能不會存儲到數據庫中&#xff0c;即讀到了最終不一定存在存在的數據&#xff0c;即為臟讀…