修改数组子元素时全部元素都被改动?这是JavaScript的bug吗?
问题结论
这不是JavaScript的语法bug,属于Array.prototype.fill()方法的正常设计行为。
问题根因
你在代码中调用Array(4).fill(new Array("", ""))时,new Array("", "")仅会执行1次,全局仅生成1个数组实例,fill方法会将同一个数组对象的引用重复填充到外层数组的4个下标位置中。
也就是说外层数组的4个元素本质上指向内存中的同一个数组对象,你对TwoDimArray[0][0]赋值,本质是修改这个公共数组实例的属性,自然所有引用该实例的位置都会同步显示修改结果。
正确实现方式
如果要生成4个互相独立的子数组,可使用Array.from或fill+map的写法,保证每次迭代都生成新的子数组实例:
// 写法1:Array.from 映射函数每次执行生成独立子数组 const TwoDimArray = Array.from({length: 4}, () => new Array("", "")) // 写法2:先fill占位再通过map生成独立子数组 const TwoDimArray = Array(4).fill().map(() => new Array("", ""))
修改完成后再对TwoDimArray[0][0]赋值,就只会修改第一个子数组的第一个元素,不会影响其他子数组。
内容的提问来源于stack exchange,提问作者AAsomb113
相关产品推荐
相关产品推荐

