【问题标题】:Javascript assignation issueJavascript分配问题
【发布时间】:2016-07-14 09:14:38
【问题描述】:

我试图更改 Javascript 对象的结构,但我不明白我从日志中收到的结果。

我有以下对象:a = {e: 1, f: 2}

我想把它移到a.b

如果我执行a.b = a,那么我会收到以下结果:

console.log(a) // {e: 1, f: 2}
console.log(a.b) // {e: 1, f: 2}

虽然我期待这样的事情:

console.log(a) // {b: {e: 1, f: 2}}
console.log(a.b) // {e: 1, f: 2}

谁能解释一下为什么会这样?

【问题讨论】:

    标签: javascript variable-assignment


    【解决方案1】:

    在 JS 中赋值不会移动它,它会复制它。

    您正在向现有对象添加b 属性。

    它没有显示在日志中,因为console.log 通过不显示该属性来保护自己免受无限递归。

    【讨论】:

    • 哪个浏览器?在 Firefox 中console.log 确实显示了b
    • @Scimonster — OP 使用的任何浏览器。
    【解决方案2】:

    a.b = a 只是将a.b 分配为对a 的引用,这导致a 成为递归对象:

    var a = {e: 1, f: 2};
    a.b = a;
    
    console.log(a.e, a.f);  //1 2
    console.log(a.b.e, a.b.f);  //1 2
    console.log(a.b.b.e, a.b.b.f);  //1 2
    console.log(a.b.b.b.e, a.b.b.b.f);  //1 2

    要将a 的属性实际移动到a.b,您需要覆盖现有对象,将新属性b 分配给其现有值:

    var a = {e: 1, f: 2};
    
    a = {b: a};
    
    console.log(a);  //{b: {e: 1, f: 2}}

    【讨论】:

    • 在您的示例中,JSON.parse JSON.stringify 组合不是必需的,因为您已经为 a 分配了一个新对象。 a = { b : a}应该有smae效果。
    • 谢谢,@t.niese,不知道为什么我认为需要 JSON 方法。
    猜你喜欢
    • 2016-08-10
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2012-01-18
    • 2011-01-08
    相关资源
    最近更新 更多