JavaScript判斷是否為數組的各種方法匯總
前言
我們在日常開發中,常常有判斷某值類型的需求,今天我們總結一下常見的幾種用來判斷是否為數組的 JavaScript 方法。
Array.isArray
Array.isArray() 是ES5新增的方法,用於確定傳遞的值是否是一個數組,如果是數組,則返回 true,否則返回 false。
let arr = []; console.log(Array.isArray(arr)); // true
下面的函數調用都返回 true:
Array.isArray([]); Array.isArray([1]); Array.isArray(new Array()); Array.isArray(new Array("a", "b", "c", "d"));
需要註意的一點是:其實 Array.prototype 也是一個數組。
Array.isArray(Array.prototype); // true
下面的函數調用都返回 false:
Array.isArray(); Array.isArray({}); Array.isArray(null); Array.isArray(undefined); Array.isArray(17); Array.isArray('Array'); Array.isArray(true); Array.isArray(false); Array.isArray(new Uint8Array(32)) Array.isArray({ __proto__: Array.prototype });
兼容性如下圖:
可以看到,新版的主流瀏覽器都是支持該方法的,可以放心使用。
constructor
Object 的每個實例都有構造函數 constructor,用於保存著用於創建當前對象的函數
let arr = []; console.log(arr.constructor === Array); // true
需要註意的是,constructor 有被修改的風險,判斷結果不一定準確,比如:
let arr = [1, 2, 3]; arr.constructor = function () { } console.log(arr.constructor === Array); // false
一般不推薦使用 constructor 來判斷是否為數組,我們隻需要知道有這麼一個方法就行。
instanceof
instanceof 運算符用於檢測構造函數的 prototype 屬性是否出現在某個實例對象的原型鏈上。舉個例子:
// 定義構造函數 function C() {} function D() {} var o = new C(); o instanceof C; // true,因為 Object.getPrototypeOf(o) === C.prototype o instanceof D; // false,因為 D.prototype 不在 o 的原型鏈上 o instanceof Object; // true,因為 Object.prototype.isPrototypeOf(o) 返回 true C.prototype instanceof Object; // true,同上
用 instanceof 來判斷是否為數組的用法如下:
let arr = []; console.log(arr instanceof Array); // true
使用 instanceof 需要註意兩點:
- 構造函數的 prototype 和 實例的原型鏈都有可能會改變,所以判斷出的結果不一定一成不變。
- 在有 iframe 的頁面腳本中使用 instanceof,可能會得到錯誤的結果,因為 iframe 擁有獨立的全局環境,不同的全局環境擁有不同的全局對象,從而擁有不同的內置類型構造函數。
isPrototypeOf
isPrototypeOf() 可以用於測試一個對象是否存在於另一個對象的原型鏈上。用法如下:
function Foo() {} function Bar() {} function Baz() {} Bar.prototype = Object.create(Foo.prototype); Baz.prototype = Object.create(Bar.prototype); var baz = new Baz(); console.log(Baz.prototype.isPrototypeOf(baz)); // true console.log(Bar.prototype.isPrototypeOf(baz)); // true console.log(Foo.prototype.isPrototypeOf(baz)); // true console.log(Object.prototype.isPrototypeOf(baz)); // true
如果要用 isPrototypeOf 來判斷傳入參數是否為數組,可以這樣用:
let arr = []; console.log(Array.prototype.isPrototypeOf(arr)); // true
Object.prototype.toString
每個對象都有一個 toString() 方法,當該對象被表示為一個文本值時,或者一個對象以預期的字符串方式引用時自動調用。
默認情況下,toString() 方法被每個 Object 對象繼承。如果此方法在自定義對象中未被覆蓋,toString() 返回 “[object type]” 字符串,其中 type 是對象的類型。
可以通過 toString() 來獲取每個對象的類型。為瞭每個對象都能通過 Object.prototype.toString() 來檢測,需要以 Function.prototype.call() 或者 Function.prototype.apply() 的形式來調用,傳遞要檢查的對象作為第一個參數,稱為 thisArg。用法如下:
var toString = Object.prototype.toString; toString.call(new Date); // [object Date] toString.call(new String); // [object String] toString.call(Math); // [object Math] //Since JavaScript 1.8.5 toString.call(undefined); // [object Undefined] toString.call(null); // [object Null]
如果要用來判斷一個對象是否為數組,可這樣使用:
let arr = []; console.log(Object.prototype.toString.call(arr) === "[object Array]"); // true
兼容性如下:
typeof
說到判斷類型,可能很多人都會想到 typeof 方法,我們這裡來復習一下 typeof 相關內容。
typeof 操作符返回一個字符串,表示未經計算的操作數的類型。
console.log(typeof 42); // "number" console.log(typeof 'blubber'); // "string" console.log(typeof true); // "boolean" console.log(typeof undeclaredVariable); // "undefined"
typeof 可能的返回值如下:
通過上圖可以看到,數組對象屬於“其他任何對象”,所以數組對象的 typeof 返回值是 “object”:
let arr = []; console.log(typeof arr); // "object"
所以,我們要盡量避免使用 typeof。
總結
以上就是幾種用來判斷一個值是否為數組的幾種方法,當然有好用的也有不好用的,但是不管怎樣,我們知道有這麼回事總歸是好的。總結一下:
- 最好用的方法是 Array.isArray,隻是不支持 IE8 及以下。
- 如果要考慮兼容性,則可以使用 Object.prototype.toString。
到此這篇關於JavaScript判斷是否為數組的文章就介紹到這瞭,更多相關JavaScript判斷是否為數組內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 分享JavaScript 類型判斷的幾種方法
- JavaScript中檢測數據類型的四種方法
- JavaScript數據結構常見面試問題整理
- JS疑惑的數據類型及類型判斷方法詳解
- 關於JS數據類型檢測的多種方式總結