Javascript高阶学习笔记
1.深浅拷贝
浅拷贝
首先浅拷贝和深拷贝只针对引用类型
浅拷贝:拷贝的是地址
常见方法:
- 拷贝对象:Object.assgin() / 展开运算符 {...obj} 拷贝对象 
- 拷贝数组:Array.prototype.concat() 或者 [...arr] 
深拷贝
首先浅拷贝和深拷贝只针对引用类型
深拷贝:拷贝的是对象,不是地址
常见方法:
- 通过递归实现深拷贝 
- lodash/cloneDeep 
2.处理this
普通函数
普通函数的调用方式决定了 this 的值,即【谁调用 this 的值指向谁】
箭头函数
箭头函数中的 this 与普通函数完全不同,也不受调用方式的影响,事实上箭头函数中并不存在 this !箭头函数中访问的 this 不过是箭头函数所在作用域的 this 变量。
3.改变this指向
call
使用 call 方法调用函数,同时指定函数中 this 的值,使用方法如下代码所示:
<script>
  // 普通函数
  function sayHi() {
    console.log(this);
  }
  let user = {
    name: '小明',
    age: 18
  }
  let student = {
    name: '小红',
    age: 16
  }
  // 调用函数并指定 this 的值
  sayHi.call(user); // this 值为 user
  sayHi.call(student); // this 值为 student
  // 求和函数
  function counter(x, y) {
    return x + y;
  }
  // 调用 counter 函数,并传入参数
  let result = counter.call(null, 5, 10);
  console.log(result);
</script>总结:
- call方法能够在调用函数的同时指定- this的值
- 使用 - call方法调用函数时,第1个参数为- this指定的值
- call方法的其余参数会依次自动传入函数做为函数的参数
apply
使用 call 方法调用函数,同时指定函数中 this 的值,使用方法如下代码所示:
<script>
  // 普通函数
  function sayHi() {
    console.log(this)
  }
  let user = {
    name: '小明',
    age: 18
  }
  let student = {
    name: '小红',
    age: 16
  }
  // 调用函数并指定 this 的值
  sayHi.apply(user) // this 值为 user
  sayHi.apply(student) // this 值为 student
  // 求和函数
  function counter(x, y) {
    return x + y
  }
  // 调用 counter 函数,并传入参数
  let result = counter.apply(null, [5, 10])
  console.log(result)
</script>总结:
- apply方法能够在调用函数的同时指定- this的值
- 使用 - apply方法调用函数时,第1个参数为- this指定的值
- apply方法第2个参数为数组,数组的单元值依次自动传入函数做为函数的参数
bind
bind 方法并不会调用函数,而是创建一个指定了 this 值的新函数,使用方法如下代码所示:
<script>
  // 普通函数
  function sayHi() {
    console.log(this)
  }
  let user = {
    name: '小明',
    age: 18
  }
  // 调用 bind 指定 this 的值
  let sayHello = sayHi.bind(user);
  // 调用使用 bind 创建的新函数
  sayHello()
</script>注:bind 方法创建新的函数,与原函数的唯一的变化是改变了 this 的值。
Javascript高阶学习笔记
        http://localhost:8090//archives/javagao-jie-xue-xi-bi-ji