flat 可指定展开层数,通过 depth 参数控制:默认为 1,Infinity 表示完全展开;depth 为 0、负数或 NaN 时按 0 处理(不展开),undefined 等价于不传;仅处理数组元素,对对象、null 等保持原样;IE 不支持,可用 reduce + concat 模拟。

flat 能不能指定展开几层?
能,flat 接收一个可选参数 depth,表示最多递归展开的层数。不传时默认为 1,传 Infinity 则完全展开到一维。
depth 为 0、负数或非数字时怎么处理?
传 0 相当于不展开,返回原数组(浅拷贝);传负数或 NaN 会被转成 0;传 undefined 等价于不传,即默认 1。
-
[1, [2, [3]]].flat(0)→[1, [2, [3]]] -
[1, [2, [3]]].flat(-1)→[1, [2, [3]]](负数被忽略) -
[1, [2, [3]]].flat()→[1, 2, [3]](默认只展一层) -
[1, [2, [3]]].flat(2)→[1, 2, 3]
和手写递归比,flat(depth) 有什么限制?
flat 只处理数组元素,对嵌套的类数组、对象、null 或 undefined 不做特殊处理,也不会报错——它们原样保留。
-
[1, [2, {a: 3}], [null]].flat(2)→[1, 2, {a: 3}, null](对象和null不被展开,也不报错) - 如果需要过滤掉空值或递归处理对象,得额外用
filter或自定义递归函数 -
flat是浅拷贝,原数组的引用类型元素(如子数组、对象)在结果中仍共享引用
兼容性与替代方案要注意什么?
IE 完全不支持 flat,Chrome 69+/Firefox 62+/Safari 12+ 支持。需兼容老环境时,可用 reduce + concat 模拟:
function flat(arr, depth = 1) {
if (depth === 0) return arr.slice();
return arr.reduce((acc, item) =>
Array.isArray(item)
? acc.concat(flat(item, depth - 1))
: acc.concat(item),
[]
);
}注意:这个模拟版会严格按 depth 展开,但无法处理 Infinity;且每次 concat 都新建数组,深度大时性能不如原生 flat。
真正容易被忽略的是:当你以为 flat(2) 能“彻底扁平”时,其实它只管两层——第三层里的数组依然存在,而这点在调试嵌套结构时常常被漏看。

















