1. 基础类型与引用类型

  1. // 基础类型
  2. let a = 3
  3. let b = a
  4. a = 13
  5. console.log(b) // 3
  6. // 引用类型
  7. let arr1 = [3, 1, 8]
  8. let arr2 = arr1
  9. arr1[0] = 13
  10. console.log(arr2[0]) // 13

image.png

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

image.png

  • 参数传递 ```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

}