1. 基础类型与引用类型
// 基础类型
let a = 3
let b = a
a = 13
console.log(b) // 3
// 引用类型
let arr1 = [3, 1, 8]
let arr2 = arr1
arr1[0] = 13
console.log(arr2[0]) // 13
let a = 1
let b = 1
console.log(a === b) // true
let obj1 = {a: 1, b: 2}
let obj2 = {a: 1, b: 2}
console.log(obj1 === obj2) // false
[] === [] // false
null === null // true
(function(){}) === (function(){}) // false
function sum1(a, b) {
return a + b
}
let sum2 = sum1
console.log(sum2(3, 5)) // 8
- 参数传递 ```javascript function incNum(n) { // 相当于内部 let n = a n++ } let a = 10 incNum(a) console.log(a) // 10
function incObj(obj) { // 相当于内部 let obj = o // 0x00001 obj.n++ } let o = {n: 10} // o = 0x0001 incObj(o) console.log(o.n) // 11
<a name="Lku3g"></a>
# 2. 浅拷贝
- **深拷贝和浅拷贝是只针对****Object和Array这样的引用数据类型****的**。
```javascript
let arr1 = [1, 4, 6]
let arr2 = shallowCopy(arr1)
console.log(arr2) // [1, 4, 6]
console.log(arr1 === arr2) // false
let obj1 = {a: 2, b: 4}
let obj2 = shallowCopy(obj1)
console.log(obj2) // {a: 2, b: 4}
console.log(obj1 === obj2) // false
// 浅拷贝
function shallowCopy(src) {
// 用Array.isArray()来判断src是数组还是对象
// 不能用typeof来判断, 因为用typeof来判断数组也是object类型
let result = Array.isArray(src) ? [] : {}
for(let key in src) {
result[key] = src[key]
}
return result
}
// 浅拷贝数组简单写法
// const shallowCopy = arr => arr.map(v => v)
3. 深拷贝
- 浅拷贝的局限:浅拷贝只拷贝一层 ```javascript / 当给定的数组或者对象内部出现嵌套的时候 浅拷贝就达不到完全复制为两个独立个体的目的 非嵌套部分完全独立复制,而嵌套部分公用 /
let arr1 = [1, 4, 6, [3, 5]]
let arr2 = shallowCopy(arr1)
console.log(arr2) // [1, 4, 6, [3, 5]]
console.log(arr1 === arr2) // false
arr1[3][1] = 0
console.log(arr1) // [1, 4, 6, [3, 0]]
console.log(arr2) // [1, 4, 6, [3, 0]]
// 浅拷贝函数 function shallowCopy(src) { let result = Array.isArray(src) ? [] : {} for(let key in src) { result[key] = src[key] } return result }
- **深拷贝**
```javascript
/*
经过深拷贝的数组完全独立复制
*/
let arr1 = [1, 2, [3, 4]]
let arr2 = deepCopy(arr1)
console.log(arr2) // [1, 2, [3, 4]]
console.log(arr1 === arr2) // false
arr1[2][0] = 0
console.log(arr1) // [1, 2, [0, 4]]
console.log(arr2) // [1, 2, [3, 4]]
// 深拷贝函数
function deepCopy(src) {
// 创建空的数组或者对象
let result = Array.isArray(src) ? [] : {}
for(let key in src) {
// 判断属性或者元素是基础类型还是引用类型
if(typeof src[key] === 'object' && src[key] != null) {
result[key] = deepCopy(src[key])
} else {
result[key] = src[key]
}
}
return result
}