数据类型,及深拷贝

174 阅读2分钟

js有五种基本类型: string number blooen null undefined

1.javascript变量包含两种不同数据类型的值:基本类型和引用类型。

基本类型值指的是简单的数据段,包括es6里面新增的一共是有6种,具体如下:number、string、boolean、null、undefined、symbol。

引用类型值指那些可能由多个值构成的对象,只有一种如下:object。 在将一个值赋给变量时,解析器必须确定这个值是基本类型值还是引用类型值。

2.javascript的变量的存储方式:栈(stack)和堆(heap)。

栈:自动分配内存空间,系统自动释放,里面存放的是基本类型的值和引用类型的地址
堆:动态分配的内存,大小不定,也不会自动释放。里面存放引用类型的值。


而这两类数据存储分别是这样的:

a.基本类型--名值存储在栈内存中

let a = 1; 当b = a时,栈内存会开辟一个内存.所以当修改a=2时,对b并不会造成影响.因为b已经自食其力.

a.基本类型--名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值

let a={ name:'aaa' }
当b=a进行拷贝时,其实是复制的a的引用地址.而并非堆里面的值. 而当我们a[0]=1时进行数组修改时,由于a与b指向的是同一个地址,所以自然b也受了影响,这就是所谓的浅拷贝了。那,要是在堆内存中也开辟一个新的内存专门为b存放值,就像基本类型那样,岂不就达到深拷贝的效果了.
下面封装一个深拷贝的函数

function depClone(source){
    let targetObj = source.constructor === 'Array'?[]:{};
    for(var key in source){
        if(source.hasOwnproperty(key){
            if(source[key]&&typeof(source)=='Object'){
                 targetObjt[key] = source[key].constructor === Array?[]:{};
                 targetObjt[key] = deepClone(source[key])
            }else{
                 targetObjt[key] = source[key]
            }    
        }
    }
     return targetObjt
}