从数组中删除该成员时,我们如何访问它?

Meh*_*ifi 0 javascript

var arr = [{id: 1, name: 'John'}, {id: 2, name: 'Mike'}];

var member = arr[0];

arr.splice(0, 1);

console.log(member);
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 10

您可以继续访问它,因为您仍然对其具有引用。它不再存在于数组中,但仍然存在。它会一直存在,直到所有对它的引用都被删除为止,并且一旦存在,就可以进行垃圾回收了。

在这之后:

var arr = [{id: 1, name: 'John'}, {id: 2, name: 'Mike'}];
Run Code Online (Sandbox Code Playgroud)

您的内存中有这样的内容(省略了一些详细信息):

                  + ???????????? +
arr:Ref4875 ??????> | (数组)|
                  + ???????????? + + ??????????????? +
                  | 0:Ref8612 | ?????> | (对象)|
                  | 1:Ref4631 | ?? + + ?????????????? +
                  + ???????????? + | | id:1 |
                                  | | 姓名:“约翰” |
                                  | + ????????????????? +
                                  |
                                  | + ????????????????? +
                                  + ??> | (对象)|
                                      + ????????????????? +
                                      | id:1 |
                                      | 姓名:“约翰” |
                                      + ????????????????? +

(“ Ref1234”值称为对象引用。您永远不会看到它们的实际值,但可以将它们视为JavaScript引擎用来查找对象在内存中位置的数字。)

然后在此之后:

var member = arr[0];
Run Code Online (Sandbox Code Playgroud)

两者member和数组均引用对象,如下所示:

成员:Ref8612 ????????????????????? +
                  + ???????????? + |
arr:Ref4875 ??????> | (数组)| |
                  + ???????????? + | + ????????????????? +
                  | 0:Ref8612 | ??? +?> | (对象)|
                  | 1:Ref4631 | ?? + + ?????????????? +
                  + ???????????? + | | id:1 |
                                  | | 姓名:“约翰” |
                                  | + ????????????????? +
                                  |
                                  | + ????????????????? +
                                  + ??> | (对象)|
                                      + ????????????????? +
                                      | id:1 |
                                      | 姓名:“约翰” |
                                      + ????????????????? +

然后:

arr.splice(0, 1);
Run Code Online (Sandbox Code Playgroud)

该数组不再有对其的引用,但member仍然可以:

                                      + ????????????????? +
成员:Ref8612 ???????????????????????> | (对象)|
                  + ???????????? + + ??????????????? +
arr:Ref4875 ??????> | (数组)| | id:1 |
                  + ???????????? + | 姓名:“约翰” |
                  | 0:Ref4631 | ?? + + ?????????????? +
                  + ???????????? + | 
                                  | 
                                  | 
                                  | 
                                  |
                                  | + ????????????????? +
                                  + ??> | (对象)|
                                      + ????????????????? +
                                      | id:1 |
                                      | 姓名:“约翰” |
                                      + ????????????????? +

  • *您已经获得了ASCII艺术金徽章* :) (3认同)