JavaScript语言的解构(Destructuring)语法

可迭代对象解构是按位置的,而对象字面量解构是按命名的。

注意:解构语法是并行的。

1.可迭代对象解构

1.1用于变量赋值

let [变量名, 变量名 = 默认值, ...数组变量名] = 可迭代对象;
//字符串
let [a, b] = "12";
console.log(a, b);  // 1 2
//数组
//左侧数量等于右侧数量
let [a, b] = [1, 2];
console.log(a, b);  // 1 2

//左侧数量小于右侧数量
//右侧多余的元素会被忽略
let [a, b] = [1, 2, 3];
console.log(a, b);  // 1 2
//右侧多余的元素会被打包成数组字面量
let [a, b, ...rest] = [1, 2, 3, 4, 5];
console.log(a, b, rest);  // 1 2 [3, 4, 5]

//左侧数量大于右侧数量
//左侧多余的变量会被赋予undefined值
let [a, b, c] = [1, 2];
console.log(a, b, c);  // 1 2 undefined
//左侧多余的变量会被赋予默认值
let [a, b, c = 3] = [1, 2];
console.log(a, b, c);  // 1 2 3

//给已声明的变量赋值时,不需要在赋值表达式左侧添加let关键字。
let a, b;
[a, b] = [1, 2];
console.log(a, b);  // 1 2
//映射
let [a, b] = new Map([[1, "one"], [2, "two"]]);
console.log(a, b);  // [1, "one"] [2, "two"]
//集合
let [a, b] = new Set([1, 2]);
console.log(a, b);  // 1 2

左侧的变量还支持占位语法。

注意:左侧不是稀疏数组语法,是占位语法。

//左侧数量等于右侧数量
let [a, ] = [1, 2];
console.log(a);  // 1

//左侧数量小于右侧数量
let [a, ] = [1, 2, 3];
console.log(a);  // 1

//左侧数量大于右侧数量
let [a, ] = [1];
console.log(a);  // 1

1.2用于函数形参

具体参考“用于变量赋值”章节。

function f([a, b]) {
  console.log(a, b);
}

f([1, 2]);  // 1 2

2.对象字面量解构

2.1用于变量赋值

let { 属性名: 变量名, 属性名, 属性名: 变量名 = 默认值, 属性名 = 默认值, ...对象字面量变量名 } = 对象字面量;
//左侧数量等于右侧数量
//属性名与变量名不相同(前面a是右侧对象字面量内的属性名,后面x是变量名)
let { a: x, b: y } = { a: 1, b: 2 };
console.log(x, y);  // 1 2
//属性名与变量名相同(前面a是右侧对象字面量内的属性名,后面a是变量名)
let { a: a, b: b } = { a: 1, b: 2 };
//简写
let { a, b } = { a: 1, b: 2 };
console.log(a, b);  // 1 2

//左侧数量小于右侧数量
//右侧多余的属性会被忽略
let { a, b } = { a: 1, b: 2, c: 3 };
console.log(a, b);  // 1 2
//右侧多余的属性会被打包成对象字面量
let { a, b, ...rest } = { a: 1, b: 2, c: 3, d: 4, e: 5 };
console.log(a, b, rest);  // 1 2 { c: 3, d: 4, e: 5 }

//左侧数量大于右侧数量
//左侧多余的变量会被赋予undefined值
let { a, b, c } = { a: 1, b: 2 };
console.log(a, b, c);  // 1 2 undefined
//左侧多余的变量会被赋予默认值
let { a, b, c = 3 } = { a: 1, b: 2 };
console.log(a, b, c);  // 1 2 3

//给已声明的变量赋值时,不需要在赋值表达式左侧添加let关键字,但赋值表达式必须被包裹在分组运算符()内。
let a, b;
({ a, b } = { a: 1, b: 2 });
console.log(a, b);  // 1 2

2.2用于函数形参

具体参考“用于变量赋值”章节。

function f({ a, b }) {
  console.log(a, b);
}

f({ a: 1, b: 2 });  // 1 2

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/experience/javascriptexp/36650.html

(0)
huoxiaoqiang的头像huoxiaoqiang
上一篇 2025年4月3日 13:43
下一篇 2025年4月3日 16:47

相关推荐

  • JavaScript语言的可计算名

    可计算名语法用于使用表达式的返回值作为成员名。 支持类的成员:静态字段、静态访问器属性、静态方法、实例字段、实例访问器属性、实例方法。 支持对象字面量的成员:数据属性、访问器属性、方法。 方括号 [] 内可以为任何 JavaScript 表达式,表达式的返回值的类型只可以为 字符串类型(包括空字符串) 或者 符号类型。…

    JavaScript经验 2025年4月3日
    0510
  • JavaScript语言的展开(Spread)语法

    1.展开可迭代对象 1.1用于变量赋值 1.2用于函数实参 具体参考“用于变量赋值”章节。 2.展开对象字面量 2.1用于变量赋值 2.2用于函数实参 JavaScript 语言不支持用于函数实参。

    JavaScript经验 2025年4月3日
    0570
  • 使用ES模块的两种方式

    无论是内部方式还是外部方式,带有 type=”module” 属性的 <script> 标签会告诉浏览器相关代码应该作为模块执行,而不是作为普通的脚本执行。 无论是内部方式还是外部方式,一个 HTML 页面有多少个 type=”module” 属性的 <script> 标签没有限制。 无论是内部…

    JavaScript经验 2024年1月16日
    09440

发表回复

登录后才能评论