内存空间详解

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的属性和方法

参考 这里

JSRUN前端笔记, 是针对前端工程师开放的一个笔记分享平台,是前端工程师记录重点、分享经验的一个笔记本。JSRUN前端采用的 MarkDown 语法 (极客专用语法), 这里属于IT工程师。