一、栈和堆
- 栈(heap)
js中的原始值存储在栈中,因为大小固定。由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
保存在栈内存中的数据在内存中分别占有固定大小的空间,通过按值来访问。栈内存有如下特点:存储基本数据类型,按值访问,存储的值大小固定,系统自动分配和释放空间,主要是用来执行程序,空间小运行效率高,先进后出,后进先出
- 堆(stack)
先进先出,一般是对象的存储,只将对象的引用(指向地址的指针)存储在栈中,真正的对象则放在堆中。由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
引用类型都是保存在堆内存中。因为这种值的大小不固定的。实际上,引用类型的数据的地址指针是存储于栈中的,当我们想要访问引用类型的值,需要先从栈中获得对象的地址指针然后在通过地址指针找到堆中的所需要的数据。
堆内存的特点:存储引用数据类型,按引用访问,存储的值大小不定,可动态调整,手动分配和释放空间,主要用来存放对象,空间大,运行效率较低,是一种无序的存储,可根据引用直接获取。
二、对象拷贝
- 浅拷贝
仅仅只是拷贝引用(指向地址的指针)而已,即建立新的指针,但依旧指向原对象。
【示例1】:
var arrayA = [1, 2, 3, 4, 5];
var arrayB = [];
arrayA.forEach(function(e) {
arrayB.push(e);
})
var str = 'hello'
arrayA.push(str);
console.log(arrayA); // [1, 2, 3, 4, 5, "abc"]
console.log(arrayB); // [1, 2, 3, 4, 5]
注释:理解Array.forEach(function(e){ })的用法
参数:一个函数表达式,并且函数需带一个参数
使用:每次forEach都将获得数组的单个数据,并且,将这单个参数传递给上述函数作为参数,每次循环执行一次这个函数。
上述示例1,完成了拷贝,但是一旦数组内出现对象时,此拷贝方式便无法进行数组内对象深拷贝,示例如下:
【示例2】:
var arrayA = [1, 2, 3, 4, 5];
var arrayB = [];