变量的解构赋值

变量的解构赋值
  数组解构赋值
    前后模式必须匹配
      后面的值是什么格式前面的变量声明就是什么格式
      后面的值是二维数组
      前面声明的变量也得是二维格式
      let [a,b,c] = ["45","56","67"];
      console.log(a,b,c) //45 56 67
    前多后少
      前面声明的变量多,后面赋值的值少,解构不成功,就相当于只声明了变量,但没有赋值,解构不成功的变量值是undefined;
      let [a,b,c] = [12,23]
      console.log(a,b,c) // 12 23 undefine
    前少后多
      省略赋值
      let [ , , c] = [45,56,67];
      console.log(c) //67
      不定参数解构赋值 使用... 叫 扩展运算符
      let [a,d,...c] = [45,56,48,68]
      console.log(c) //48 68
    (扩展运算符要写在最后面)
    带默认值
      先给默认值再解构赋值?还是先解构赋值再给默认值?
      let [x,y = (function(){console.log("你好"); return 10;})()] = [12,23]
      console.log(y)
      没有输出你好,说明不是先给默认值,而是先解构赋值,不再考虑默认值
      所以,就是解构不成功的时候,才会走默认值。解构不成功就是没有定义;
      var a = null a = [] a = {} a = "" 这都叫定义了;
      var a = undefined 这叫没有定义
      所有只有解构的时候,后面是undefined的时候,才会走默认值,否则后面给什么就赋值什么;
      let [a = 12,b] = [[],45];
      console.log(a) //[]
  对象解构赋值
    变量和属性必须同名,才可以解构赋值
    let {name,age} = {name:"王一博",age:22}
    console.log(name)//王一博
    如果解构失败,值是undefined;
    let {name,age} = {age:22};
    console.log(name); //undefined
    如果变量名跟属性名不一致
    let {name:aa,age:bb} = {name:"张三",age:23};
    console.log(aa)//张三
    前面name是属性 ,后面aa是变量,解构的机制,是对应的属性值赋值给后面的变量
  默认值
    默认值跟数组解构的默认值一样,解构成功就直接赋值,解构不成功就是没有值,或者是undefined,就走默认值
      var {x = 3} = {};
      x // 3

      var {x, y = 5} = {x: 1};
      x // 1
      y // 5

      var {x: y = 3} = {};
      y // 3

      var {x: y = 3} = {x: 5};
      y // 5

      var { message: msg = 'Something went wrong' } = {};
      msg // "Something went wrong"

  对象解构赋值的注意点
    {}前面不能没有东西 前面必须带声明变量的关键字
  等号右边在什么情况下能解构?
    等号右边的值只要带有length属性,都可以解构

字符串的解构赋值
  const [a, b, c, d, e] = 'hello';
  a // "h"
  b // "e"
  c // "l"
  d // "l"
  e // "o"

函数参数的解构赋值
  函数参数的默认值
  (带默认值的写后面 函数参数 等号左边是参数 右边是默认值 函数调用时不传参,走函数形参的默认值 ,如果传参,默认值就不走了,走实参)

   function move({x = 0, y = 0} = {}) {
  return [x, y];
  }
  move({x: 3, y: 8}); // [3, 8]
  move({x: 3}); // [3, 0]
  move({}); // [0, 0]
  move(); // [0, 0]

  function move({x, y} = { x: 0, y: 0 }) {
  return [x, y];
  }
  move({x: 3, y: 8}); // [3, 8]
  move({x: 3}); // [3, undefined]
  move({}); // [undefined, undefined]
  move(); // [0, 0]

函数作用域
  函数在调用的时候 ,会形成一个私有的作用域,在这个作用域下声明的变量和参数变量都是私有变量,外界访问不到,同时他在
  操作相同的变量时,不会操作外部的;
  形参就是赋值,没有变量提升


箭头函数
   只适用于匿名函数
  let fn = function(){} 匿名函数
  做回调函数 fn(12,funciton(){})
  匿名函数:只要不是关键字function 声明的函数都叫匿名函数

  let fn = (形参) => {函数体}
  每个函数结束的时候一定要return
  当只有一个 参数时,可以省略小括号()
  当函数体只有一行代码 且 return xxx ;可以省略花括号 let fn = x => x //传一个x return一个x

箭头函数的优势
  ·箭头函数没有this指向
  (  函数中改变this指向的方法
      1、在函数前提前赋值
      2、在函数的结尾处{}.bind(this)
      3、在函数结尾处{}.apply(this)或者是{}.call(this)
      4、箭头函数 )备注:箭头函数中的this指向当前父级
箭头函数获取参数 不能使用arguments 用...arg
箭头函数不能充当类


函数的角色
    函数可以扮演 类 普通函数 function实例
  类
  每个类身上天生有一个prototype的属性,这个属性是一个对象,里面有一个constructor的属性,属性值是类(函数)本身
  new 实例的时候其实就是调用constrctor函数

对象
  每个对象天生有一个__proto__的属性,__proto__也是一个对象,这个对象也有一个constructor属性,属性值是他的类

注意:
  object是所有对象的基类 包括window event等
  普通函数的父类是Function
  通过function定义的类,他的父类是Function
  所有实例对象的__proto__都指向父类的原型prototype

对象.属性
  首先看对象中私有的属性中有没有这个属性,有就直接用,没有就通过__proto__ 向他的父类的原型(prototype)上查找

posted @ 2019-07-08 19:55  枯桑  阅读(198)  评论(0编辑  收藏  举报