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
}
复制代码