You need to enable JavaScript to run this app. LeetCode第832题:temp变量定义在循环外代码运行错误原因咨询
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode第832题:temp变量定义在循环外代码运行错误原因咨询

LeetCode 832题代码问题解答

核心原因

你的问题本质是JavaScript中引用类型赋值的特性导致的:
数组属于引用类型,变量保存的不是数组本身的值,而是数组在内存中的存储地址。

当temp定义在函数开头时

全程只会初始化1个数组实例,整个函数运行过程中所有对temp的修改,都是操作同一块内存地址的内容。
你在每轮循环末尾执行image[i] = temp时,只是把image[i]指向了这个唯一的temp的内存地址,并没有把当前temp的值拷贝一份存到image[i]里。等到下一轮循环修改temp的内容时,之前所有已经赋值给image的元素都会跟着变,最终所有image的子数组都会和最后一轮循环结束后的temp值完全一致,自然结果错误。

当temp定义在循环内部时

每执行一次外层循环,都会创建一个全新的数组实例,对应全新的内存地址。每轮循环修改的都是当前轮次独立的temp,赋值给image[i]之后,下一轮新创建的temp和之前的不会互相干扰,所以结果正确。

快速验证方法

你可以在image[i] = temp这行之后加一行打印:

if(i>0) console.log(temp === image[i-1])

如果temp定义在函数开头,打印结果会是true,说明二者指向同一个数组;如果定义在循环内部,打印结果会是false,说明是不同的数组实例。

如果你一定要把temp定义在函数开头也可以,修改赋值逻辑就行

把image[i] = temp改成拷贝当前temp的值赋值即可:

image[i] = [...temp]
// 或者
image[i] = temp.slice()

这样每次赋值都会把temp的内容拷贝一份新的存到image里,也能得到正确结果。


内容的提问来源于stack exchange,提问作者Thomas Gu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 00:36:00