为什么对数组自身调用Array.prototype.push()会产生无限嵌套数组
无限嵌套数组&栈溢出原因说明
你运行的代码逻辑如下:
const animals = ['pigs', 'goats', 'sheep']; animals.push(animals) console.log(animals);
具体原因可以拆解为几点:
- 数组属于JavaScript中的引用类型,变量
animals中存储的不是数组的实际内容,而是数组在堆内存中的存储地址。 - 执行
animals.push(animals)时,是将animals对应的内存地址作为新元素追加到数组末尾,而非追加当前数组的拷贝值。 - 这就形成了循环引用结构:你可以无限层级访问该数组的最后一个元素,
animals[3]、animals[3][3]、animals[3][3][3]……拿到的都是同一个数组本身,不存在访问终点,也就是你说的无限嵌套数组。 - 你碰到的
Error: Maximum call stack size exceeded.报错大多是console.log触发的:多数运行环境的控制台打印数组时,会递归遍历数组的每一层元素做格式化展示,碰到这种无限嵌套的循环引用结构时,递归没有终止条件,调用栈持续累积最终超出上限,就抛出了栈溢出错误。
补充说明:如果不调用
console.log打印这个数组,仅执行push操作本身是不会抛出错误的,只是数组会存在循环引用的结构。
内容的提问来源于stack exchange,提问作者PengPengQ
相关产品推荐
相关产品推荐

