区别
在js里 object 是一种复杂类型,它由普通类型构成。
普通类型和复杂类型的往内存中存储数据的方式也有区别
普通类型的数据是存在栈中,而复杂类型的数据会存在堆中,在栈中会有存一个地址指向堆中的数据;
声明变量时计算机会把变量存到代码区,并在栈内存中生成其独立的区域
var a = 1 //在代码区创建变量a,并指向其在栈中独立的区域,将 1 变成64位浮点数存入该区域
var b = a //在代码区创建变量b,并指向其在栈中独立的区域,将 a 的值存入该区域
a = 2 //这时候改变 a 的值,只会改变 a 所对应的栈中区域的值,并不会改变 b 对应栈中的值
通过这种方式去赋值,会把值变成对象存到堆内存中
var number = new Number(1) //Number {1}
var string = 'Hello Wold'
var string2 = new String(string) //String {"Hello Wold"}
var boolean = new Boolean(false) //Boolean {false}
当值是object时,会把值存进堆内存中,并生成一个地址存进变量所对应的栈内存中
var a = [1,2,3] //在代码区创建变量a,并指向其在栈中独立的区域,将 [1,2,3] 存入堆内存中并生成一个地址放进变量a所对应的栈内存中
var b = a // 将a中存放的地址赋值给b
b[2] = 4 //因为a和b在栈内存中存放的都是同一个地址,所以改变b中的数据,a也会变
b //[1,2,4]
a //[1,2,4]
垃圾回收
未被引用的对象就是垃圾,其所占用的内存就会被计算机回收。
一般来说关掉页面其对象所占的内存就会被回收,但是ie浏览器有个bug,页面关掉后还会占用内存,这时候我们可以添加一个函数解决
window.onunload = function() { document.body.onclick = null }
浅拷贝和深拷贝
改变b不影响a这种情况就叫做深拷贝,基本类型的赋值就是深拷
一般来说复杂类型的赋值是浅拷贝
var a = [1,2,3]
var b = a
b[2] = 4
b //[1,2,4]
a //[1,2,4]
a 受到了 b 的影响所以是浅拷贝