- 栈(stack)和堆(heap)
栈为自动分配的内存空间,它由系统自动释放;而堆则是动态分配的内存,大小不定也不会自动释放。
- 基本类型和引用类型
基本类型:存放在栈内存中的简单数据段,数据大小确定,内存空间大小可以分配。
5种基本数据类型有Undefined、Null、Boolean、Number 和 String,它们是直接按值存放的,所以可以直接访问。
引用类型:存放在堆内存中的对象,变量实际保存的是一个指针,这个指针指向另一个位置。每个空间大小不一样,要根据情况开进行特定的分配。
当我们需要访问引用类型(如对象,数组,函数等)的值时,首先从栈中获得该对象的地址指针,然后再从堆内存中取得所需的数据。
3.语法
浅拷贝:Object.assign(target, ...sources)
深拷贝:JSON.parse(JSON.stringify(...sources))
浅拷贝是拷贝一层,深层次的对象级别的就拷贝引用;深拷贝是拷贝多层,每一级别的数据都会拷贝出来
4.例子
ajx的例子:
const obj1 = {
name: "haha",
info: { age: 1, wrok: "码农" },
array: [1, 2, 3],
}
/***
* 浅拷贝
* 1.string int boolean不会改变原来的值(例子中 修改obj2的name obj1中name不会改变)
* 2.对象,数组 会改变原来的值(例子中 修改obj2的age obj1中age也会改变)
*/
const obj2 = Object.assign({}, obj1);
obj2.name = "xixi";
obj2.info.age = 22;
ajx.log.print(obj1 === obj2);//false
ajx.log.print(obj1.name === obj2.name);//false
ajx.log.print(obj1.name);//haha
ajx.log.print(obj2.name);//xixi
ajx.log.print(obj1.info.age);//22
ajx.log.print(obj2.info.age);//22
ajx.log.print(obj1.info === obj2.info);//true
ajx.log.print(obj1.info.age === obj2.info.age);//true
ajx.log.print(obj1.array === obj2.array);//true
/***
* 深拷贝
*/
const obj3 = JSON.parse(JSON.stringify(obj1));
obj3.name = "heihei";
obj3.info.age = 24;
ajx.log.print("aaa")//aaa
ajx.log.print(obj1 === obj3);//false
ajx.log.print(obj1.name === obj3.name);//false
ajx.log.print(obj1.name);//haha
ajx.log.print(obj3.name);//heihei
ajx.log.print(obj1.info.age);//22
ajx.log.print(obj3.info.age);//24
ajx.log.print(obj1.info === obj3.info);//false
ajx.log.print(obj1.info.age === obj3.info.age);//false
ajx.log.print(obj1.array === obj3.array);//false