Node.js中推入数组的对象被后续更新影响的技术问题
问题:修改原对象导致数组中已有元素同步变化的原因及解决办法
你遇到的核心问题是JavaScript的引用类型特性:对象属于引用类型,当你把candleObject推入数组时,数组里存储的不是对象的副本,而是指向该对象内存地址的引用。这意味着不管是通过原变量candleObject,还是数组里的bitcoinCandleHistoryArray[0]操作,本质都是在修改同一个内存里的对象,所以会出现改一个全变的情况。
下面是几种解决办法:
1. 每次创建全新的蜡烛对象
不再复用同一个变量,每次需要新蜡烛时直接定义新对象,确保每个对象都是独立的:
var bitcoinCandleHistoryArray = []; // 第一根蜡烛 var candle1 = { open: 100, high: 100, low: 100, close: 100, volume: 10000 }; bitcoinCandleHistoryArray.push(candle1); // 第二根蜡烛 var candle2 = { open: 0, high: 0, low: 0, close: 0, volume: 0 }; bitcoinCandleHistoryArray.push(candle2);
2. 用工厂函数批量生成新对象
如果需要频繁创建结构相同的蜡烛对象,写一个工厂函数,每次调用都会返回一个新的独立对象:
var bitcoinCandleHistoryArray = []; // 工厂函数:传入参数返回新蜡烛对象 function createCandle(open, high, low, close, volume) { return { open, high, low, close, volume }; } // 推入第一根蜡烛 bitcoinCandleHistoryArray.push(createCandle(100, 100, 100, 100, 10000)); // 推入第二根蜡烛 bitcoinCandleHistoryArray.push(createCandle(0, 0, 0, 0, 0));
3. 复制现有对象(浅拷贝)
如果一定要基于原对象修改,可以先复制出一个新对象再推入数组,常用的浅拷贝方法有两种:
- 扩展运算符
... Object.assign()
示例代码:
var bitcoinCandleHistoryArray = []; var candleObject = { open: 0, high: 0, low: 0, close: 0, volume: 0 }; // 设置第一根蜡烛,推入对象副本 candleObject.open = 100; candleObject.high = 100; candleObject.low = 100; candleObject.close = 100; candleObject.volume = 10000; bitcoinCandleHistoryArray.push({...candleObject}); // 修改原对象后,推入新的副本 candleObject.open = 0; candleObject.high = 0; candleObject.low = 0; candleObject.close = 0; candleObject.volume = 0; bitcoinCandleHistoryArray.push(Object.assign({}, candleObject));
内容的提问来源于stack exchange,提问作者TheDude
相关产品推荐
相关产品推荐

