JavaScript中for循环为何只返回最后一个值而非所有值?
循环中对象引用导致的数组结果异常
先看你写的代码:
function test(){ const obj = {} const arr = [] for(let i = 0; i < 100; i++) { obj.i = i arr.push(obj) } return arr } const res = test(); console.log(res);
为什么返回的是100个{"i":99}?核心原因是JavaScript里的对象是引用类型:
- 你在循环外只创建了一个
obj对象,所有循环操作的都是这个对象的引用 - 每次循环里的
obj.i = i只是修改这个唯一对象的i属性值 arr.push(obj)并没有把对象本身放进数组,而是把这个对象的内存地址(引用)存进了数组
所以数组里的100个元素其实全是指向同一个对象的引用,当循环结束时,这个对象的i属性已经被最后一次循环的99覆盖,打印数组时自然所有元素看起来都是{"i":99}。
如果要得到预期的结果,只需要把obj的创建放到循环内部,让每次循环都生成一个新的独立对象:
function test(){ const arr = [] for(let i = 0; i < 100; i++) { const obj = {} obj.i = i arr.push(obj) } return arr } const res = test(); console.log(res);
内容的提问来源于stack exchange,提问作者KARTHIKEYAN.A
相关产品推荐
相关产品推荐

