13前端成长日记-普通类型和复杂类型的区别

224 阅读2分钟

区别

在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 的影响所以是浅拷贝