这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战
左右两边结构一致
一、数组的解构赋值
将右边数组的值解构后赋值给左边数组中对应的值,可应用于var、let、const
var [v1, v2 ,vn] = [a, b, c];
let [v1, v2, ...v3] = [a, b, c, d, e]; // v3 = [c ,d ,e];
const [v1, v2 ,[v3, ,v4], v5] = [1, ,2 ,[3, 4], 5];
注1:等号右边的不是数组将会报错
注2:等号左边数组内的值少于后边时,仍可赋值成功,不完全解构
二、对象的解构赋值
var {fn : fn} = {fn : 'aaa' };
var {fn} = {fn : 'aaa'}; // 等价写法 在右侧对象中找到与左侧对象中的相同的键进行赋值。
注:实际在对左侧的值进行赋值,
var{fn : foo} = {foo : 'aaa'};
实际是对值foo赋值, 赋值结束后fn并不存在
var {p : [x, {y} ] } = {p : ['hello', {y : 'world} ] }; // x='hello' y='world' **嵌套赋值**
var x;
{x} = {x : 1}; // Error 引擎会将{x}理解成一个代码块
({x} = {x : 1});
三、默认值的问题
var [a, b, c='暂无'] = ['Stri', '20',];
console.log(c); // '暂无..';
var [a, b, c='暂无'] = ['Stri', '20', null];
console.log(c); // null; 无值表示空 null也代表一个值
四、圆括号问题
var [(a)] = [1];
var { x: (c) } = {};
var {o : ({p : p }) } = {o :{p :2 } };
以上都是错误示例,因为他们都是变量声明语句,模式不能使用圆括号
function f( [ (z) ]){return z;} // Error
函数参数也属于变量声明,不能有括号
({ p : a}) = { p : 42};
([a]) = [5]; // 以上代码将整个模式处于括号中
[({p : a}), { x : c}] = [{}, {} ]; // 将嵌套模式的一层放在了括号中
正确写法 :都是赋值语句,其实括号不属于模式的一部分
[(b)] = [3]; // 模式是取数组的第一个成员,与圆括号无关
({ p : (d)} = {}); // 模式是p,而不是d
[(parseInt.prop)] = [3]; // 类1