为什么这段JavaScript代码最终输出的三个day数组元素完全相同?
问题原因分析
- JavaScript中数组属于引用类型,变量存储的不是数组本身的内容,而是数组在堆内存中的引用地址
- 你的
hours数组是在所有循环外声明的,整个代码运行周期里只创建了这一个hours数组实例 - 你在循环中执行
day[j] = hours时,只是把同一个hours的引用地址赋值给了day的各个元素,并没有把当前hours的内容复制一份独立存储 - 循环内打印
day[j]时,是每次刚修改完hours数组内容就立刻打印,所以此时输出的是每次修改后的最新值,看起来各次不同 - 等所有循环执行完,
hours数组存储的是最后一次循环修改的内容,而day[0]、day[1]、day[2]都指向同一个hours数组,所以最终三次打印的结果完全一致
修复方案
方案1:每次外层循环都创建独立的hours数组
将hours的声明移到外层循环内部,保证每次循环都生成新的独立数组实例:
let day = []; for (let j = 0; j < 3; j++) { let hours = []; // 每次循环创建新数组 for (let k = 0; k < 3; k++) { hours[k] = Math.floor(Math.random() * 25 + 20); } day[j] = hours; console.log(`day[${j}] ${day[j]}`); } console.log(`${day[0]}`) console.log(`${day[1]}`) console.log(`${day[2]}`)
方案2:赋值时对hours做浅拷贝
保留原有hours声明,赋值时复制hours的内容生成新数组再存入day:
let day = []; let hours = []; for (let j = 0; j < 3; j++) { for (let k = 0; k < 3; k++) { hours[k] = Math.floor(Math.random() * 25 + 20); } day[j] = [...hours]; // 扩展运算符做浅拷贝,也可替换为hours.slice() console.log(`day[${j}] ${day[j]}`); } console.log(`${day[0]}`) console.log(`${day[1]}`) console.log(`${day[2]}`)
内容的提问来源于stack exchange,提问作者ramkumar
相关产品推荐
相关产品推荐

