【问题标题】:the operation of "=" in javascriptjavascript中“=”的操作
【发布时间】:2013-11-27 07:44:15
【问题描述】:

考虑下面的代码

var pub_json_general = {"holis":["12/10/2013","12/25/2013","12/26/2013"]};
var holiday = {"holis":["12/02/2013"]};
var pub_json = pub_json_general;
pub_json.holis = $.merge(pub_json.holis,holiday.holis);

合并后pub_json.holis的长度变成了4,没错。但是,当我使用 firefox 调试器时,我发现 pub_json_general.holis 也会被更改,这意味着 pub_json_general 和 pub_json 将始终相同。

javascript中的“=”操作不是复制右侧并创建左侧来存储它,而是创建与右侧共享相同内存空间的左侧一边?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    是的,您自己已经正确解释了一切:)

    对于引用类型,equality assignment operator 将引用分配给对象,它不会克隆对象。因此,当你改变一个时,另一个也会改变。

    【讨论】:

      【解决方案2】:

      javascript中的“=”操作不是复制右侧并创建左侧来存储它,而是创建与右侧共享相同内存空间的左侧一边?

      这是一个非常令人困惑的问题。如果您想了解最后一条语句中发生的情况,请看:

      1. 计算表达式$.merge(pub_json.holis,holiday.holis)。因此,holiday.holis 的内容会附加到位于pub_json.holis 的数组中(与pub_json_general.holis 引用的数组相同)。

        表达式的结果是新修改的pub_json.holis数组。

      2. 1 的结果pub_json.holis 被分配给pub_json.holis,这可以理解,它什么也不做,而且是一个非操作。

      【讨论】:

        【解决方案3】:

        你可能想看看这个问题What is the most efficient way to deep clone an object in JavaScript?来解决你的问题

        【讨论】:

        • JS 中的一切都是按值传递。在对象的情况下,该值恰好是对该对象的引用。这与通过引用传递不同!
        • 你是对的,我的错。这是一个不幸的心理捷径。我已经删除了误导性的句子
        猜你喜欢
        • 2010-09-08
        • 2010-10-12
        • 1970-01-01
        • 1970-01-01
        • 2010-11-25
        • 2015-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多