function add(a){
a++
}
var a=3
add(a)
add(a)
console.log(a);
函数里面形参赋值不回影响到外面的值打印出来为3
function obj(a){
a={n:2}
}
var a={n:3}
obj(a)
console.log(a)
复杂类型时也一样不会影响,打印出来{n:3}
function increase(a) {
a.n = 2;
}
var a = { n: 1 };
increase(a);
console.log(a);//{n:2}
这时的值改变了是应为形参的地址和外面值的地址指向的是同一个地址所以值会被改变。
let obj={
a:1,
b:2,
c:3
}
let obj2=obj
obj2.b=3
console.log(obj)//{a: 1, b: 3, c: 3}
由于复杂数据类型赋值时,并不是把真正的数据给另外一个值,而是有一个指针指向一个地址,这个地址里面就是储存的值,所以就导致了当一个对象的值改变时,另外一个对象的值也会被改变。这个时候我们就可以使用深拷贝和浅拷贝解决这种问题。
1.浅拷贝
1.1for循环遍历
let obj={
a:1,
b:2,
c:3
}
const newObj={}
for(var i in obj){
newObj[i]=obj[i]
}
newObj.b=3
console.log(obj,'obj',newObj,'newObj')//{a: 1, b: 2, c: 3} 'obj' {a: 1, b: 3, c: 3} 'newObj'
个人理解通过for循环是进行赋值而不是让对象指向指针,所以改变值时只是改变了newObj的值达到浅拷贝的目的。
1.2扩展运算符
let newObj={...obj}
newObj.a=2
console.log(obj,'obj',newObj,'newObj')//{a: 1, b: 2, c: 3} 'obj' {a: 2, b: 2, c: 3} 'newObj'
2.深拷贝当一个复杂类型里面嵌套了另外一个复杂类型,如
let newObj={...obj}
newObj.d.e=2
console.log(obj)//a: 1 b: 2 c: 3 d: {e: 2, f: 5}
这时就需要使用深拷贝了
2.1递归
const newObj = {}
function deepCopy(newObj, obj) {
for (let i in obj) {
// 判断是否是一个复杂类型的数据
if (Object.prototype.toString.call(obj[i]) === '[object Object]') {
newObj[i] = {}
deepCopy(newObj[i], obj[i])
} else if (Object.prototype.toString.call(obj[i]) === '[object Array]') {
newObj[i] = []
deepCopy(newObj[i], obj[i])
} else {
newObj[i] = obj[i]
}
}
}
deepCopy(newObj, obj)
2.2通过JSON的格式转换,缺点是如果对象中有值为undefined则无法拷贝。