array.isarray() 是判断变量是否为数组最可靠的方法,因为它直接返回布尔值且不受上下文影响,相比 typeof(对数组返回 "object")和 instanceof(在跨 iframe 时失效)更精确安全,能正确识别跨全局环境的数组,而其他方法如 object.prototype.tostring.call() 虽然也可行但更繁琐,鸭子类型判断则易误判,因此推荐始终使用 array.isarray() 进行数组类型检测。

Array.isArray()
true
false
typeof
instanceof
在 JavaScript 中,判断一个变量是不是数组,最直接、最稳妥的方式就是使用
Array.isArray()
它的用法非常简单,直接把你想判断的变量作为参数传进去就行:
const arr = [1, 2, 3];
const obj = { a: 1 };
const str = "hello";
const num = 123;
const func = () => {};
const n = null;
const u = undefined;
console.log(Array.isArray(arr)); // true
console.log(Array.isArray(obj)); // false
console.log(Array.isArray(str)); // false
console.log(Array.isArray(num)); // false
console.log(Array.isArray(func)); // false
console.log(Array.isArray(n)); // false
console.log(Array.isArray(u)); // false我个人觉得,它之所以这么好用,关键在于它直接问了一个核心问题:“你是不是一个真正的数组?”而不是绕弯子去检查原型链或者类型字符串。这避免了很多潜在的坑,尤其是在跨iframe或者跨全局环境操作时。
说实话,刚开始学 JavaScript 的时候,我也挺困惑的,判断数组为啥不能直接用
typeof
instanceof
Array.isArray()
typeof
"object"
typeof []
"object"
null
"object"
console.log(typeof []); // "object"
console.log(typeof {}); // "object"
console.log(typeof null); // "object" (这是一个历史遗留的bug,但它确实返回"object")你看,光靠
typeof
null
再来说
instanceof
[] instanceof Array
true
iframe
想象一下,你在一个
iframe
// 假设这是父窗口的JS
const iframe = document.createElement('iframe');
document.body.appendChild(iframe);
const iframeWindow = iframe.contentWindow;
// 在iframe中创建数组
const iframeArray = iframeWindow.Array(1, 2, 3);
// 在父窗口判断这个数组
console.log(iframeArray instanceof Array); // 极有可能返回 false!
// 因为 iframeWindow.Array 和 window.Array 是不同的构造函数实例
// 但
console.log(Array.isArray(iframeArray)); // true (总是可靠)这就是
instanceof
window
global
Array
instanceof
Array.isArray()
[[Class]]
"Array"
除了上面提到的
iframe
一个常见的“陷阱”是类数组对象 (Array-like Objects)。这些对象长得很像数组,它们有
length
arguments
NodeList
HTMLCollection
function showArgs() {
console.log(arguments); // { '0': 1, '1': 2, '2': 3, length: 3 }
console.log(Array.isArray(arguments)); // false
}
showArgs(1, 2, 3);
const divs = document.getElementsByTagName('div'); // 这是一个 NodeList
console.log(divs); // 看起来像数组,有length属性
console.log(Array.isArray(divs)); // falseArray.isArray()
map
forEach
Array.from()
...
// 将 arguments 转换为数组 const argsArray = Array.from(arguments); // 或者 const argsArraySpread = [...arguments]; // 将 NodeList 转换为数组 const divsArray = Array.from(divs); // 或者 const divsArraySpread = [...divs];
此外,在处理从外部接口(比如 JSON API)获取的数据时,也需要特别小心。虽然 JSON 规范里有数组类型,但如果数据传输过程中出现问题,或者后端返回了非预期的结构,你可能会收到一个看起来像数组但实际上是普通对象的数据。这时候
Array.isArray()
尽管
Array.isArray()
最经典的替代方案之一是使用
Object.prototype.toString.call()
"[object Array]"
const arr = [1, 2];
const obj = {};
const str = "hello";
console.log(Object.prototype.toString.call(arr)); // "[object Array]"
console.log(Object.prototype.toString.call(obj)); // "[object Object]"
console.log(Object.prototype.toString.call(str)); // "[object String]"
// 所以,你可以这样判断:
function isArrayAlternative(variable) {
return Object.prototype.toString.call(variable) === '[object Array]';
}
console.log(isArrayAlternative(arr)); // true
console.log(isArrayAlternative(obj)); // false这个方法的好处是,它和
Array.isArray()
iframe
[[Class]]
Array.isArray()
Object.prototype.toString.call()
Date
RegExp
还有一种思路,虽然不推荐用于严格的数组类型判断,但在某些场景下会用到,那就是鸭子类型 (Duck Typing)。它的核心思想是“如果它走起来像鸭子,叫起来像鸭子,那它就是鸭子”。对于数组而言,这意味着检查一个对象是否拥有数组的典型特征,比如
length
push
pop
function isProbablyArrayLike(variable) {
return typeof variable === 'object' &&
variable !== null &&
typeof variable.length === 'number' &&
variable.length >= 0 &&
(variable.length === 0 || (variable.length > 0 && (variable.hasOwnProperty(0) || variable.hasOwnProperty(variable.length - 1)))); // 检查是否有索引属性
}
// 这种方法非常粗糙,容易误判
console.log(isProbablyArrayLike([])); // true
console.log(isProbablyArrayLike({ 0: 'a', 1: 'b', length: 2 })); // true (这是个普通对象,但符合条件)
console.log(isProbablyArrayLike({ length: 5 })); // true (即使没有元素,也可能被误判)这种鸭子类型判断方式,我通常只在需要处理“只要能像数组一样遍历和访问就行”的场景下考虑,而不是真正需要一个
Array
总而言之,虽然有这些替代方案,但
Array.isArray()
以上就是js 如何用isArray判断变量是否为数组的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号