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

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

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

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

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

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

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

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

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

這是 ES5 引入的標準方法,也是現(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)點

  • 語義清晰:代碼可讀性極高,一眼就能看懂意圖。
  • 準確可靠:內(nèi)部實現(xiàn)機制完善,能正確處理各種邊界情況。
  • 跨上下文安全:即使數(shù)組來自不同的 iframe 或 window,它依然能正確識別(因為它不依賴原型鏈繼承關(guān)系,而是檢查內(nèi)部標簽)。

缺點

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

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

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

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

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

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

優(yōu)點

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

缺點

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

// 假設(shè) iframe 中的數(shù)組傳到了主窗口
iframeArray instanceof Array; // false!
// 因為 iframeArray 的原型鏈指向的是 iframe 里的 Array.prototype,
// 而主窗口里的 Array 是另一個構(gòu)造函數(shù)。
  • 可被篡改:如果開發(fā)者手動修改了原型鏈,instanceof 可能會給出錯誤結(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)點

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

缺點

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

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

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

4. 避坑指南:typeof與constructor

陷阱 1:typeof

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

陷阱 2:constructor

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

看起來不錯?但它有兩個致命弱點:

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

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

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

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

這是高級前端面試的???。

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

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

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

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

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

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

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

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

相關(guān)文章

  • js跑馬燈代碼(自寫)

    js跑馬燈代碼(自寫)

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

    MUI 上拉刷新/下拉加載功能實例代碼

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

    JavaScript知識點整理

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

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

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

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

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

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

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

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

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

    window.location 對象所包含的屬性

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

    JavaScript中的高級特性分享

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

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

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

最新評論

阜宁县| 安义县| 和硕县| 云南省| 万宁市| 隆回县| 富平县| 郸城县| 长武县| 武夷山市| 铜陵市| 航空| 会东县| 曲松县| 紫阳县| 深泽县| 荃湾区| 文水县| 卢湾区| 东辽县| 峨边| 威信县| 蕉岭县| 清镇市| 尤溪县| 临沭县| 板桥市| 全州县| 永康市| 阿克| 屏东市| 十堰市| 马公市| 建阳市| 景洪市| 运城市| 铜鼓县| 金川县| 海晏县| 漳州市| 中山市|