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

如何判別JS中的數(shù)據(jù)類(lèi)型?一篇文章教你徹底弄懂typeof和instanceof

 更新時(shí)間:2025年08月29日 08:28:37   作者:Jinuss  
typeof和instanceof都是JavaScript中用于類(lèi)型檢查的操作符,但它們的工作方式和應(yīng)用場(chǎng)景有顯著不同,這篇文章主要介紹了如何判別JS中的數(shù)據(jù)類(lèi)型的相關(guān)資料,通過(guò)這篇文章可以徹底弄懂typeof和instanceof,需要的朋友可以參考下

引言:JavaScript的類(lèi)型迷宮

在JavaScript的世界里,數(shù)據(jù)類(lèi)型就像變色龍一樣善變。有時(shí)我們需要準(zhǔn)確識(shí)別這些"變色龍"的真實(shí)身份,這時(shí)instanceoftypeof就成了我們的偵探工具。但它們各有所長(zhǎng),也各有局限。今天,我們就來(lái)探索這兩個(gè)偵探的秘密武器,以及它們的替代方案。

第一章:typeof - 快速身份識(shí)別器

typeof是JavaScript中最基礎(chǔ)的類(lèi)型檢查工具,它能快速告訴我們一個(gè)值的基本類(lèi)型。

console.log(typeof "Hello");      // "string"
console.log(typeof 42);           // "number"
console.log(typeof true);         // "boolean"
console.log(typeof undefined);    // "undefined"
console.log(typeof null);         // "object" (歷史遺留問(wèn)題!)
console.log(typeof []);           // "object"
console.log(typeof {});           // "object"
console.log(typeof function(){}); // "function"

typeof的優(yōu)勢(shì):

  • 簡(jiǎn)單直接:語(yǔ)法簡(jiǎn)單,使用方便
  • 基本類(lèi)型友好:對(duì)原始類(lèi)型判斷準(zhǔn)確
  • 安全可靠:不會(huì)拋出錯(cuò)誤,即使變量未聲明

typeof的局限:

  • 對(duì)象類(lèi)型模糊:所有對(duì)象(數(shù)組、日期等)都返回"object"
  • null問(wèn)題:著名的歷史遺留問(wèn)題,typeof null返回"object"
  • 無(wú)法區(qū)分對(duì)象子類(lèi)型:無(wú)法區(qū)分?jǐn)?shù)組、日期等具體對(duì)象類(lèi)型

適用場(chǎng)景:

  • 檢查變量是否已定義:if (typeof variable !== 'undefined')
  • 區(qū)分基本類(lèi)型和對(duì)象
  • 快速檢查函數(shù)類(lèi)型

第二章:instanceof - 家族血統(tǒng)鑒定師

instanceof檢查對(duì)象是否屬于特定構(gòu)造函數(shù)或類(lèi)的實(shí)例,關(guān)注的是原型鏈上的繼承關(guān)系。

class Animal {}
class Dog extends Animal {}

const fido = new Dog();

console.log(fido instanceof Dog);    // true
console.log(fido instanceof Animal);  // true
console.log(fido instanceof Object);  // true

const arr = [];
console.log(arr instanceof Array);   // true
console.log(arr instanceof Object);  // true

const date = new Date();
console.log(date instanceof Date);   // true

instanceof的優(yōu)勢(shì):

  • 識(shí)別對(duì)象子類(lèi)型:能區(qū)分?jǐn)?shù)組、日期等具體對(duì)象類(lèi)型
  • 檢查繼承關(guān)系:可以檢查對(duì)象是否在某個(gè)原型鏈上
  • 自定義類(lèi)型識(shí)別:適用于自定義類(lèi)和構(gòu)造函數(shù)

instanceof的局限:

  • 基本類(lèi)型無(wú)效:對(duì)原始類(lèi)型不起作用
  • 跨窗口問(wèn)題:iframe或不同全局環(huán)境中的對(duì)象無(wú)法正確判斷
  • 可能被欺騙:通過(guò)修改原型鏈可以影響結(jié)果

適用場(chǎng)景:

  • 檢查對(duì)象是否是特定類(lèi)的實(shí)例
  • 驗(yàn)證數(shù)組類(lèi)型(比typeof更準(zhǔn)確)
  • 處理自定義對(duì)象類(lèi)型
  • 檢查對(duì)象是否實(shí)現(xiàn)了某個(gè)接口(通過(guò)原型鏈)

第三章:typeof vs instanceof 實(shí)戰(zhàn)對(duì)決

讓我們通過(guò)實(shí)際場(chǎng)景看看兩位偵探的表現(xiàn):

// 場(chǎng)景1:檢查數(shù)組
const myArray = [1, 2, 3];

console.log(typeof myArray);      // "object" - 不夠具體
console.log(myArray instanceof Array); // true - 完美!

// 場(chǎng)景2:檢查數(shù)字
const myNumber = 42;

console.log(typeof myNumber);     // "number" - 正確
console.log(myNumber instanceof Number); // false - 失??!

// 場(chǎng)景3:檢查null
const myNull = null;

console.log(typeof myNull);       // "object" - 錯(cuò)誤!
// console.log(myNull instanceof Object); // 報(bào)錯(cuò)!

// 場(chǎng)景4:自定義類(lèi)
class Pizza {}
const myPizza = new Pizza();

console.log(typeof myPizza);      // "object" - 不夠具體
console.log(myPizza instanceof Pizza); // true - 完美!

對(duì)決結(jié)果

  • 基本類(lèi)型:typeof勝出
  • 對(duì)象類(lèi)型:instanceof勝出
  • null檢查:兩者都失敗

第四章:其他類(lèi)型偵探工具

1. Array.isArray() - 數(shù)組專(zhuān)家

專(zhuān)門(mén)解決數(shù)組檢測(cè)問(wèn)題:

console.log(Array.isArray([])); // true
console.log(Array.isArray({})); // false

2. Object.prototype.toString.call() - 萬(wàn)能偵探

最精確的類(lèi)型檢測(cè)方法:

console.log(Object.prototype.toString.call([])); // "[object Array]"
console.log(Object.prototype.toString.call({})); // "[object Object]"
console.log(Object.prototype.toString.call(null)); // "[object Null]"
console.log(Object.prototype.toString.call(42)); // "[object Number]"

3. constructor屬性 - 血統(tǒng)追蹤器

訪問(wèn)對(duì)象的構(gòu)造函數(shù):

const arr = [];
console.log(arr.constructor === Array); // true

function Car() {}
const myCar = new Car();
console.log(myCar.constructor === Car); // true

注意:constructor屬性可以被修改,不夠可靠

4. 鴨子類(lèi)型 - 行為主義者

“如果它走起來(lái)像鴨子,叫起來(lái)像鴨子,那它就是鴨子”

// 檢查是否是類(lèi)數(shù)組對(duì)象
function isArrayLike(obj) {
    return obj && 
           typeof obj.length === 'number' && 
           typeof obj[0] !== 'undefined';
}

console.log(isArrayLike([])); // true
console.log(isArrayLike({length: 0})); // true
console.log(isArrayLike("hello")); // true

第五章:現(xiàn)代JavaScript的類(lèi)型偵探工具

1. 可選鏈操作符(?.) - 安全訪問(wèn)專(zhuān)家

const user = {
    address: {
        street: "Main St"
    }
};

// 安全訪問(wèn)嵌套屬性
console.log(user?.address?.street); // "Main St"
console.log(user?.contacts?.email); // undefined (不會(huì)報(bào)錯(cuò))

2. 空值合并運(yùn)算符(??) - 默認(rèn)值專(zhuān)家

const name = null;
console.log(name ?? "Anonymous"); // "Anonymous"

const age = 0;
console.log(age ?? 21); // 0 (不會(huì)誤判0)

3. 類(lèi)型守衛(wèi) - TypeScript的超級(jí)偵探

在TypeScript中,我們可以創(chuàng)建自定義類(lèi)型守衛(wèi):

function isFish(pet: Fish | Bird): pet is Fish {
    return (pet as Fish).swim !== undefined;
}

const myPet: Fish | Bird = getPet();

if (isFish(myPet)) {
    myPet.swim(); // TypeScript知道m(xù)yPet是Fish
} else {
    myPet.fly(); // TypeScript知道m(xù)yPet是Bird
}

第六章:如何選擇合適的偵探工具

  1. 基本類(lèi)型檢查:使用typeof

    • 檢查字符串、數(shù)字、布爾值等
    • 檢查變量是否定義
  2. 對(duì)象類(lèi)型檢查

    • 數(shù)組:優(yōu)先使用Array.isArray()
    • 其他內(nèi)置對(duì)象:使用instanceof
    • 自定義對(duì)象:使用instanceof
  3. 精確類(lèi)型識(shí)別:使用Object.prototype.toString.call()

  4. 安全訪問(wèn):使用可選鏈?.和空值合并??

  5. 類(lèi)型安全開(kāi)發(fā):使用TypeScript

第七章:實(shí)際應(yīng)用場(chǎng)景

場(chǎng)景1:表單驗(yàn)證

function validateFormField(value) {
    if (value === null || value === undefined) {
        return "值不能為空";
    }
    
    if (typeof value === "string" && value.trim() === "") {
        return "字符串不能為空";
    }
    
    if (typeof value === "number" && isNaN(value)) {
        return "數(shù)字無(wú)效";
    }
    
    return "驗(yàn)證通過(guò)";
}

場(chǎng)景2:API響應(yīng)處理

async function fetchUserData() {
    try {
        const response = await fetch("/api/user");
        const data = await response.json();
        
        // 檢查是否是期望的數(shù)據(jù)結(jié)構(gòu)
        if (data && typeof data === "object" && 
            Array.isArray(data.posts) && 
            typeof data.name === "string") {
            return data;
        }
        
        throw new Error("無(wú)效的響應(yīng)格式");
    } catch (error) {
        console.error("獲取用戶數(shù)據(jù)失敗:", error);
        return null;
    }
}

場(chǎng)景3:多態(tài)函數(shù)

function calculateArea(shape) {
    if (shape instanceof Rectangle) {
        return shape.width * shape.height;
    }
    
    if (shape instanceof Circle) {
        return Math.PI * shape.radius ** 2;
    }
    
    if (Array.isArray(shape) && shape.length === 2) {
        // 處理 [width, height] 數(shù)組
        return shape[0] * shape[1];
    }
    
    throw new Error("不支持的形狀類(lèi)型");
}

結(jié)語(yǔ):成為JavaScript類(lèi)型偵探大師

在JavaScript的世界里,沒(méi)有完美的類(lèi)型檢測(cè)工具,只有最適合當(dāng)前場(chǎng)景的選擇:

  • typeof是你的基礎(chǔ)工具包,適合快速識(shí)別基本類(lèi)型
  • instanceof是你的專(zhuān)業(yè)工具,用于檢查對(duì)象血統(tǒng)
  • 其他方法如Array.isArray()Object.prototype.toString.call()是你的專(zhuān)業(yè)助手

真正的JavaScript偵探大師會(huì)根據(jù)不同場(chǎng)景靈活選擇工具,有時(shí)甚至組合使用多種方法。記住,理解這些工具的原理和局限比記住它們的用法更重要。

現(xiàn)在,你已經(jīng)準(zhǔn)備好面對(duì)JavaScript類(lèi)型系統(tǒng)的任何挑戰(zhàn)了!出發(fā)吧,類(lèi)型偵探!

到此這篇關(guān)于JS中typeof和instanceof的文章就介紹到這了,更多相關(guān)JS中typeof和instanceof內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript是如何實(shí)現(xiàn)繼承的(六種方式)

    JavaScript是如何實(shí)現(xiàn)繼承的(六種方式)

    大多OO語(yǔ)言都支持兩種繼承方式: 接口繼承和實(shí)現(xiàn)繼承 ,而ECMAScript中無(wú)法實(shí)現(xiàn)接口繼承,ECMAScript只支持實(shí)現(xiàn)繼承,而且其實(shí)現(xiàn)繼承主要是依靠原型鏈來(lái)實(shí)現(xiàn),下文給大家技術(shù)js實(shí)現(xiàn)繼承的六種方式,需要的朋友參考下
    2016-03-03
  • javascript獲取web應(yīng)用根目錄的方法

    javascript獲取web應(yīng)用根目錄的方法

    這篇文章主要介紹了javascript獲取web應(yīng)用根目錄的方法,需要的朋友可以參考下
    2014-02-02
  • 微信小程序基于本地緩存實(shí)現(xiàn)點(diǎn)贊功能的方法

    微信小程序基于本地緩存實(shí)現(xiàn)點(diǎn)贊功能的方法

    這篇文章主要介紹了微信小程序基于本地緩存實(shí)現(xiàn)點(diǎn)贊功能的方法,涉及微信小程序界面布局、事件響應(yīng)及緩存操作等相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-12-12
  • JS模擬實(shí)現(xiàn)哈希表及應(yīng)用詳解

    JS模擬實(shí)現(xiàn)哈希表及應(yīng)用詳解

    這篇文章主要介紹了JS模擬實(shí)現(xiàn)哈希表及應(yīng)用,結(jié)合實(shí)例形式分析了javascript模擬實(shí)現(xiàn)哈希表的步驟、相關(guān)操作技巧與使用方法,需要的朋友可以參考下
    2018-05-05
  • 解決JS外部文件中文注釋出現(xiàn)亂碼問(wèn)題

    解決JS外部文件中文注釋出現(xiàn)亂碼問(wèn)題

    中文亂碼在Java Web開(kāi)發(fā)中經(jīng)常出現(xiàn),這是由于不同的部分編碼不一樣造成的,一般在開(kāi)發(fā)中,我們把所有能設(shè)編碼的地方,全部設(shè)置成UTF-8,但是有時(shí)候還是會(huì)出現(xiàn)亂碼的情況。下面通過(guò)本文給大家分享JS外部文件中文注釋出現(xiàn)亂碼的解決方案,一起看看吧
    2017-07-07
  • js實(shí)現(xiàn)網(wǎng)頁(yè)換膚

    js實(shí)現(xiàn)網(wǎng)頁(yè)換膚

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)網(wǎng)頁(yè)換膚功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • webpack4 SCSS提取和懶加載的示例

    webpack4 SCSS提取和懶加載的示例

    這篇文章主要介紹了webpack4 SCSS提取和懶加載的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • 使用JS-SDK開(kāi)發(fā)公眾號(hào)微信網(wǎng)頁(yè)的完整步驟

    使用JS-SDK開(kāi)發(fā)公眾號(hào)微信網(wǎng)頁(yè)的完整步驟

    微信JS-SDK是微信公眾平臺(tái) 面向網(wǎng)頁(yè)開(kāi)發(fā)者提供的基于微信內(nèi)的網(wǎng)頁(yè)開(kāi)發(fā)工具包,下面這篇文章主要介紹了使用JS-SDK開(kāi)發(fā)公眾號(hào)微信網(wǎng)頁(yè)的完整步驟,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • 微信小程序?qū)崿F(xiàn)車(chē)牌鍵盤(pán)

    微信小程序?qū)崿F(xiàn)車(chē)牌鍵盤(pán)

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)車(chē)牌鍵盤(pán),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • JavaScript中實(shí)現(xiàn)最高效的數(shù)組亂序方法

    JavaScript中實(shí)現(xiàn)最高效的數(shù)組亂序方法

    這篇文章主要介紹了JavaScript中實(shí)現(xiàn)最高效的數(shù)組亂序方法,數(shù)組亂序的意思是,把數(shù)組內(nèi)的所有元素排列順序打亂,需要的朋友可以參考下
    2014-10-10

最新評(píng)論

黄平县| 宿迁市| 收藏| 夏津县| 永城市| 通州市| 廊坊市| 尖扎县| 白银市| 福安市| 阿城市| 定兴县| 芜湖县| 铁岭县| 衡东县| 浮梁县| 六安市| 鄂托克前旗| 资中县| 平乡县| 玛沁县| 库伦旗| 府谷县| 唐山市| 柳江县| 和平县| 大丰市| 昌吉市| 封丘县| 杂多县| 大田县| 兴化市| 谷城县| 奉化市| 滁州市| 沛县| 高要市| 南和县| 永春县| 常山县| 奉贤区|