JS的栈内存和堆内存

113 阅读2分钟

一:栈内存和堆内存介绍

1.存储:

  • 栈内存:存放基本类型(Undefined,Null,Boolean,Number,String)以及引用类型值的地址,一般存储的大小是已知的
  • 堆内存:存放引用类型值,一般存储的大小是未知的,需要动态分配

2.图示解析

image.png

二:应用

1.const定义的值能够更改?

答:const定义的基本类型的值不可以改,但是定义的对象,里面的属性和方法可以改

const a = 1;
a = 2;
//此时报错

image.png

const b = {}
b.name ="hello"
console.log(b) //输出结果是{name:'hello'}

image.png

2.Js的浅拷贝和深拷贝

  1. 如何区分深拷贝与浅拷贝?

    假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,如果B没变,那就是深拷贝。

  2. 举个例子 如图所示:当a修改了,b也跟着做相应的修改,这就是浅拷贝 image.png

  3. 实现深拷贝的方法 方法一: JSON.stringify() 和JSON.parse()

缺点:不可以拷贝undefined,function等类型

var obj = {a: 1,b:2,c:3}
m = obj
// 输出的m为:{a: 1, b: 2, c: 3}
// 输出的obj为{a: 1, b: 2, c: 3}
obj.a = 'hello'
//此时obj和m都为,这是浅拷贝{a: 'hello', b: 2, c: 3}

var objString = JSON.stringify(obj)
var obj2 = JSON.parse(objString)
obj.b = 'word'
//输出的obj为{a: 'hello', b: 'word', c: 3}
//输出的obj2为{a: 'hello', b: 2, c: 3}
//此时为深拷贝

方法二: Object.assign(target,source)

缺点:只能拷贝一层嵌套的,多层不可以

 var obj1 = {
    a: 1,
    b: 2,
    c: ['a','b','c']
}
var obj2 = Object.assign({}, obj1);
obj2.c[1] = 5;
console.log(obj1.c); // ["a", 5, "c"]
console.log(obj2.c); // ["a", 5, "c"]

方法三: 递归拷贝

function deepCopy( source ) { 
    if (!isObject(source)) return source; //如果不是对象的话直接返回 
    let target = Array.isArray( source ) ? [] : {} //数组兼容 
    for ( var k in source ) { 
        if (source.hasOwnProperty(k)) { 
            if ( typeof source[ k ] === 'object' ) { 
                target[ k ] = deepCopy( source[ k ] ) 
            } else { 
                target[ k ] = source[ k ] 
            } 
         } 
    } 
     return target 
 } 
 function isObject(obj) { 
     return typeof obj === 'object' && obj !== null 
 }