# JavaScript教程 - 12 对象和数组补充

下面对数组和对象的一些内容做一下补充。

# 12.1 内存结构与拷贝

# 1 数组内存结构

数组是引用类型的,所以下面的代码:

let numbers = [1, 2, 3, 4, 5];
1

在内存中的结构是这样的:

numbers 变量是存储在栈中的,右边的数组值是存储在堆中的,栈中存储堆中的地址。


再看一段代码:

int [] numbers = new int[]{1, 2, 3, 4, 5};
numbers = [1, 2, 3];
1
2

上面的代码,重新将一个数组赋值给 numbers,内存结构如下:

numbers 被赋值为一个新的数组,那么存储的是新数组的地址,numbers 与新的数组建立关系,与原来的数组断开联系了。

# 2 浅拷贝

上面使用 slice() 拷贝数组,是浅拷贝,浅拷贝就是只复制一层。

举个栗子:

let persons = [{'name':'doubi'}, {'name':'niu'}];
let copyPersons = persons.slice();
1
2

内存结构如下:

当复制数组后,只是复制第一层,也就是数组中的内容。

所以此时两个数组指向的是相同的对象,修改数组会影响另一个数组:

console.log(persons[0] === copyPersons[0]);  // true

persons[0].name = 'shabi';
console.log(copyPersons[0].name);  // shabi
1
2
3
4

# 3 深拷贝

深拷贝就是所有的层都会复制,所以深拷贝内存结构如下:

内容未完......