推入数组后对象意外修改

时间:2018-11-06 13:01:33

标签: javascript arrays node.js

我似乎应该是一个简单的操作。对于每个bridgedSection,我检查一个具有与bridged.referenceSection

匹配的ID的potentialSection。

然后,我得到那个结果,用Cherio解析对象上的HTML,稍作修改(使用id进行测试),然后将bridgedSection和修改后的结果存储在一个对象上,然后将该对象推送到数组。

如果在推送之前记录新对象,则会得到正确的对象值。如果我从数组中记录它,则会得到错误的值 only 供参考。 bridgedSection很好,但是reference.section在数组中的所有条目之间都匹配。

轻描淡写地说我被彻底弄糊涂了。任何人都可以阐明我(显然)做错了什么吗?

var sectionCount = 0;
bridgedSections.forEach(bridged => {
    var obj = potentialSections.find(obj => obj._id == bridged.referenceSection);

    $ = cheerio.load(obj.html);
    $(".meditor").html(bridged._id);// dropping the id here so it's easy to see if it was updated

    obj.html = $.html();
    obj.rand = Math.floor(Math.random() * 1000); // can't seem to add to obj either

    var thisSection = {
        referenceSection: obj,
        bridgedSection: bridged,
    }
    console.log(thisSection) // correct value logged
    currentSections.push(thisSection);
    sectionCount++;
});
console.log(currentSections); 
// this logs an array of the correct length but each 
// {}.referenceSection is identical to the last entry pushed above

3 个答案:

答案 0 :(得分:1)

JavaScript通过引用传递函数参数。这意味着发生以下情况:

derp = {a:1}
function passedByRef(param){
  param['a'] = 2;
}
passedByRef(derp)
console.log(derp['a']) // 2

因此,当您将json对象传递给函数时,如果您在函数中修改该对象,它将更改原始对象。在将bridged分配给thisSection之前,您可能想对其进行深拷贝,因为如果稍后在bridged中修改thisSection的版本,它将修改原始对象。

这是一篇谈论cloning objects的帖子,或者您可以研究类似immutable js

的内容

答案 1 :(得分:1)

为了试图弄清上述两个人在说什么,JavaScript语言(与其他语言一样)具有引用的概念,并且对该概念进行了大量使用。

当一个变量“引用”另一个变量时,仅一个一个 副本该值:其他所有内容均引用该值。因此,对这些引用中的任何一个进行的更改都会更改[one ...]基础值(并在所有引用中立即反映出来)。

引用的优点当然是它们非常“轻巧”。

如果您需要对数组或结构或所拥有的东西进行所谓的“深层复制” ,则可以这样做。如果要推送该值并确保不能更改它,则需要确保所推送的内容是这样的“深层副本”,或者没有引用(因为显然< strong>是,现在...)。您的选择。

NB 引用(尤其是 circular 引用)对内存管理(和“泄漏”)也具有重要意义,因为事物不会被内存“收割”经理直到所有对它的引用不再存在。 (一切都是“引用计数”。)

而且,我刚才所说的所有内容几乎均适用于支持此功能的每种语言,就像现在大多数语言一样。

答案 2 :(得分:0)

我认为您需要研究Javascript 深拷贝

在修改第二个分配的变量时,您正在修改原始对象,因为它们指向同一对象。您真正需要的是复制对象,而不仅仅是指向它的指针。

看看这个:

https://scotch.io/bar-talk/copying-objects-in-javascript#toc-deep-copying-objects