堆和栈的基本概念和区别

基本数据类型存放在栈中,引用数据类型存放在堆中

栈内存:基本数据类型----数字(Number)、字符串(String)、布尔(Boolean)、空(Null)、未定义(Undefined)

堆内存:复合数据类型----也就是对象类型Object type,比如:Object 、Array 、Function 、Data等


栈的特点:

栈(stack):栈会自动分配内存空间,会自动释放,存放基本类型,简单的数据段,占据固定大小的空间。

所有在方法中定义的变量都是放在栈内存中,随着方法的执行结束,这个方法的内存栈也自然销毁


栈的优缺点:

优点:存取速度比堆快,仅次于直接位于CPU中的寄存器,数据可以共享;

缺点:存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。


{
    let a = new String('123')
    let b = String('123')
    let c = '123'
    // 这里对比a,b,c
    console.log(a==b)  // true
    console.log(a===b) // false
    // 因为a是引用数据类型,存放在堆内存中,b存放在栈内存中,所以他俩只是值相同,并不全等

    console.log(b==c,b===c)    // true  true
    // b和c都是存放在栈内存中,值相等,类型也相等
}

栈和堆的区别

栈区存放东西像水杯里的水,先进的后出

堆区存放的东西像水管里的水,先进的先出


栈区存放

基本数据类型是按值访问的,因为可以直接操作保存在变量中的实际值

let a = 10
let b = a    // 把a的值复制一份给b
b = 20  // 我们改变b的值,a的值没有发生变化
// b只是保存了a复制的一个分身,所以b的改变对a没有影响
console.log(a,b)  // 10 20

堆区存放

引用数据类型---对象

     let obj1 = new Object()
    obj1.name = '小胡'
    let obj2 = obj1 
// 栈区的obj1和obj2 指向的堆区的同一个对象
//(引用数据类型存储的是指针,它指向这个类型值在内存里保存的地址。)

    obj2.name = '小陈'
    // 添加属性(通过obj2添加一个属性)
    obj2.age = 18
    console.log(obj1.name)    // 小陈
    console.log(obj1.age)    // 18


引用数据类型---数组

    // 数组的是放在堆里,但变量c拿到的是一个引用地址,指向这个数组
    let c = [1,2,3]
    // 把变量c的地址索引复制给d,不是复制数据内容
    let d = c
    console.log(d)    // [1,2,3]

    // 重新给c赋值,c的地址索引发生改变,无法查看原数据
    // 等于在堆里重新放了一个新数组,c的地址索引指向了这个新数组
    c = [4,5,6]
    console.log(d)    // [1,2,3]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值