这个判断数组的方法(Object.prototype.toString.call(obj) === '[object Array]'
)有以下几个优点:
-
可靠性高:
- 这个方法利用了 JavaScript 内部的
[[Class]]
属性,是最可靠的类型检测方法之一 - 即使在跨框架(iframe)或跨窗口的情况下也能正确工作
- 这个方法利用了 JavaScript 内部的
-
无法被篡改:
- 与
instanceof
和Array.isArray()
相比,这个方法调用的是原始的Object.prototype.toString
方法 - 即使有人修改了
Array.prototype
或Object.prototype
,这个方法仍然可靠
- 与
-
兼容性好:
- 在所有 JavaScript 环境中都可用
- 而
Array.isArray()
是 ES5 才引入的方法,在老旧浏览器中可能不支持
不过在现代开发中,我们通常推荐使用更简洁的 Array.isArray()
方法,因为:
- 代码更易读
- 性能更好
- 已经有很好的浏览器支持
示例对比:
// 传统方法
const isArray1 = Object.prototype.toString.call(obj) === '[object Array]';
// 现代方法(推荐)
const isArray2 = Array.isArray(obj);
除非你需要在非常特殊的环境或极端情况下判断数组类型,否则使用 Array.isArray()
是更好的选择。