深浅拷贝(重点)(深浅拷贝是相对于引用类型来说的)
javascript的变量的存储方式:通过栈(stack)和堆(heap)
栈:自动分配内存空间,系统自动释放,里面存放的是基本类型的值和引用类型的地址
堆:动态分配的内存,大小不定,也不会自动释放。里面存放引用类型的值。
var str1 = 'abc'
var str2 = str1
str2 = 'def'
// 修改str2是str1的值不会变
var obj1 = {
name: 'obj1'
}
var obj2 = obj1
obj2.name = 'obj2'
// 修改obj2的时候obj1的值也会改变
console.log(str1, str2);
console.log(obj1, obj2);
基本类型:赋的是真正的值
var num = 10
var age = 10
console.log(num == age); // true
引用类型:赋的是引用类型的地址
var arr = [1, 2, 3]
var arr1 = [1, 2, 3]
console.log(arr == arr1); // false
浅拷贝:传的是地址
var arr1 = [1, 2, 3]
var arr2 = arr1
arr2.push(4)
console.log(arr1);
console.log(arr2);
深拷贝:传的是值
数组:
1、for循环
var arr3 = [1, 2, 3]
var arr4 = []
for (var i = 0; i < arr3.length; i++) {
arr4.push(arr3[i])
}
arr4.unshift(0)
console.log(arr3);
console.log(arr4);
2、slice()
var arr5 = [1, 2, 3]
var arr6 = arr5.slice(0)
arr6.shift()
console.log(arr5);
console.log(arr6);
3、concat()
var arr7 = [1, 2, 3]
var arr8 = arr7.concat()
arr8.pop()
console.log(arr7);
console.log(arr8);
对象的深拷贝
var obj1 = {
name: "obj1",
age: 18
}
var obj2 = {}
for (k in obj1) {
console.log();
obj2[k] = obj1[k]
}
obj2.age = 20
console.log(obj1);
console.log(obj2);