Appearance
默认值
本节目标:理解“默认值”的核心思路,并能把它用于实际开发或面试表达。
对象的解构也可以指定默认值。
var {x = 3} = {};x // 3
var {x, y = 5} = {x: 1};x // 1y // 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"注意
一、默认值生效的条件是,对象的属性值严格等于undefined。
var {x = 3} = {x: undefined};x // 3
var {x = 3} = {x: null};x // null二、如果要将一个已经声明的变量用于解构赋值,必须非常小心。
// 错误的写法let x;{x} = {x: 1};// SyntaxError: syntax error
上面代码的写法会报错,因为 JavaScript 引擎会将{x}理解成一个代码块,从而发生语法错误。只有不将大括号写在行首,避免 JavaScript 将其解释为代码块,才能解决这个问题。
// 正确的写法let x;({x} = {x: 1});
上面代码将整个解构赋值语句,放在一个圆括号里面,就可以正确执行。关于圆括号与解构赋值的关系,参见下文。三、解构赋值允许等号左边的模式之中,不放置任何变量名。因此,可以写出非常古怪的赋值表达式。
({} = [true, false]);({} = 'abc');({} = []);
上面的表达式虽然毫无意义,但是语法是合法的,可以执行。四、由于数组本质是特殊的对象,因此可以对数组进行对象属性的解构。
let arr = [1, 2, 3];let {0 : first, [arr.length - 1] : last} = arr;first // 1last // 3
上面代码对数组进行对象解构。数组arr的0键对应的值是1,[arr.length - 1]就是2键,对应的值是3。方括号这种写法,属于“属性名表达式”。