一、栈和堆
栈(stack)和堆(heap)
stack为自动分配的内存空间,它由系统自动释放;而heap则是动态分配的内存,大小也不一定会自动释放
二、数据类型
1.基本数据类型:
undefined、null、string、number、boolean、symbo(ES6)
2.引用数据类型:
Object(在JS中除了基本数据类型以外的都是对象,数据是对象,函数是对象,正则表达式是对象)
三、引用数据和基本数据类型的区别
区别:引用类型值可添加属性和方法,而基本类型值则不可以。
基本类型 (所有的操作都针对于值)
基本类型的变量是存放在栈内存(Stack)里的
基本数据类型的数据大小确定,内存空间大小可以分配
基本数据类型的值是按值访问的 var a=20;---console.log(a)
基本类型的值是不可变的
基本类型的比较是它们的值的比较
引用类型
引用类型的值是保存在堆内存(Heap)中的对象(Object)
引用类型的空间大小不一样
引用类型的值是按引用访问的 var obj={name:'赵丽颖'} console.log(obj.name)
引用类型的值是可变的
引用类型的比较是引用的比较
引用类型是存放在堆内存中的对象,变量其实是保存的在栈内存中的一个指针(保存的是堆内存中的引用地址),这个指针指向堆内存
栈内存
举个栗子:小明和小红都有各自共同的老婆……大概就这么个意思。
堆内存
举个栗子:我和美女共同租一间房,美女下班打扫了房间卫生,那我的房子也就打扫了……(皮一下真的开心)
四、深拷贝与浅拷贝
浅拷贝是指创建一个对象,这个对象有着原始对象属性值的一份精确拷贝。
如果属性是基本类型,那么拷贝的就是基本类型的值,如果属性是引用类型,
那么拷贝的就是内存地址,所以如果其中一个对象修改了某些属性,那么另一个对象就会受到影响。
深拷贝是指从内存中完整地拷贝一个对象出来,并在堆内存中为其分配一个新的内存区域来存放,并且修改该对象的属性不会影响到原来的对象。
举个栗子:
浅拷贝:(1) Object.assign的方式 (2) 通过对象扩展运算符 (3) 通过数组的slice方法 (4) 通过数组的concat方法。
深拷贝:(1) 通过JSON.stringify来序列化对象 (2) 手动实现递归的方式。