javascript变量在原始变量更改后更改值

Joã*_*bro 7 javascript node.js

对原始变量进行新更改后,我无法维护变量的原始值。

\n\n

代码:

\n\n
(...)\ndata = Illumination.calculate_N(data)\ndata = Illumination.calculate_pi(data)\ndata = Illumination.calculate_kwh(data)\ndata = Illumination.calculate_ca(data)           \n\nlet data_base = data\n\nlet ca_base = data.ca\nlet kwh_base = data.kwh\nlet pi_base = data.pi\n\n(...)\n\ndata = Illumination.calculate_N(data)\ndata = Illumination.calculate_pi(data)\ndata = Illumination.calculate_kwh(data)\ndata = Illumination.calculate_ca(data)            \n\nlet data_proposto = data\n\nlet ca_proposto = data.ca\nlet kwh_proposto = data.kwh\nlet pi_proposto = data.pi\n\n-----------------------------------\nEXAMPLE:\nstatic calculate_ai(data){\n  data.ai = data.areaTotal*data.au\n  return data\n} \n
Run Code Online (Sandbox Code Playgroud)\n\n

预计原始变量(日期)的值将是 \xe2\x80\x8b\xe2\x80\x8bchanged,并且这种情况发生正确,但是,变量 data_base 和 data_proposto 没有保留其值

\n\n

计算结束时两个变量具有相同的值 \xe2\x80\x8b\xe2\x80\x8bas 变量日期

\n\n

变量 ca_proposto、ca_base 等正确存储其值 \xe2\x80\x8b\xe2\x80\x8b

\n\n

任何想法?

\n\n

变量 data_base 和 data_proposto 的唯一交互是它们与 data 变量的创建以及函数的返回

\n\n

OBS:如果我在重做新计算(Illumination.calculate_N(data))之前使用console.log()查看data_base变量的值,则该变量的值应正确显示,在这些计算后不久它就会更改。

\n

cha*_*oir 7

因为在这两种情况下,您分配的不是当前状态下的对象本身,而是对该对象的引用。您需要做的是克隆对象,以便此时状态被冻结。

\n\n

简单克隆(浅复制)

\n\n
let data_base = Object.assign({}, data); //you get a clone of data \n\nlet data_proposto = Object.assign({}, data); \n
Run Code Online (Sandbox Code Playgroud)\n\n

这里的限制是它只进行浅复制。请参阅下面的深层复制以获取更多说明。

\n\n

JSON 克隆

\n\n

这是一种快速但肮脏的克隆方法,因为它将 JSON 对象转换为字符串,然后再转换回来。即你不再得到一个引用,而是一个新对象。

\n\n
let data_base = JSON.parse(JSON.stringify(data));\n\nlet data_postero = JSON.parse(JSON.stringify(data));\n
Run Code Online (Sandbox Code Playgroud)\n\n

但如果您的对象不是 JSON 安全的,这将不起作用。

\n\n

深拷贝

\n\n

最不优雅的方法可能是最安全的。它将属性深度复制到新对象中。与 Object.assign() 的主要区别在于它复制嵌套属性的值,而 Object.assign() 复制对嵌套对象的引用

\n\n

因此,使用 Object.assign() 嵌套对象中的任何后续更改都将影响“克隆”的所有版本。如果您的克隆在克隆 \xe2\x80\x93 时仅具有这些嵌套对象的属性值,则不会发生这种情况,这些值不会受到嵌套对象的任何更改的影响。

\n\n
const deepCopy = function(src) {\nlet target = {};\n// using for/in on object also returns prototype properties\nfor (let prop in src) {\n    // .hasOwnProperty() filters out these prototype properties.\n    if (src.hasOwnProperty(prop)) {\n        target[prop] = src[prop]; //iteratively copies over values, not references\n    }\n}\nreturn target;\n}\n\nlet data_base = deepCopy(data);\n\nlet data_postero = deepCopy(data);\n
Run Code Online (Sandbox Code Playgroud)\n