解构赋值

对象的解构赋值用于从一个对象取值,相当于将目标对象自身的所有可遍历的(enumerable)、但尚未被读取的属性,分配到指定的对象上面。所有的键和它们的值,都会拷贝到新对象上面

ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构( Destructuring )。

 

为什么要用解构赋值?

  想从对象中取出名字为指定名称的属性,使用 for in 加 if 判断再赋值很麻烦,并且若有一个 嵌套的数据结构 则需要遍历寻找所需要而挖掘整个结构,而解构赋值可以直接获取:

  ex:

    对象

     let { x, y, ...z }=  { x: 1, y: 2, a: 3, b: 4 }

     console.log(x, y, z)  => 1,  2,  { a: 3, b: 4 }

    z是结构赋值所在对象,获取等号右边所有尚未读取的键,连同值一起拷贝过来

     数组

     var [a, b, c] =  [1, 2, 4]; // a = 1, b = 2, c = 4

     只要两边的模式相同,就能正确地赋值

  ex:

   let [a, [b,c]] = [1,[2,3]];// a = 1, b = 2, c = 3

   let [, , c] = [1,2,3];// c = 3

   let [c] = [1,2,3];// c = 1

   let [a,c] = [1]; // a = 1, c: undedined

   默认值可以引用解构赋值的其他变量,但该变量必须已经声明:

    let [x = 1, y = x] = []; // x=1; y=1

    let [x = 1, y = x] = [2]; // x=2; y=2

    let [x = 1, y = x] = [1, 2]; // x=1; y=2

    let [x = y, y = 1] = []; // ReferenceError

 

   由于解构赋值要求等号右边是一个对象或数组,所以如果等号右边是undefinednull,就会报错,因为它们无法转为对象。  

   ex:

     报错:

      let { ...z } = null; // 运行时错误

     let { ...z } = undefined; // 运行时错误

     let [foo] = NaN

     let [foo] = undefined

 

    字符串:字符串被转换成了一个类似数组的对象

      1.  let [a,b,c] = 'abc';

        console.log(a,b,c);// a=a,b=b,c=c

 

      2. let {length:len} = 'hello';

        console.log(len);// 5


    数值和布尔值:(如果等号右边是数值和布尔值,则会先转为对象)

      
let {toString: s} = 111;
      s === Number.prototype.toString // true
       let {toString: s} = true;
       s === Boolean.prototype.toString // true

 

posted @ 2021-07-23 11:13  扶不起的阿斗。  阅读(428)  评论(0编辑  收藏  举报