为何Lighthouse将Array.isArray标记为Legacy JavaScript?
关于Array.isArray被PageSpeed标记为「Legacy JavaScript」的解答
为什么Array.isArray会被标记?
Array.isArray本身并没有过时,它是ES5标准引入的API,所有现代浏览器都原生支持。PageSpeed标记它为Legacy,几乎都是因为你的代码里包含了针对旧浏览器的**兼容垫片(polyfill)**或者封装函数。
比如早年为了支持IE8及更早版本,开发者常会写这样的兼容代码:
// 针对旧浏览器的Array.isArray垫片 if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === '[object Array]'; }; }
对现代浏览器来说,这段代码完全是冗余的Legacy代码,所以会被PageSpeed检测出来并标记。
Array.isArray是否过时?
完全没有过时,它是目前判断一个值是否为数组的最可靠标准方法。相比instanceof Array,它能正确处理跨窗口/iframe的数组实例(这类场景下instanceof会因为原型链问题失效,而Array.isArray依然有效)。
优化方案
如果是垫片代码导致的标记,最优处理方式是:
- 若你仍需要兼容旧浏览器,通过Babel、core-js等工具的配置,仅向不支持Array.isArray的浏览器注入垫片,现代浏览器直接使用原生API。
- 若不需要兼容IE8及更早版本,直接删除所有相关的兼容垫片代码即可。
如果是极罕见的误报,可忽略该提示,或检查代码中是否有其他封装Array.isArray的Legacy逻辑。
内容的提问来源于stack exchange,提问作者David Min
相关产品推荐
相关产品推荐

