JS 栈,堆,常量池

基本数据类型

1. 基本数据类型一般存放在中,包括:String, Number, Boolean, Undefined, Null, Symbol。

2. 基本数据类型的特点: 占用空间小,大小固定, 通过按值来访问。

3. typeOf(null) == Object, null是Object类型,为什么null存放在栈而不是堆中?具体解答参考: https://2ality.com/2013/10/typeof-null.html

引用数据类型

1. 一般存放在堆中,包括: Object, Function, Array, RegExp...

2. 引用数据类型占据空间大、大小不固定。引用数据类型在栈中存储了该对象所在的堆内存地址,当需要引用值时,首先获取栈中过得内存地址,然后才能够堆内存中获取该值。

图解

 

问题1

const 定义的值能改变吗?

解答: 1. 当使用const定义一个基本类型的数据时,其值不能改变

   2. 当使用const定义一个对象的时候, 它的地址不能改变,但是值是可以改变的

举例说明:

const person={};
person.name="ABC";
//上面两行代码并不会改变person的值,这个值指的是该对象存储在栈中的内存地址,也可以说是指针。person.name只是改变了堆里面的值。
person={}
//这样就不对了,会抛出"TypeError: Assignment to constant variable."。

问题2

var obj1 = {name: "ABC"};
var obj2 = obj1
obj2.age=obj1

obj1=? obj2=?
//p1 = {name: "ABC", age=1}; 
//
p2 = {name: "ABC", age=1};
//
这样就一目了然了,var p2 = p1, 其实执行的是引用类型的复制操作,只是把p1的内存地址给了p2, p1 p2 有相同的内存地址,在堆内存中指向的是同一个Object。

猜你喜欢

转载自www.cnblogs.com/dxh1015/p/12008977.html
今日推荐