深入理解js的存储形式

73 阅读1分钟

一.什么是堆?什么是栈?

栈:计算机为原始类型开辟的一块内存空间 string number...
堆:计算机为引用类型开辟的一块内存空间 object 

二.例子

var a = 'TOM' 
var b = a 
b = 'TOM2' 
console.log(a,b)   //TOM TOM2

var c = {key:1}
var d = c 
d.key = 2 
console.log(c,d)  //{key:2} {key:2}

三.什么是深浅拷贝

深拷贝和浅拷贝,简单来说就是:
    假设B复制了A,当修改A时,如果B也跟着变了,说明这是浅拷贝
    如果B没有变,则是深拷贝
实现浅拷贝的方式:
    遍历:使用for(i in 对象){}遍历对象并赋值 
    Object.create(对象),返回浅拷贝后的值。会把值放在prototype里面
实现深拷贝的方式:
    使用遍历回调的方式 
    使用JSON.parse,JSON.stringify
        原理:将object转为string类型,这样就是在栈中开辟的空间
        再将string类型转为object

四.深浅拷贝例子

var obj = {
    a:'1',
    b:{
        a:'22',
        b:'33'
    },
    c:['111','222']
}
遍历浅拷贝:
    function copyObj(newObj){
        var obj = {} 
        for(var i in newObj){
            obj[i] = newObj[i]
        }
        return obj
    }
    var cloneObj = copyObj(obj);
    cloneObj.b.a='aaa' 
    console.log(obj);     //b.a = 'aaa'
    console.log(cloneObj);  //b.a = 'aaa'
使用Object.create方法实现浅拷贝:
    var cloneObj = Object.create(obj);
    cloneObj.b.a='aaa' 
    console.log(obj);     //b.a = 'aaa'
    console.log(cloneObj);  //b.a = 'aaa'
遍历深拷贝:
    function deepClone(newObj,endObj){
        var obj = endObj || {};
        for(var i in newObj){
            if(typeof(newObj[i])==='object'){
                obj[i] = newObj[i].constructor===Array?[]:{}
                deepClone(newObj[i],obj[i])
            }else{
                obj[i] = newObj[i]
            }
        }
        return obj
    }
    var cloneObj = deepClone(obj);
    cloneObj.b.a='aaa' 
    console.log(obj);     //b.a = '22'
    console.log(cloneObj);  //b.a = 'aaa'
通过JSON.parse,JSON.stringify实现深拷贝:
    var cloneObj = JSON.parse(JSON.stringify(obj)) 
    cloneObj.b.a='aaa' 
    console.log(obj);     //b.a = '22'
    console.log(cloneObj);  //b.a = 'aaa'