JS數據類型檢測方法總結

在 JavaScript 中,數據類型檢測是開發中的常見需求。以下是主要檢測方法及其優缺點:

1. typeof 操作符

最基礎的檢測方式,返回類型字符串:

typeof 42;           // "number"
typeof "hello";      // "string"
typeof true;         // "boolean"
typeof undefined;    // "undefined"
typeof function() {}; // "function"
typeof Symbol();     // "symbol"
typeof {};           // "object"
typeof [];           // "object" (注意!)
typeof null;         // "object" (歷史遺留問題)

缺點:

  • 無法區分數組、對象、null(都返回 “object”)

2. instanceof 操作符

檢測對象是否屬于某個構造函數的實例:

[] instanceof Array;      // true
{} instanceof Object;     // true
new Date() instanceof Date; // truefunction Person() {}
const p = new Person();
p instanceof Person;      // true

缺點:

  • 不適用于原始值類型(數字、字符串等)
  • 多窗口/iframe 環境下失效(不同全局環境)

3. Object.prototype.toString.call()

最可靠的檢測方法,返回 [object Type] 格式:

Object.prototype.toString.call(42);        // "[object Number]"
Object.prototype.toString.call("hello");   // "[object String]"
Object.prototype.toString.call([]);        // "[object Array]"
Object.prototype.toString.call(null);      // "[object Null]"
Object.prototype.toString.call(undefined); // "[object Undefined]"
Object.prototype.toString.call(/regex/);   // "[object RegExp]"

封裝工具函數:

function getType(obj) {return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
}getType([]); // "array"
getType(null); // "null"

4. 特殊類型檢測

  • 數組檢測:
Array.isArray([]); // true (ES5+ 最佳方案)
// 舊瀏覽器兼容方案:
Object.prototype.toString.call([]) === "[object Array]";
  • NaN 檢測:
isNaN(NaN); // true (注意: isNaN("abc") 也返回 true)
Number.isNaN(NaN); // true (ES6 推薦,嚴格檢測)
  • null/undefined 檢測:
let foo = null;
foo === null; // true (精確檢測 null)
typeof bar === "undefined"; // 檢測未定義

終極解決方案

結合多種方式實現全類型檢測:

function detectType(value) {// 處理 null 和 undefinedif (value === null) return "null";if (value === undefined) return "undefined";// 處理其他類型const type = typeof value;if (type !== "object") return type; // 原始類型直接返回// 對象類型細化return Object.prototype.toString.call(value).slice(8, -1).toLowerCase();
}// 測試
detectType([]); // "array"
detectType(new Map()); // "map"
detectType(Symbol()); // "symbol"
detectType(42); // "number"

總結對比

方法優點缺點
typeof簡單快速,適合原始類型無法區分數組/對象/null
instanceof檢測自定義對象不適用原始類型,多窗口環境失效
Object.prototype.toString精準識別所有類型(推薦)語法稍復雜
Array.isArray()數組檢測最優解僅適用于數組

最佳實踐:

  • 基礎類型檢測 → typeof
  • 數組檢測 → Array.isArray()
  • 完整類型檢測 → Object.prototype.toString.call()
  • null 檢測 → value === null

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

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

相關文章

AEO:從搜索引擎到答案引擎,AI時代搜索優化的新戰場

在 ChatGPT、DeepSeek、Google SGE 等生成式AI崛起的時代,搜索正在經歷一場根本性變革: 過去:搜索引擎優化(SEO) 現在:答案引擎優化(AEO) 當搜索結果開始由AI直接生成“答案”而非…

搭建Node.js服務器

1.基礎HTTP服務器: 添加了路由處理添加了404錯誤處理添加了服務器錯誤監聽 2.靜態資源服務器: 使用異步文件操作支持目錄自動索引(默認加載 index.html)自動檢測文件類型并設置正確Content-Type更完善的錯誤處理 3.處理GET請求參數 提供了一個HTML表單用于測試使用url模塊…

Linux grep 命令

grep 是 Linux/Unix 系統中用于文本搜索的強大工具,支持基于正則表達式的模式匹配。以下是其詳細用法及實際應用示例: 基本語法 grep [選項] 模式 [文件...]模式:要搜索的字符串或正則表達式。文件:可以是單個文件或多個文件&…

oracle 11g通過rman做備份和還原

ORACLE RMAN增量備份完整恢復測試 1.創建測試環境: 1.1.創建測試表空間 SQL> create tablespace tablespace1 datafile ‘/data/u01/app/oracle/oradata/orcl/tablespace1.dbf’ size 10m; SQL> 1.2.創建測試用戶并指定為默認表空間: SQL> create user user1 iden…

為什么TCP有粘包問題,而UDP沒有

TCP粘包問題源于其面向字節流的設計,而UDP無此問題因其基于數據報的傳輸機制。 🔍 一、TCP粘包問題的原因 字節流傳輸特性 TCP將數據視為連續的字節流,而非獨立的消息包。發送端多次寫入的小數據可能被合并為一個TCP段發送;接收端…

ELM:Embodied Understanding of Driving Scenarios

1. ELM 的創新點與核心思路 ELM 的核心在于 “具身理解”(Embodied Understanding),即通過常識與環境交互并進行推理,這一理念適用于自動駕駛車輛、機器人和無人機等多種應用場景。具身智能體(Embodied Agent)需具備四大核心能力:首先,它能夠描述周圍環境,對交通物體的…

實景VR知識科普

實景VR的定義與技術特點 實景VR,即基于真實場景的虛擬現實技術,是通過計算機生成的三維環境,旨在模擬并再現真實世界場景。用戶佩戴VR設備(如VR頭盔、手柄等)后,能夠沉浸在一個高度仿真的虛擬環境中&#…

CppCon 2016 學習:ITERATOR HAIKU

這組幻燈片講解了 C 中**范圍(Ranges)和迭代器(Iterators)**的核心概念,特別是 C14 標準定義的五種迭代器類別,以及范圍的基本使用方式。我幫你理個思路: 1. RANGE-SEQUENCE: 元素范圍&#xf…

開源飛控fmt軟件在環仿真環境搭建

tags: 飛控 fmt開發環境搭建 fmt是國產開源飛控,特點是支持基于模型設計(基于simulink仿真),源碼結構目錄較清晰,項目體積較小。 此項目操作系統選擇的是國產實時操作系統rt-thread,也是開源項目。&#…

如何通過AI測試平臺實現自動化缺陷檢測和優化

在數字化轉型加速的今天,軟件質量保證已成為企業競爭力的關鍵要素之一。傳統的手工測試方法面臨著效率低下、成本高昂和覆蓋面有限等挑戰,而AI技術的融入為軟件測試領域帶來了革命性的變化。本文將深入探討如何構建一個完整的AI測試平臺,實現…

使用JeecgBoot配置

Jeecg 使用方法 本文以在環境配置好的前提下進行講解 如果不會配置環境 可在billbill網站的Jeecg官網搜索環境配置 第一步 打開redis,redis是一個服務,需要用命令行打開 且命令行不能關 不能實現一勞永逸效果 每次關閉都得重新打開一次。 第二步 啟動j…

NodeJS:版本及對應時間并對應的npm版本

versionltsrelease dateenginenpmnode下載更新日志文檔Node.js 24.0.1?2025-05-0813.61--下載更新日志文檔Node.js 22.12.0?2024-12-03---下載更新日志文檔Node.js 21.2.0 2023-11-1411.8.172.1710.2.3120下載更新日志文檔Node.js 20.10.0?2023-11-2211.3.244.810.2.3115下載…

UI前端大數據處理:應對海量數據的挑戰與策略

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 在數字化轉型的深水區,全球每日產生的數據量已突破 500EB,相當于 10 億…

對微服務的了解

微服務是一種架構風格,我們可以把應用程序劃分為一組小型的、松散耦合的服務, 每個服務都運行在自己的進程中,并通過輕量級的通信機制進行通信, 每個服務都是獨立部署、獨立擴展、獨立更新的,從而提高了應用程序的可伸…

計算機視覺生物啟發視覺算法:如何模擬人眼與大腦?

計算機視覺生物啟發視覺算法:如何模擬人眼與大腦? 一、前言二、人眼與大腦視覺系統基礎概念?2.1 人眼的生理結構與功能?2.2 大腦視覺皮層的信息處理機制?三、生物啟發視覺算法的核心技術?3.1 視網膜啟發的特征提取算法?3.2 視覺皮層啟發的分層特征學習算法?3.3 注意力機…

stm32使用定時器功能之高精度定時(微秒級)、輸入捕獲以及超聲波測距

一、定時器功能之高精度定時(微秒級) 我們常用的延時函數中無論是HAL_Delay還是vTaskDelay()函數都是毫秒級的定時,我們可以借助定時器實現一個微秒級更高精度的延時函數。這個定時器不會影響FreeRtos的任務切換 這里就是用定時器的計數功能…

Git常用命令摘要

寫這篇博文的目的只是簡單的給自己及團隊的日常工作中需要用到的git命令作個匯總,這樣平時只需要查閱這篇文章就夠了,不用到處查找。如果能給有需要的朋友一點點的幫助,那也算是意外之喜吧。 一、基礎配置 # 設置用戶名和郵箱(首…

ubuntu 22.04 安裝部署kibana 7.10.0詳細教程

安裝部署kibana 7.10.0詳細教程 下載并安裝二、修改kibana.yml文件三、性能配置四、啟動服務驗證五、安裝啟動常見問題 【背景】 整個elk安裝是基于ubuntu 22.04和jdk 11環境。kibana均采用 *.deb方式安裝,需要服務器能聯網。ubuntu 22.04 安裝部署elk(elasticsearc…

nfs 服務器的搭建

nfs 服務器的搭建 1.配置yum源 mkdir /etc/yum.repos.d/bak mv /etc/yum.repo.d/*.repo /etc/yum.repos.d/bak/ curl -o /etc/yum.repos.d/centos.repo http://10.26.210.101/centos/centos.repo # 外網 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.c…

Yii2 基礎版實現 Token 認證 API 服務的完整框架方案

以下是一個基于 Yii2 基礎版實現 Token 認證 API 服務的完整框架方案,包含 JWT 實現和完整代碼: 1. 環境準備 composer create-project --prefer-dist yiisoft/yii2-app-basic yii2-api cd yii2-api2. 安裝必要擴展 composer require firebase/php-jw…