【js进阶】-内存管理

一、数据类型

1.1、分类
  • 基本数据类型

字符串类型(String)、数字类型( Number)、布尔类型( Boolean)、空( Null)、未定义( Undefined)Symbol类型,总共6种

注:Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值。

  • 引用数据类型

引用数据类型就只有Object类型,这包括数组(array)、对象(object)、函数(function)等

1.2、常见面试题
  1. 如何理解值类型和引用类型?

    :值类型占用的空间大小固定,保存在栈里面,操作的是值本身;引用类型占用空间不固定,保存在堆中,操作的是指向对象的一个指针

  2. Null、Undefined、{} 之间的区别?

    描述数据类型强转布尔值
    null是一个对象指针,只不过就是没有指向任何对象Object
    undefinedundefined是一个空值Undefined
    {}是一个对象指针,指向空对象Object

二、栈、堆内存

2.1、概念

在js引擎中对变量的存储主要有两种位置,堆内存栈内存

栈内存:主要用于存储各种基本类型的变量,包括Boolean、Number、String、Undefined、Null,以及对象变量的指针,这时候栈内存给人的感觉就像一个线性排列的空间,每个小单元大小基本相等,它内部遵循先进后出;如下图:a 最先进栈,最后出栈

在这里插入图片描述

堆内存:主要负责像对象Object这种变量类型的存储,这种引用类型的数据会在堆内存中开辟出一片内存空间,并且会有一个十六进制的内存地址,在栈内存中声明的变量的值就是十六进制的内存地址如下图
在这里插入图片描述
在这里插入图片描述

注意:函数也是引用数据类型,我们定一个函数的时候,会在堆内存中开辟空间,会以字符串的形式存储到堆内存中去,如下图:

在这里插入图片描述

注意(两者在存储大小方面的区别)

栈内存中的变量一般都是已知大小或者有范围上限,算作一种简单存储。
堆内存存储的对象类型数据对于大小这方面,一般都是未知的

2.2、常见面试题

输出结果是多少?

var a = {n: 1};
var b = a;
a.x = a = {n: 2};

console.log(a.x)     // undefined
console.log(b.x)   // { n:2}

代码解析
1、第一步,var变量提升,在栈中生命两个变量a,b,地址分别为1x0001和1x0002
2、第二步,在堆中开辟空间1,存储对象{n:1},赋值给变量a,a的指针指向空间1
3、然后b引用了a,就是b的指针也指向了空间1
4、这里对对象属性的操作是优先于复制操作的,也就是说要先执行a.x,然后再继续从右往左执行,那么就是先在堆空间1中声明属性x,此时x的值为undefined
5、然后执行{n:2},就是在堆中开辟空间2{n:2},然后赋值给a,a的指针指向空间2
6、a.x = a 这个时候要分清楚两个变量的指针是不一样的,a.x的指针是指向空间1,可以理解a.x就是b.x,而a的指针是指向空间2的,此时赋值,就是空间1的属性x赋值为空间2的值{n:2}
7、所以空间1里的值是{n:1,x:{n:2}},空间2的值{n:2}
a的指针指向空间2,b的指针指向空间1

小结:上面面试题中有个知识点就是要属性的赋值"."操作优先级比“=”要高,这点要记住

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ronychen’s blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值