区分数组与对象
约 338 字大约 1 分钟
2026-03-31
思考
如何区分数组与对象?
typeof 只能获取基本数据类型,对于像数组、对象、null 等都会返回 'object'。下面是几种判断数组与对象的方法:
1. Array.isArray()
const arr = [1, 2, 3];
const obj = { a: 1, b: 2 };
Array.isArray(arr); // true
Array.isArray(obj); // false2. instanceof
console.log([] instanceof Array); // true
console.log({} instanceof Array); // false3. constructor
const arr = [1, 2, 3];
arr.constructor === Array; // true
// 但容易被伪造
const fakeArr = { constructor: Array };
fakeArr.constructor === Array; // true
// 或被改写
arr.constructor = Object;
arr.constructor === Array; // false4. Object.prototype.toString.call()
const arr = [1, 2, 3];
const obj = { a: 1 };
Object.prototype.toString.call(arr); // "[object Array]"
Object.prototype.toString.call(obj); // "[object Object]"
// 这是 Array.isArray 的底层原理提示
Object.prototype.toString.call() 是判断数据类型最全面的方法,不仅能判断基本类型,众多引用类型都能判断。
// 基本数据类型检测
Object.prototype.toString.call("hello"); // "[object String]"
Object.prototype.toString.call(42); // "[object Number]"
Object.prototype.toString.call(true); // "[object Boolean]"
Object.prototype.toString.call(undefined); // "[object Undefined]"
Object.prototype.toString.call(null); // "[object Null]"
Object.prototype.toString.call(Symbol()); // "[object Symbol]"
Object.prototype.toString.call(123n); // "[object BigInt]"
// 对象类型(能区分具体类型)
Object.prototype.toString.call({}); // "[object Object]"
Object.prototype.toString.call([]); // "[object Array]"
Object.prototype.toString.call(new Date()); // "[object Date]"
Object.prototype.toString.call(/regex/); // "[object RegExp]"
Object.prototype.toString.call(new Map()); // "[object Map]"
Object.prototype.toString.call(new Set()); // "[object Set]"
Object.prototype.toString.call(new WeakMap()); // "[object WeakMap]"
Object.prototype.toString.call(new WeakSet()); // "[object WeakSet]"
Object.prototype.toString.call(Promise.resolve()); // "[object Promise]"
Object.prototype.toString.call(function () {}); // "[object Function]"
Object.prototype.toString.call(Math); // "[object Math]"
Object.prototype.toString.call(JSON); // "[object JSON]"
// 跨 iframe 也有效
Object.prototype.toString.call(iframeArray); // "[object Array]"