const {student:name} = {student:"法外狂徒"}
console.log(student)
console.log(name)
A: 法外狂徒
B: name
C: undefined
D: ReferenceError
对象的结构赋值是以下形式的简写:
var {student:name, age:num} = {student:"小明", age:18}
也就是说,对象的结构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者
上面的代码中,真正被赋值的是变量name,而不是模式student
结构赋值的变量都会重新声明
let student;
let {student} = {student:1}; // SyntaxError: Duplicate declaration "student"
注意,采用这种写法时,变量的声明和赋值是一体的。对于let和const而言,变量不能重新声明,所以一旦赋值的变量以前声明过,就会报错
let student;
({student} = {student: 1}); // 成功
因为var命令允许重新声明,所以这个错误只会再使用let和const命令出现。如果没有第二个let命令,代码就不会报错
var {x = 3} = {};
x // 3
var {x, y = 5} = {x: 1};
x // 1
y // 5
var { message: msg = "Something went wrong" } = {};
msg // "Something went wrong"
对象的解构也可以指定默认值
var {x = 3} = {x: undefined};
x // 3
var {x = 3} = {x: null};
x // null
上面的代码中,如果x属性等于null,就不严格等于undefined,导致默认值不会生效
var {foo} = {bar: 'baz'}
foo // undefined
如果解构失败,变量的值等于undefined
// 报错
var {foo: {bar}} = {baz: 'baz'}
如果解构模式
如果解构模式是嵌套对象,而且子对象所在的父属性不存在,那么将会报错
上面代码中,等号左边对象的foo属性对应一个子对象。该子对象的bar属性解构时会报错。原因很简单,因为foo这是等于undefined,再取子属性就会报错
// 错误的写法 //正确的写法
var x;
{x} = {x: 1}; ({x} = {x:1})
// SyntaxError: syntax error
如果将一个已经声明的变量用于解构赋值,必须非常小心
上面的代码写法会报错,因为JavaScript引擎会将{x}理解成一个代码块,从而发生语法错误。只有不将大括号写在行首,避免JavaScript将其解释为代码块,才能解决这个问题
({} = [true, false]);
({} = 'abc');
({} = []);
解构赋值允许等号左边的模式中不放置任何变量名