JavaScript如何實現類型判斷?

判斷一個數據的類型,常用的方法有以下幾種:

  • typeof
  • instanceof
  • Object.prototype.toString.call(xxx)

下面來分別分析一下這三種方法各自的優缺點

typeof

typeof的本意是用來判斷一個數據的數據類型,所以返回的也是一個數據類型。但是會遇到下面這些問題:

  • 無法判斷 null
  • 無法判斷除了 function 之外的引用類型。
// 無法判斷 null。
console.log(typeof null); // 輸出 'object',原因在文章末尾解釋。// 無法判斷除了 function 之外的引用類型。
console.log(typeof []); // 'object'
console.log(typeof {}); // 'object'

incetance of

可以看到,type of無法精確判斷對象的引用類型。所以在判斷一個對象的引用類型時一般使用incetance of關鍵字。

console.log([] instanceof Array); // true
console.log(str1 instanceof String); // false,無法判斷原始類型。

但是incetance of無法準確判斷原始數據類型,只能用來判斷數據是否是某個類的引用。到這里就能發現,如果把incetance oftype of結合起來基本就能判斷所有的數據類型了。

但是,別忘記還有一個null,對于null還需要進行特殊的處理。

typeof null;	// objectif (target === null) {return "null";
}

結合這兩種方法基本已經掌握了判斷數據類型的手段了,但是如果去寫一下你還是會發現很麻煩,你必須枚舉每一種類型利用trueorfalse判斷數據類型。

這里的null必須單獨判斷,因為這是第一版JavaScript留下來的一個bug。

JavaScript 中不同對象在底層都表示為二進制,而 JavaScript 中會把二進制前三位都為 0 的判斷為 object 類型,而 null 的二進制表示全都是 0,自然前三位也是 0,所以執行 typeof 時會返回 'object'

這個 bug 牽扯了太多的 Web 系統,一旦改了,會產生更多的 bug,令很多系統無法工作,也許這個 bug 永遠都不會修復了。

Object.prototype.toString.call(xxx)

這個時候就不得不提到下面這種方法了:

Object.prototype.toString.call([])	// [object Array]

這個方法會返回統一格式的字符串:[object Xxx]。然后再取出后面的xxx即可得到準確的數據類型。對于取出后面的xxx可以使用多種方法,包括但不限于字符切片、正則表達式。

這里調用call()方法是為了讓this指向數組對象自身。

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

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

相關文章

哈希表筆記(四)Redis對比Java總結

文章目錄 一、基礎結構對比數據結構定義Java HashMapRedis字典 主要區別與設計思路 二、關鍵操作API對比初始化Java HashMapRedis字典 添加元素Java HashMapRedis字典 查找元素Java HashMapRedis字典 刪除元素Java HashMapRedis字典 擴容/重哈希操作Java HashMapRedis字典 三、…

docker拉取國內鏡像

1. 場景 最近整了一個tencent云服務器,想要玩一下docker,結果發現拉不下來,鏡像根本拉不下來。 2. 原因 1.云服務器無法訪問外網; 2. 國內的很多公有鏡像倉庫都被封了; 3. 推薦 https://zhuanlan.zhihu.com/p/713…

Codeforces Round 1008 (Div. 2) C

C 構造 題意:a的數據范圍大,b的數據范圍小,要求所有的a不同,考慮讓丟失的那個a最大即可。問題變成:構造一個最大的a[i] 思路:令a2是最大的,將a1,a3,a5....a2*n1,置為最大的b,將a4,a…

STM32 HAL庫實現USB虛擬串口

1. 引言 在嵌入式系統開發中,USB 虛擬串口是一種非常實用的功能。它允許 STM32 微控制器通過 USB 接口與計算機進行通信,就像使用傳統的串口一樣。這種方式不僅簡化了硬件設計,還提高了通信的靈活性和穩定性。STM32F407 系列微控制器具有強大…

JAVA EE_網絡原理_UDP與TCP

人海中未遇見時,我將獨自前行... ----------陳長生. 1.UDP協議 1.1.UDP協議端格式 UDP(用戶數據報協議)是由 源端口,目標端口,長度,校驗和,數據 5種結構組成。16位是UDP報文中字段的長度&#…

【免費】1992-2021年各省GDP數據/各省地區生產總值數據

1992-2021年各省GDP數據/各省地區生產總值數據 1、時間:1992-2021年 2、來源:國家統計局、統計年鑒 3、指標:GDP/地區生產總值 4、范圍:31省 5、指標說明:國內生產總值(GDP)是一個國家或地區在一定時期…

C++11新特性_范圍-based for 循環

based for 循環介紹 范圍 - based for 循環(Range-based for loop)是 C11 引入的一種新的 for 循環語法,它可以更簡潔地遍歷容器和數組。 遍歷數組:定義了一個整數數組 arr,使用范圍 - based for 循環 for (int num :…

【Bootstrap V4系列】學習入門教程之 頁面內容排版

Bootstrap V4 學習入門教程之 頁面內容排版 按鈕上的指針排版一、Global settings 全局設置二、Headings 標題2.1 Customizing headings 自定義標題2.2 Display headings 顯示標題2.3 Lead 引導 三、Blockquotes 塊引用3.1 Naming a source 命名源3.2 Alignment 對齊 四、Lists…

Flowable7.x學習筆記(十六)分頁查詢我的待辦

前言 我的待辦具體區分為3種情況,第一個就是辦理人指定就是我,我可以直接審批;第二種就是我是候選人,我需要先拾取任務然后再辦理;第三種是我是候選組,我需要切換到指定的角色去拾取任務再辦理。如果任務已…

EBO的使用

EBO 其實就是個索引,綁定在相應的VAO中,用來描述繪制順序。比如在OpenGL繪制三角形的時候,假設有四個頂點,我稱他們分別為1,2,3,4號頂點,常規繪制三角形函數是按三個點為一組&#x…

界面控件DevExpress WPF v25.1預覽 - AI功能增強(語義搜索)

DevExpress WPF擁有120個控件和庫,將幫助您交付滿足甚至超出企業需求的高性能業務應用程序。通過DevExpress WPF能創建有著強大互動功能的XAML基礎應用程序,這些應用程序專注于當代客戶的需求和構建未來新一代支持觸摸的解決方案。 無論是Office辦公軟件…

零基礎做自動駕駛集成測試(仿真)

圖 1:使用 GPUDrive 進行極快的多代理模擬。上圖:GPUDrive 中 Waymo Open Motion Dataset 場景的鳥瞰圖,方框表示受控智能體,圓圈表示其目標。底部:相應的代理視圖,以一個代理為中心。可以根據用戶的目標輕…

EasyRTC嵌入式音視頻實時通話SDK技術,打造低延遲、高安全的遠程技術支持

一、背景 在當今數字化時代,遠程技術支持已成為解決各類技術問題的關鍵手段。隨著企業業務的拓展和技術的日益復雜,快速、高效地解決遠程設備與系統的技術難題變得至關重要。EasyRTC作為一款高性能的實時通信解決方案,為遠程技術支持提供了創…

【C語言常用字符串解析】

總結一下在 C 語言中用于字符串解析(特別是從文件中讀取行并提取數據)的常用函數、 核心任務: 通常是從文件中讀取一行文本(一個字符串),然后從這個字符串中提取出需要的數據(比如數字、單詞等…

SpringTas定時任務使用詳解

文章目錄 Spring Task概述1、環境配置2.注解實現定時任務2.注解實現定時任務4. cron表達式詳解: Spring Task概述 在開發中,我們經常會用到定時任務,而Spring Task 則是Spring提供的定時任務框架。 其它定時任務實現框架又jdk自帶Timer和Qua…

數字智慧方案6172丨智慧醫院擴建信息化整體規劃方案(60頁PPT)(文末有下載方式)

資料解讀:智慧醫院擴建信息化整體規劃方案 詳細資料請看本解讀文章的最后內容。 在信息技術飛速發展的當下,醫療行業的信息化建設成為提升醫療服務水平、優化醫院管理的關鍵路徑。這份智慧醫院擴建信息化整體規劃方案,針對醫院擴建過程中的信…

ts全局導入接口

為了在項目中全局導入 ITableColumn 接口,避免每次使用時手動導入,可以通過以下步驟實現: 1. 全局導入的實現方式 在 Vue 項目中,可以通過在 src 目錄下創建一個 global.d.ts 文件,將 ITableColumn 接口聲明為全局類型…

汽車啟動原理是什么?

好的!同學們,今天我們來討論汽車的啟動原理,重點分析其中的動力來源和摩擦力作用。我會結合物理概念,用盡量直觀的方式講解。 1. 汽車為什么會動?——動力的來源 汽車發動機(內燃機或電動機)工…

【音頻】Qt6實現MP3播放器

1、簡介 解碼MP3有很多種方法,比如:FFmpeg、GStreamer、Qt、libmpg123 庫等,下面介紹使用,只使用Qt的接口方法解碼、播放MP3。 開發配置: 1)操作系統:Windows11 2)Qt版本:Qt6.5.1 3)編譯器:MinGW_64 2、獲取音頻輸出設備 QMediaDevices 用于獲取媒體設備,包括音…

【Linux】VSCode用法

描述 部分圖片和經驗來源于網絡,若有侵權麻煩聯系我刪除,主要是做筆記的時候忘記寫來源了,做完筆記很久才寫博客。 專欄目錄:記錄自己的嵌入式學習之路-CSDN博客 目錄 1 安裝環境及運行C/C 1.1 安裝及配置步驟 1.2 運…