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} \nRun 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\nOBS:如果我在重做新计算(Illumination.calculate_N(data))之前使用console.log()查看data_base变量的值,则该变量的值应正确显示,在这些计算后不久它就会更改。
\n因为在这两种情况下,您分配的不是当前状态下的对象本身,而是对该对象的引用。您需要做的是克隆对象,以便此时状态被冻结。
\n\n简单克隆(浅复制)
\n\nlet data_base = Object.assign({}, data); //you get a clone of data \n\nlet data_proposto = Object.assign({}, data); \nRun Code Online (Sandbox Code Playgroud)\n\n这里的限制是它只进行浅复制。请参阅下面的深层复制以获取更多说明。
\n\nJSON 克隆
\n\n这是一种快速但肮脏的克隆方法,因为它将 JSON 对象转换为字符串,然后再转换回来。即你不再得到一个引用,而是一个新对象。
\n\nlet data_base = JSON.parse(JSON.stringify(data));\n\nlet data_postero = JSON.parse(JSON.stringify(data));\nRun Code Online (Sandbox Code Playgroud)\n\n但如果您的对象不是 JSON 安全的,这将不起作用。
\n\n深拷贝
\n\n最不优雅的方法可能是最安全的。它将属性深度复制到新对象中。与 Object.assign() 的主要区别在于它复制嵌套属性的值,而 Object.assign() 复制对嵌套对象的引用。
\n\n因此,使用 Object.assign() 嵌套对象中的任何后续更改都将影响“克隆”的所有版本。如果您的克隆在克隆 \xe2\x80\x93 时仅具有这些嵌套对象的属性值,则不会发生这种情况,这些值不会受到嵌套对象的任何更改的影响。
\n\nconst 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);\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
9195 次 |
| 最近记录: |