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

JS精準(zhǔn)判斷一個(gè)對象是不是數(shù)組的方法

 更新時(shí)間:2026年05月12日 08:29:32   作者:yqcoder  
這篇文章主要介紹了JavaScript中判斷數(shù)組的方法,包括Array.isArray()、instanceof、Object.prototype.toString三種方法的優(yōu)缺點(diǎn),并給出了一些使用技巧和避坑指南,其中array.isArray()是最推薦使用的方法,準(zhǔn)確可靠,跨上下文安全,是最安全、易讀的選擇

為什么判斷數(shù)組這么難?

在 JavaScript 中,數(shù)組本質(zhì)上也是一種對象。

console.log(typeof []); // "object"
console.log(typeof {}); // "object"

因?yàn)?typeof 只能區(qū)分基本類型(string, number, boolean, undefined, symbol, bigint)和引用類型(統(tǒng)一返回 object,函數(shù)返回 function),所以它無法直接告訴我們:“嘿,這是個(gè)數(shù)組!”

我們需要更高級的手段來揭開它的真面目。

1. 王者方案:Array.isArray()

這是 ES5 引入的標(biāo)準(zhǔn)方法,也是現(xiàn)代開發(fā)中的首選。

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

優(yōu)點(diǎn)

  • 語義清晰:代碼可讀性極高,一眼就能看懂意圖。
  • 準(zhǔn)確可靠:內(nèi)部實(shí)現(xiàn)機(jī)制完善,能正確處理各種邊界情況。
  • 跨上下文安全:即使數(shù)組來自不同的 iframe 或 window,它依然能正確識(shí)別(因?yàn)樗灰蕾囋玩溊^承關(guān)系,而是檢查內(nèi)部標(biāo)簽)。

缺點(diǎn)

  • 兼容性:不支持 IE8 及以下版本(但在 2024 年,這幾乎不再是問題)。

博主建議
無腦選它! 除非你有極其特殊的兼容需求,否則 Array.isArray 就是你的唯一選擇。

2. 經(jīng)典方案:instanceof

instanceof 運(yùn)算符用于檢測構(gòu)造函數(shù)的 prototype 屬性是否出現(xiàn)在某個(gè)實(shí)例對象的原型鏈上。

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

const obj = {};
console.log(obj instanceof Array); // false

優(yōu)點(diǎn)

  • 直觀:符合面向?qū)ο缶幊痰乃季S邏輯,“這個(gè)實(shí)例是不是由 Array 構(gòu)造函數(shù)創(chuàng)建的?”

缺點(diǎn)

跨上下文失效:這是最大的坑!
如果頁面中有多個(gè) iframe,每個(gè) iframe 都有自己獨(dú)立的執(zhí)行環(huán)境(也就是獨(dú)立的 Array 構(gòu)造函數(shù))。

// 假設(shè) iframe 中的數(shù)組傳到了主窗口
iframeArray instanceof Array; // false!
// 因?yàn)?iframeArray 的原型鏈指向的是 iframe 里的 Array.prototype,
// 而主窗口里的 Array 是另一個(gè)構(gòu)造函數(shù)。
  • 可被篡改:如果開發(fā)者手動(dòng)修改了原型鏈,instanceof 可能會(huì)給出錯(cuò)誤結(jié)果。

3. 通用方案:Object.prototype.toString

這是一種“黑科技”寫法,利用對象內(nèi)部的 [[Class]] 屬性(在 ES5 之前稱為 Class 內(nèi)部屬性,現(xiàn)在通過 toString 暴露)。

const arr = [];
console.log(Object.prototype.toString.call(arr)); // "[object Array]"

const obj = {};
console.log(Object.prototype.toString.call(obj)); // "[object Object]"

const str = "hello";
console.log(Object.prototype.toString.call(str)); // "[object String]"

優(yōu)點(diǎn)

  • 萬能 鑰匙:不僅能判斷數(shù)組,還能精準(zhǔn)判斷 Date, RegExp, Function, Null, Undefined 等所有內(nèi)置類型。
  • 跨上下文安全:和 Array.isArray 一樣,它不受不同 window/iframe 的影響,因?yàn)樗x取的是底層引擎標(biāo)記。

缺點(diǎn)

  • 寫法繁瑣Object.prototype.toString.call(obj) 太長,容易寫錯(cuò)。
  • 可讀性差:新手可能看不懂這是在干嘛。

技巧
你可以封裝一個(gè)工具函數(shù):

const typeCheck = (obj) => Object.prototype.toString.call(obj).slice(8, -1);
console.log(typeCheck([])); // "Array"

4. 避坑指南:typeof與constructor

陷阱 1:typeof

如前所述,typeof [] 返回 "object",完全無法區(qū)分?jǐn)?shù)組和普通對象。千萬別用!

陷阱 2:constructor

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

看起來不錯(cuò)?但它有兩個(gè)致命弱點(diǎn):

可被修改arr.constructor 是可以被人為賦值的,不可信。

arr.constructor = String;
console.log(arr.constructor === Array); // false (誤判!)

null/undefined 報(bào)錯(cuò)nullundefined 沒有構(gòu)造函數(shù),訪問會(huì)報(bào)錯(cuò)。

5. 跨框架/跨窗口場景的特殊陷阱

這是高級前端面試的??汀?/p>

場景:你的主頁面嵌入了一個(gè) iframe,iframe 里有一個(gè)數(shù)組 iframeArr,你把它傳回主頁面。

方法結(jié)果原因
iframeArr instanceof Array? False主頁面的 Array 和 iframe 的 Array 不是同一個(gè)引用。
Array.isArray(iframeArr)? True規(guī)范規(guī)定它檢查內(nèi)部插槽,不依賴原型鏈。
Object.prototype.toString.call(iframeArr)? “[object Array]”同樣基于內(nèi)部標(biāo)簽,不受上下文影響。

結(jié)論
在涉及多窗口、Web Worker 或微前端架構(gòu)時(shí),嚴(yán)禁使用 instanceof 判斷數(shù)組,必須使用 Array.isArraytoString 方法。

6.  總結(jié)與最佳實(shí)踐

方法準(zhǔn)確性跨上下文安全可讀性推薦指數(shù)
Array.isArray()?????? 是???????????????
Object.prototype.toString?????? 是????????
instanceof???? 否????????
constructor??? 否???? 不推薦
typeof? 無效-?????? 禁止使用

博主寄語
判斷數(shù)組看似簡單,實(shí)則暗藏玄機(jī)。

記住一條鐵律
永遠(yuǎn)優(yōu)先使用 Array.isArray()。
它不僅是最標(biāo)準(zhǔn)的 API,也是最安全、最易讀的選擇。
只有在需要同時(shí)判斷多種類型(如寫一個(gè)通用的 typeOf 工具庫)時(shí),才考慮使用 Object.prototype.toString。

以上就是JS精準(zhǔn)判斷一個(gè)對象是不是數(shù)組的方法的詳細(xì)內(nèi)容,更多關(guān)于JS判斷對象是不是數(shù)組的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • js跑馬燈代碼(自寫)

    js跑馬燈代碼(自寫)

    自己剛寫的一個(gè)小程序,寫得滿一般的,不過這個(gè)接口還成,感興趣的朋友可以參考下哈,希望對你學(xué)習(xí)js知識(shí)有所幫助
    2013-04-04
  • MUI 上拉刷新/下拉加載功能實(shí)例代碼

    MUI 上拉刷新/下拉加載功能實(shí)例代碼

    這篇文章主要介紹了MUI 上拉刷新/下拉加載功能實(shí)例代碼,包括一些個(gè)人心得,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧
    2017-04-04
  • JavaScript知識(shí)點(diǎn)整理

    JavaScript知識(shí)點(diǎn)整理

    本文是腳本之家小編日常整理的關(guān)于javascript知識(shí)點(diǎn),包括javascript擁有的特點(diǎn),組成部分,數(shù)據(jù)類型等方面,對javascript知識(shí)點(diǎn)相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2015-12-12
  • 在JavaScript中通過URL傳遞漢字的方法

    在JavaScript中通過URL傳遞漢字的方法

    在JavaScript中通過URL傳遞漢字的方法...
    2007-04-04
  • big.js?如何解決精度丟失問題源碼解析

    big.js?如何解決精度丟失問題源碼解析

    這篇文章主要為大家介紹了big.js?如何解決精度丟失問題源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • JavaScript實(shí)現(xiàn)網(wǎng)頁截圖功能

    JavaScript實(shí)現(xiàn)網(wǎng)頁截圖功能

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)網(wǎng)頁截圖功能,本文介紹了2款實(shí)現(xiàn)JavaScript截圖的開源組件,一個(gè)是Canvas2Image,一個(gè)是html2canvas,需要的朋友可以參考下
    2014-10-10
  • js實(shí)現(xiàn)輪播圖特效

    js實(shí)現(xiàn)輪播圖特效

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)輪播圖特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • window.location 對象所包含的屬性

    window.location 對象所包含的屬性

    這篇文章主要介紹了window.location 對象所包含的屬性,這些熟悉都是工作中經(jīng)常會(huì)用到的,很實(shí)用,需要的朋友可以參考下
    2014-10-10
  • JavaScript中的高級特性分享

    JavaScript中的高級特性分享

    JavaScript是一種功能強(qiáng)大的編程語言,具有許多高級特性,本文將介紹JavaScript中的一些高級特性,包括閉包、原型繼承、高階函數(shù)、異步編程和模塊化,希望對大家有所幫助
    2023-06-06
  • JS實(shí)現(xiàn)的通用表單驗(yàn)證插件完整實(shí)例

    JS實(shí)現(xiàn)的通用表單驗(yàn)證插件完整實(shí)例

    這篇文章主要介紹了JS實(shí)現(xiàn)的通用表單驗(yàn)證插件,可針對常見的日期、密碼、姓名等進(jìn)行驗(yàn)證并給出提示信息,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-08-08

最新評論

延长县| 利津县| 固原市| 凤山县| 马公市| 鹿邑县| 宁远县| 隆安县| 常德市| 刚察县| 平定县| 化德县| 库伦旗| 柏乡县| 萝北县| 盐城市| 溧水县| 密山市| 故城县| 南郑县| 青海省| 台山市| 赣州市| 开化县| 闸北区| 高雄市| 裕民县| 博爱县| 大同县| 封开县| 阿巴嘎旗| 安新县| 治多县| 思南县| 兰考县| 大田县| 丰县| 错那县| 乌兰察布市| 浙江省| 普宁市|