首页 > 解决方案 > 为什么此代码引用不同的结果

问题描述

我是 JS 新手,正在学习 JS 中的值和引用类型,但我在下面的代码中遇到了一些困惑:

const obj = {
  arr: [{
    x: 17
  }]
};

let z = obj.arr;

z = [{
  x: 25
}];

console.log(obj.arr[0].x);

上面的代码输出 17 但为什么呢?嗯,arr 是一个引用类型,也就是说,它是可变的,然后我们将 obj.arr 与变量 z 相等,因此 z 持有对 obj 对象中 arr 数组的引用。最后,z 保持 17,然后我们将其更改为 25,但它输出 17。

标签: javascript

解决方案


第一次,你有这样的事情:

obj ---> {
           arr ---+
         }        |
                  |
                  v
                  [
                     [0] ---+
                  ]         |
                  ^         |
                  |         v
                  |         { x: 17 }
                  |
                  |
z ----------------+

请注意,z现在指向与但不是相同的对象obj.arr obj.arr

修改znow 的值会导致 of 的值(和引用)z发生变化,但obj.arr引用的对象和以前一样:

obj ---> {
           arr ---+
         }        |
                  |
                  v
                  [
                     [0] ---+
                  ]         |
                            |
                            v
                            { x: 17 }


z ----> [
          [0] ----> { x: 25 }
        ]

这就是为什么obj.arr没有改变。

但是如何通过 改变它z

你不能改变obj.arr它自己,但你仍然可以改变它。

而不是你的代码,使用这个:

z[0] = { x:25 }

现在你有:

obj ---> {
           arr ---+
         }        |
                  |
                  v
                  [
                     [0] ---> { x: 25 }
                  ]         
                  ^         
                  |        
                  |         { x: 17 } -----> Garbage collection
                  |
                  |
z ----------------+

const obj = {
    arr: [{ x: 17 }]
};

let z = obj.arr;

z[0] = { x: 25 };

console.log(obj.arr[0].x);


推荐阅读