1.栈 堆 队列 (三种数据结构)
栈
可以简单理解为数组;特点:先进后出
js中实现入栈:push() 出栈pop()
堆
可以理解为对象key-value,取数不需要顺序,按key可以取出值
队列
主要是事件循环机制中涉及,特点:先进先出
2.变量对象与基础数据类型
Jst的执行上下文生成之后,会创建一个叫做变量对象的特殊对象。js的基础数据类型往往都会保存在变量对象中。
严格意义上来说,变量对象也是存放于堆内存中,但是由于变量对象的特殊职能,我们在理解时仍然需要将其于堆内存区分开来。
基础数据类型都是一些简单的数据段,js中有5中基础数据类型,分别是Undefined、Null、Boolean、Number、String。
基础数据类型都是按值访问,因为我们可以直接操作保存在变量中的实际的值。
3.引用数据类型与堆内存
JS的引用数据类型,比如数组Array,它们值的大小是不固定的。引用数据类型的值是保存在堆内存中的对象。
JavaScript不允许直接访问堆内存中的位置,因此我们不能直接操作对象的堆内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。因此,引用类型的值都是按引用访问的。这里的引用,我们可以粗浅地理解为保存在变量对象中的一个地址,该地址与堆内存的实际值相关联。
这里通常会涉及到深浅拷贝
4.深浅拷贝
浅拷贝:针对引用类型;拷贝的只是引用,修改拷贝后的数据会影响原来的数据,使得数据不安全。这种拷贝方式也称为浅拷贝。
浅拷贝方式:直接赋值,Object.assign(),Array.prototype.concat(),Array.prototype.slice()
深拷贝:拷贝后会生成一份新的数据,修改拷贝后的数据不会影响原来的数据。这种拷贝方式也称为深拷贝。拷贝基础类型属于深拷贝
深拷贝方式: link
1)JSON.stringify 将js对象序列化(JSON字符串),再使用JSON.parse来反序列化(还原)js对象 但需要注意这种方式会将
a.时间对象序列化为字符串
b.RegExp、Error对象,序列化的结果将只得到空对象
c.obj里有function,undefined,序列化的结果丢失
d.NaN、Infinity和-Infinity,序列化的结果会变成null
e.只能序列化对象的可枚举的自有属性,例如 如果obj中的对象是有构造函数生成的, 则使用该方式深拷贝后,会丢弃对象的constructor;
2)递归(同上)
3)Object.created();
// Object.create()具体使用方法
var obj = {name:'lisi'};
var newObj = Object.create(obj);
//newObj的原型(proto)指向obj,具备了obj的属性和方法
参考 这里