美文网首页
7-变量解构赋值-对象

7-变量解构赋值-对象

作者: 早起的鸟儿 | 来源:发表于2019-11-01 15:33 被阅读0次

解构不仅可以用于数组,还可以用于对象。

一、变量名与属性名相同时:
let {b,a,c}  = {a:1,b:2,c:3};  //次序不同,不影响解构赋值
console.log(a,b,c)     //1 2 3
let {a,b,c}  = {arr:1,b:2,c:3};   //变量名与属性名不相同
console.log(a,b,c)   //undefined 2 3

注意点:对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值

二、变量名与属性名不同时(指的是左侧部分):

如果变量名与属性名不一致,必须写成下面这样。

let { first: f, last: l } = { first: 'hello', last: 'world' };
console.log(f);    // 'hello'
console.log(l);    // 'world'

这实际上说明,对象的解构赋值是下面形式的简写

var { foo: foo, bar: bar } = { foo: "aaa", bar: "bbb" };

也就是说,对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。

var { foo: baz } = { foo: "aaa", bar: "bbb" };
baz // "aaa"
foo // error: foo is not defined

上面代码中,foo是匹配的模式,baz才是变量。真正被赋值的是变量baz,而不是模式foo。

注意,采用这种写法时,变量的声明和赋值是一体的。对于let和const来说,变量不能重新声明,所以一旦赋值的变量以前声明过,就会报错。

let foo;
let {foo} = {foo: 1}; // SyntaxError: Duplicate declaration "foo"

let baz;
let {bar: baz} = {bar: 1}; // SyntaxError: Duplicate declaration "baz"

上面代码中,解构赋值的变量都会重新声明,所以报错了。不过,因为var命令允许重新声明,所以这个错误只会在使用let和const命令时出现。如果没有第二个let命令,上面的代码就不会报错。

let foo;
({foo} = {foo: 1}); // 成功

let baz;
({bar: baz} = {bar: 1}); // 成功

上面代码中,let命令下面一行的圆括号是必须的,否则会报错。因为解析器会将起首的大括号,理解成一个代码块,而不是赋值语句。

三、嵌套结构的对象
var obj = {
    arr:[
        111,
        {
            brr:222
        }
    ]
}

let {arr:[x,{brr}]}  = {arr:[111,{brr:222}]}

console.log(x,brr)   //111 222
四、默认值
let { a = true } = {}
console.log(a);    //true

let { a = true } = { a: false }
console.log(a);    //false

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

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

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

默认值生效的条件是,对象的属性值严格等于undefined(左侧默认值优先级高);打印左侧默认值
默认值不生效的条件是,对象的属性值严格不等于undefined(左侧默认值优先级低);打印右侧值

var {x = 3} = {x: undefined};   //生效的情况
x // 3

var {x = 3} = {x: null};   //不生效的情况
x // null

总结:如果右侧对象的值是undefined那么取左侧的默认值;如果不是undefined则取右侧的值。

五、解构失败
let {a,b} = undefined
console.log(a)  //报错

let {a,b} = null
console.log(a)  //报错

let {a,b} = 1
console.log(a)  //undefiend

let {a,b} = "1"
console.log(a)  //undefiend

let {a,b} = true
console.log(a)  //undefiend

相关文章

  • 解构赋值

    解构赋值 数组的解构赋值 嵌套,默认值,展开符 对象的解构赋值 对象解构赋值的本质与简写 对象解构的模式与变量 对...

  • 解构赋值

    解构赋值:ES6 中新增了变量赋值的方式,从数组和对象中提取值,对变量进行赋值。 单独赋值给变量,解构赋值。 解构...

  • es6中的解构赋值

    es6中的对象解构赋值 对象的解构赋值,新变量名字要和对象中的变量名一致 数组中的解构赋值,数组是依次赋值的 字符...

  • ES6解构赋值常用操作

    解构对象 无声明赋值 交换变量 解构数组

  • 变量的解构赋值

    数组的解构赋值: 解构,就是从数组和对象中提取值,然后对变量进行赋值 解构赋值: 解构不成功,变量的值就等于und...

  • ES6的解构赋值

    一、前言 什么是“解构赋值”呢?就是从数组或者对象中取值,对变量进行赋值,这就是变量的解构赋值。 二、数组的解构赋...

  • 名词

    1 解构: 从数组或对象中提取值,给变量赋值这被称为解构解构赋值的变量都会重新声明解构赋值的规则是,只要等号右边的...

  • ECMAScript6偷懒版

    let const 变量的解构赋值 解构:按照一定模式,从数组和对象中提取值,对变量进行赋值。 数组 对象 数组和...

  • Z03_变量的解构赋值

    变量的解构赋值 数组的解构赋值 ES 中从数组和对象之中提取数值,对变量进行赋值,这个过程称为解构 1. 对于 S...

  • 解构赋值

    解构赋值:为变量赋值可以从数组或对象属性值提取赋值

网友评论

      本文标题:7-变量解构赋值-对象

      本文链接:https://www.haomeiwen.com/subject/wzgcmctx.html