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 |
| 姓名:“约翰” |
+ ????????????????? +