【问题标题】:Javascript ouptut questionsJavascript 输出问题
【发布时间】:2018-11-04 15:58:35
【问题描述】:

我正在练习一些 Javascript 输出问题,遇到了一个我无法理解输出的问题。这是代码:

var foo = {n: 1};
var bar = foo;
foo.x = foo = {n: 2};

foo.x 的值是多少?

我认为它会给出 {n: 2, x: {n: 2, x.....}}。 但它的价值是不确定的。谁能向我解释为什么它的价值是未定义的

【问题讨论】:

  • @JSONaLeo 如果它什么都不返回,为什么 bar = {n: 1, x: {n:2} }
  • 哇,很奇怪,对我来说毫无意义
  • 查看@bmceldowney 的答案,似乎对此有很好的把握
  • @JSONaLeo 赋值运算符总是返回值。请在此处引用赋值运算符 - javascript.info/operators

标签: javascript output


【解决方案1】:

foo 只是对对象的引用。

foo.x = foo = {n: 2}; 行从左到右依次出现。以下是按顺序发生的步骤:

  1. foo.x 被赋予 foo 的值,这是一个 n 属性等于 1 的对象的引用。

  2. foo 然后被分配给一个新对象 {n: 2}。由于foo 现在引用了一个没有x 属性的新对象,因此foo.x 未定义。

但是因为bar 是对原始foo 对象的引用(在重新分配之前),所以原始对象仍然存在于内存中。这就是bar 对象同时具有xn 属性的原因。

【讨论】:

  • 感谢您教我们一些新东西。 JS 充满惊喜
  • 感谢@bmceldowney 解释解决方案。
  • 我不确定方向,如果您尝试使用没有参考的数字,它会从右到左。
  • @zohirSalak - 是的,我尝试了从右到左的数字,这就是我在这里发布这个问题的原因。如果您对此有任何更好的解释,请与我们分享
  • @PriyanshuAgarwal 你能给我一个使用数字的例子吗?数字不能有属性(所以var foo = 3; foo.x = 2; 只会产生foo = 3foo.x = undefined)所以这个例子不是真的有效。
【解决方案2】:

这样想:

定义一辆车并将其命名为foo

定义名为 bar 的标志,它指代名为 foo 的汽车

通过重新定义名为foo 的汽车并使座位与汽车相同,定义一个seat (foo.x),您希望它位于名为foo 的汽车内。


您在这里(基本上)所做的是:

  1. 创建对象
  2. 向对象添加属性
  3. 覆盖您刚刚创建的内容

【讨论】:

    【解决方案3】:

    这基本上是一种简写赋值,在一行中将多个变量赋值给相同的值。

    这有点令人困惑,因为我们正在处理引用。

    var foo = {n:2}
    
    1. foo 是该对象的标签或名称,因此我们可以使用它。
    2. {n:2} 是我们正在处理的对象,在本例中我们将其命名为 TheObject 我们可以使用 bar 但为简单起见忘记 bar 引用该对象

    var bar = foo;
    
    1. 这意味着我们正在为同一个对象分配第二个名称。

    到目前为止一切都清楚了,希望现在就在这一行:

    foo.x = foo = {n: 2};
    

    这里发生的事情是我们正在为 foo.x 和 foo 分配一个新对象{n:2}, 我们告诉 foo 指向这个新对象,但是 foo.x 有点特殊,它不是 foo 指向的任何东西,而是 TheObject 我们的旧对象。

    这是因为这是一行操作,当我们说foo这只是标签/名称foo.xTheObject.x

    OP 的例子

    var foo = {
      n: 1
    };
    var bar = foo;
    foo.x = foo = {
      n: 2
    };
    console.log(foo)
    console.log(bar)

    测试示例

    var foo = {n: 1};
    var bar = foo;
    // bar references the first object
    // we didn't touche bar so we're good to test with it
    bar.x = foo = {n: 2};
    console.log(foo)
    console.log(bar)

    对不起,如果解释有点不靠谱,我的文字和想法都不太顺利。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-15
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 2011-08-16
      • 2011-07-29
      • 2012-09-21
      • 2012-06-05
      相关资源
      最近更新 更多