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

JavaScript判斷數(shù)據(jù)類(lèi)型的四種方式總結(jié)

 更新時(shí)間:2025年04月11日 10:56:57   作者:十五丶  
JavaScript 作為一門(mén)動(dòng)態(tài)語(yǔ)言,其靈活性是把雙刃劍,一方面帶來(lái)了開(kāi)發(fā)的便利性,另一方面也給我們?cè)陬?lèi)型判斷時(shí)帶來(lái)了挑戰(zhàn),特別是在處理類(lèi)型轉(zhuǎn)換和隱式轉(zhuǎn)換的時(shí)候,所以本篇文章我們將探討 JavaScript 中的數(shù)據(jù)類(lèi)型判斷方式及在實(shí)際項(xiàng)目中的應(yīng)用,需要的朋友可以參考下

數(shù)據(jù)類(lèi)型回顧

JavaScript 的數(shù)據(jù)類(lèi)型大致分為兩類(lèi):原始類(lèi)型和復(fù)雜類(lèi)型

原始類(lèi)型:

  • undefined:未定義
  • number:數(shù)字
  • boolean:布爾值
  • string:字符串
  • null:空值
  • symbol:符號(hào)(ES6 新增)
  • bigint:大整數(shù)(ES2020 新增)

復(fù)雜類(lèi)型:

  • Object:對(duì)象
  • Array:數(shù)組
  • Function:函數(shù)
  • Date:日期
  • RegExp:正則表達(dá)式

類(lèi)型判斷方法詳解

typeof 操作符

typeof 是最基礎(chǔ)且常用的類(lèi)型判斷方法,使用簡(jiǎn)單,參閱 MDN 文檔

語(yǔ)法:typeof 后面跟一個(gè)值或表達(dá)式,返回一個(gè)字符串,表示操作數(shù)的類(lèi)型

可能返回的數(shù)據(jù)類(lèi)型為:undefined、boolean、number、string、object、function、symbol、bigint

// 原始類(lèi)型判斷
typeof "hello"; // "string"
typeof 123; // "number"
typeof true; // "boolean"
typeof undefined; // "undefined"
typeof Symbol(); // "symbol"
typeof 123n; // "bigint"

// 引用類(lèi)型判斷的局限性
typeof []; // "object"
typeof {}; // "object"
typeof null; // "object" (這是一個(gè)歷史遺留的bug)
typeof new Date(); // "object"
typeof /regex/; // "object"

typeof function () {}; // "function"

注意,typeof 操作符一般用于判斷原始類(lèi)型,對(duì)于引用類(lèi)型的判斷存在局限性:

  • 對(duì)引用值的判斷有誤,一般會(huì)返回固定的字符串 object
  • null 會(huì)被錯(cuò)誤的判斷為 object 類(lèi)型

instanceof 操作符

instanceof 用于檢測(cè)構(gòu)造函數(shù)的 prototype 屬性是否出現(xiàn)在某個(gè)實(shí)例對(duì)象的原型鏈上,返回一個(gè)布爾值,參閱 MDN 文檔

也就是判斷一個(gè)實(shí)例對(duì)象是否屬于某個(gè)構(gòu)造函數(shù)

語(yǔ)法為

object instanceof constructor;

// object:實(shí)例對(duì)象
// constructor:構(gòu)造函數(shù)

比如下面的例子

const arr = [1, 2, 3];

console.log(arr instanceof Array); // true
console.log(arr instanceof Object); // true
console.log(arr instanceof Function); // false

一個(gè)構(gòu)造函數(shù)的示例:

function Person(name, age) {
  this.name = name;
  this.age = age;
}

const person = new Person("張三", 20);

console.log(person instanceof Person); // true

在這個(gè)例子中,實(shí)例對(duì)象 person 會(huì)通過(guò) __proto__ 屬性向上查找原型鏈,直到找到 Person.prototype 為止,如果找到則返回 true,如果找到頂部 null 都沒(méi)有找到,則返回 false

實(shí)例對(duì)象的 __proto__ 屬性指向構(gòu)造函數(shù)的 prototype 對(duì)象

注意,instanceof 操作符只能用于判斷引用類(lèi)型,不能用于判斷原始類(lèi)型

還存在一個(gè)隱患是:如果其原型鏈被更改,可能導(dǎo)致判斷不準(zhǔn)確

Object.prototype.constructor

除了 nullundefined 以外,所有引用類(lèi)型都有 constructor 屬性,用于返回對(duì)象的構(gòu)造函數(shù),參閱 MDN 文檔

我們繼續(xù)以 instanceof 章節(jié)的構(gòu)造函數(shù)示例來(lái)看:

所以,更新的圖示如下:

image.png

實(shí)例對(duì)象的 __proto__ 屬性指向構(gòu)造函數(shù)的 prototype 對(duì)象

在圖示中,person__proto__ 會(huì)等于 Person.prototype,所以 person 實(shí)例對(duì)象上也有一個(gè) constructor 屬性

而且,無(wú)論一個(gè)變量是通過(guò)構(gòu)造函數(shù)方式還是字面量方式,都會(huì)有一個(gè) constructor 屬性

字面量方式在通過(guò)引擎解析時(shí),JavaScript 后臺(tái)會(huì)創(chuàng)建一個(gè)相應(yīng)的原始包裝類(lèi)型對(duì)象,暴露出操作原始值的各種方法

const name = "十五";
console.log(name.constructor === String); // true

const age = 18;
console.log(age.constructor === Number); // true

const arr = [1, 2, 3];
console.log(arr.constructor === Array); // true

基本上 constructor 屬性能夠判斷出除了 null 和 undefined 外的所有類(lèi)型

Object.prototype.toString()

一個(gè)通用且準(zhǔn)確的類(lèi)型判斷方法

Object.prototype 表示所有對(duì)象的原型對(duì)象,這個(gè)對(duì)象上擁有一個(gè) toString()方法,用于返回對(duì)象的字符串表示形式

然后搭配 call() 方法,用于改變方法內(nèi)部的 this 指向

call():函數(shù)實(shí)例擁有的一個(gè)方法,傳入的第一個(gè)參數(shù)可以改變函數(shù)內(nèi)部的 this 指向

基本用法:

const toString = Object.prototype.toString;

const name = "十五";
const age = 18;

console.log(toString.call(name)); // [object String]
console.log(toString.call(age)); // [object Number]

針對(duì)性的類(lèi)型判斷方法

Array.isArray()

Array.isArray() 方法用于判斷傳入的值是否是一個(gè)數(shù)組

const arr = [1, 2, 3];

console.log(Array.isArray(arr)); // true

Number.isNaN()

Number.isNaN() 方法用于判斷傳入的值是否為 NaN

NaN:Not a Number,無(wú)法表示為數(shù)字的值

console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN("十五")); // false
console.log(Number.isNaN(123)); // false

注意,全局的 isNaN()Number.isNaN() 的區(qū)別在于前者會(huì)強(qiáng)制進(jìn)行類(lèi)型轉(zhuǎn)換,后者則不會(huì)(全等判斷)

在實(shí)踐項(xiàng)目中的應(yīng)用

封裝判斷類(lèi)型的工具函數(shù)

在真實(shí)的項(xiàng)目場(chǎng)景中,我們往往可以統(tǒng)一封裝一些工具函數(shù),用于判斷類(lèi)型

比如在 utils 文件夾下新建一個(gè) judge.js 文件,用于編寫(xiě)一些判斷類(lèi)型的工具函數(shù)

這里默認(rèn)你使用了 TypeScript

/**
 * 判斷是否為字符串
 * @param value 需要判斷的值
 * @returns 布爾值 | true 表示是字符串,false 表示不是字符串
 */
export const isString = (value: unknown): value is string => {
  return typeof value === "string";
};

/**
 * 通用且精確的類(lèi)型判斷
 * @param value 需要判斷的值
 * @param type 類(lèi)型
 * @returns 布爾值 | true 表示符合類(lèi)型,false 表示不符合
 */
const isType = (value: unknown, type: string) => {
  return (
    Object.prototype.toString.call(value).slice(8, -1).toLowerCase() === type
  );
};

借助第三方庫(kù)

Lodash 是一個(gè)一致性、模塊化、高性能的 JavaScript 實(shí)用工具庫(kù)

它提供了許多有用的工具函數(shù),包括類(lèi)型判斷函數(shù),如 isString、isNumber、isArray

總結(jié)

上面我們?cè)敿?xì)介紹了 JavaScript 中的數(shù)據(jù)類(lèi)型判斷方法,包括 typeof、instanceofconstructorObject.prototype.toString(),你需要注意的是:

  • 選擇合適的判斷方法
  • 判斷原始類(lèi)型時(shí),優(yōu)先使用 typeof
  • 判斷繼承關(guān)系時(shí),使用 instanceof
  • 需要通用、準(zhǔn)確的判斷方式時(shí),使用 Object.prototype.toString.call()
  • 實(shí)際項(xiàng)目場(chǎng)景下的應(yīng)用
  • 考慮封裝工具函數(shù)
  • 借助成熟的第三方庫(kù),如 Lodash

以上就是JavaScript判斷數(shù)據(jù)類(lèi)型的四種方式總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于JavaScript判斷數(shù)據(jù)類(lèi)型的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 微信小程序之購(gòu)物車(chē)功能

    微信小程序之購(gòu)物車(chē)功能

    這篇文章主要為大家詳細(xì)介紹了微信小程序之購(gòu)物車(chē)功能的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Bootstrap創(chuàng)建可折疊的組件

    Bootstrap創(chuàng)建可折疊的組件

    這篇文章主要為大家詳細(xì)介紹了Bootstrap創(chuàng)建可折疊組件的對(duì)應(yīng)方法,以實(shí)例為大家分享了Bootstrap折疊組件,感興趣的小伙伴們可以參考一下
    2016-02-02
  • js鼠標(biāo)懸浮出現(xiàn)遮罩層的方法

    js鼠標(biāo)懸浮出現(xiàn)遮罩層的方法

    這篇文章主要介紹了js鼠標(biāo)懸浮出現(xiàn)遮罩層的方法,以實(shí)例形式較為詳細(xì)的分析了html及css頁(yè)面布局與js特效的實(shí)現(xiàn)方法,是非常實(shí)用的技巧,需要的朋友可以參考下
    2015-01-01
  • javascript制作的滑動(dòng)圖片菜單

    javascript制作的滑動(dòng)圖片菜單

    本文給大家分享的是一款javascript制作的很漂亮的js滑動(dòng)導(dǎo)航菜單,鼠標(biāo)經(jīng)過(guò)立即快速滑動(dòng)切換顯示。有需要的小火把可以參考下。
    2015-05-05
  • JavaScript網(wǎng)絡(luò)請(qǐng)求工具庫(kù)axios使用實(shí)例探索

    JavaScript網(wǎng)絡(luò)請(qǐng)求工具庫(kù)axios使用實(shí)例探索

    這篇文章主要為大家介紹了JavaScript網(wǎng)絡(luò)請(qǐng)求工具庫(kù)axios使用實(shí)例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 原生js實(shí)現(xiàn)文件上傳、下載、封裝等實(shí)例方法

    原生js實(shí)現(xiàn)文件上傳、下載、封裝等實(shí)例方法

    在本篇文章里小編給各位整理的是關(guān)于原生js實(shí)現(xiàn)文件上傳、下載、封裝等實(shí)例方法,需要的朋友們可以參考學(xué)習(xí)下。
    2020-01-01
  • Bootstrap每天必學(xué)之導(dǎo)航條(二)

    Bootstrap每天必學(xué)之導(dǎo)航條(二)

    Bootstrap每天必學(xué)之導(dǎo)航條,進(jìn)一步向大家講解了導(dǎo)航條養(yǎng)殖,以及導(dǎo)航條中元素的使用方法,感興趣的小伙伴們可以參考一下
    2016-03-03
  • 頁(yè)面版文本框智能提示JS代碼

    頁(yè)面版文本框智能提示JS代碼

    首先說(shuō)下背景,該code用于一個(gè)多條件查詢界面,原本該查詢條件由一個(gè)下拉列表提供,但是由于下拉列表數(shù)據(jù)量過(guò)大,用戶使用不方便,便希望在頁(yè)面給出一個(gè)智能提示的功能,但搜索的數(shù)據(jù)來(lái)自下拉列表
    2009-11-11
  • JS 常用校驗(yàn)函數(shù)

    JS 常用校驗(yàn)函數(shù)

    比較常用到的一些字符驗(yàn)證函數(shù),里面有正則等好東西,推薦大家保存即可直接調(diào)用。
    2009-03-03
  • JS判斷鍵盤(pán)是否按的回車(chē)鍵并觸發(fā)指定按鈕點(diǎn)擊操作的方法

    JS判斷鍵盤(pán)是否按的回車(chē)鍵并觸發(fā)指定按鈕點(diǎn)擊操作的方法

    下面小編就為大家?guī)?lái)一篇JS判斷鍵盤(pán)是否按的回車(chē)鍵并觸發(fā)指定按鈕點(diǎn)擊操作的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02

最新評(píng)論

昭觉县| 上虞市| 珠海市| 洛扎县| 新竹市| 册亨县| 临汾市| 正安县| 巫溪县| 长子县| 伊通| 河源市| 河源市| 汉阴县| 藁城市| 正宁县| 肇庆市| 耿马| 蚌埠市| 永川市| 吉隆县| 洛南县| 桂平市| 仁寿县| 那坡县| 通州区| 张掖市| 安庆市| 葵青区| 莎车县| 鹿邑县| 柳林县| 巍山| 禹州市| 玉门市| 金阳县| 绩溪县| 罗城| 沂水县| 宾川县| 全南县|