基本类型、引用类型
基本类型值(数值、布尔值、null和undefined):指的是保存在栈内存中的简单数据段;
引用类型值(对象、数组、函数、正则):指的是那些保存在堆内存中的对象,变量中保存的实际上只是一个指针,这个指针指向内存中的另一个位置,由该位置保存对象。
注意基本类型和引用类型的区别:
var a = 1
var b = a
a = 2
b = 1//不改变b的值
var obj = {age : 100 }
var obj2 = obj
obj.age = 200
obj2.age = 200 //引用类型 对象的名称可以看作是指向它真实内容的地址
函数的参数传递
对象浅拷贝和深拷贝
浅复制只复制一层对象的属性,而深复制则递归复制了所有层级。
- 对于基本数据类型,浅复制是对值的复制,对于对象来说,浅复制是对对象地址的复制,并没有开辟新的栈,也就是复制的结果是:两个对象指向同一块内存地址,修改其中一个对象的属性,则另一个对象的属性也会改变。
- 而深复制则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。
//浅拷贝
var obj = {
age: 100,
friend: {
name: 'ruoyu',
sex: 'male',
child: {
name: 'abc'
}
}
}
function shallowCopy(obj){
var newObj ={}
for(var key in obj){
if(obj.hasOwnProperty(key)){
newObj[key] = obj[key]
}
}
return newObj
}
var obj2 = shallowCopy(obj)
//深拷贝
var obj = {
age: 100,
friend: {
name: 'ruoyu',
sex: 'male',
child: {
name: 'abc'
}
}
}
function deepCopy(obj){
var newObj ={} //新开辟一片空间,名字叫做newObj
for(var key in obj){
if(obj.hasOwnProperty(key)){
if(typeof obj[key] === 'number' || typeof obj[key] === 'boolean' || typeof obj[key] === 'string' || obj[key] === undefined || obj[key] === null){
newObj[key] = obj[key]
}else{
newObj[key] = deepCopy(obj[key])
}
}
}
return newObj
}
var obj3 = deepCopy(obj)