详解JS ES6变量的解构赋值

作者:闭包旅人时间:2026-10-24 10:19:43浏览:400

本文详细解析ES6中的解构赋值语法,涵盖数组与对象的提取规则、默认值设置、函数参数应用以及字符串、数值处理。通过变量交换、多返回值提取、JSON数据解析等实例,展示解构如何简化代码并提升开发效率。

1.什么是解构?

ES6标准引入了按照特定模式从数组或对象中提取值并赋给变量的机制,称为解构赋值。相比ES5的语法,这种方式更加简洁紧凑且逻辑清晰。它不仅能有效减少代码行数,还能从底层改变编码习惯。

2.数组解构

在ES5及之前,为变量赋值通常需要直接指定具体数值,例如:


let a = 1;
let b = 2; 
let c = 3;

如今,可以利用数组解构语法直接完成赋值操作。


let [a, b, c] = [1, 2, 3];
console.log(a, b, c); // 1, 2, 3

这是数组解构最基础的用法,此外还可以对包含对象的数组进行解构。


// 对象数组解构
let [a, b, c] = [{name: 'jacky'}, {name: 'monkey'}, {name: 'houge'}];
console.log(a, b, c); // {name: 'jacky'}, {name: 'monkey'}, {name: 'houge'}

3.数组模式和赋值模式统一

该规则要求等号左侧的模式与右侧的数据结构保持一致,若模式不匹配,解构操作将失败。


let [a, [b, c], d] = [1, [2, 3], 4];
console.log(a, b, c, d); // 1 2 3 4

 // 提取除第二、三个外的所有数值
let [a, , , d] = [1, 2, 3, 4];
console.log(a, d); //1 4
    
let [a, ...b] = [1, 2, 3, 4];
console.log(a, b); // 1 [2, 3, 4]
        
let [a, , , ...d] = [1, 2, 3, 4, 5];
console.log(a, d); // 1 [4, 5]
如果解构不成功,变量的值就等于undefined

let [a, b, c] = [2, 3];
console.log(a, b, c); // 2 3 undefined

let [c] = [];
console.log(c); // undefined

当解构失败时,对应变量的值将被赋为undefined。


let [a, b, c] = [2, 3];
console.log(a, b, c); // 2 3 undefined

let [c] = [];
console.log(c); // undefined

上述情况属于完全解构。还有一种不完全解构的情形,即左侧模式仅匹配右侧数组的部分元素,此时解构依然可以成功执行。


let [x, y] = [1, 2, 3]; 
console.log(x, y); // 1 2

let [a, [b], d] = [1, [2, 3], 4];
console.log(a, b, d); // 1 2 4

4.解构的默认值

解构赋值语法支持为变量指定默认值。


let [a, b=2] = [1];
console.log(a, b); // 1 2

let [a=1, b=2, c, d=13] = [10, 11, 12];
console.log(a, b, c, d); // 10 11 12 13

5.对象的解构赋值

对象解构与数组存在显著差异。数组元素按索引顺序排列,变量取值取决于位置;而对象属性无序,变量名必须与属性名完全一致,才能正确获取值。


// 对象解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而非前者。
let obj = { a: "aaa", b: "bbb" };
let { a: x, b: y } = obj; 
console.log(x, y); // aaa bbb

let { a, b } = { a: 'aaa', b: 'bbb' };
console.log(a, b); // aaa bbb

// 不按照顺序
let { b, a } = { a: 'test1', b: 'test2' }
console.log(a, b) // test1 test2


// 嵌套解构
let { obj: { name }} = { obj: { name: 'jacky', age: '22' } }
console.log(name) // jacky

// 稍微复杂的嵌套
let obj = {
    p: [
        'Hello',
        { y: 'World' }
    ]
};

let { p: [x, { y }] } = obj;
console.log(x, y); // Hello World

若变量名与属性名不一致,需采用特定写法进行映射。


var { foo: rename } = { foo: "aaa",bar: "bbb" };
console.log(rename); // aaa
console.log(foo); // Uncaught ReferenceError: foo is not defined

若在解构前已定义变量,直接解构会引发问题。以下代码会导致编译错误,因为JavaScript引擎会将行首的大括号{a}解析为代码块而非对象字面量,从而产生语法错误。解决方法是将大括号置于行首之外的位置,避免被误认为代码块。


let a;
let obj = { a: "aaa" };
{a} = obj; // Uncaught SyntaxError: Unexpected token '='

为消除报错并确保程序正常运行,只需在解构语句外层包裹一对圆括号即可。


let a;
let obj = { a: "aaa" };
( {a} = obj );
console.log(a); // aaa

6.函数参数

函数定义时,其参数同样可以使用解构赋值语法。


function add([x, y]){
  return x + y;
}

add([1, 2]); // 3

函数参数的解构也支持设置默认值。


function fn(x, y = 7) {
    return x + y;
}
console.log(fn(3)); // 10

7.字符串解构

字符串在解构时会被转换为一个类似数组的对象结构。


const [a, b, c, d, e, f] = "hello";
console.log(a); //h
console.log(b); //e
console.log(c); //l
console.log(d); //l
console.log(e); //o
console.log(f); //undefined

8.数值和布尔值的解构赋值

当解构赋值的右侧为数值或布尔值时,系统会先将其转换为对象。


let {toString: s} = 0;
console.log(s === Number.prototype.toString); // true

let {toString: s} = true;
console.log(s === Boolean.prototype.toString); // true

解构规则规定,只要等号右侧的值不是对象或数组,就先将其转换为对象。由于undefined和null无法转换为对象,对它们进行解构赋值会抛出错误。


let { prop: x } = undefined; // TypeError
let { prop: y } = null; // TypeError

9.解构赋值的应用

1.交换变量的值

传统交换两个变量值的方法通常需要引入一个临时变量,示例如下:


let a = 1;
let b = 2;
let temp;

temp = a;
a = b;
b = temp;

console.log(a, b); // 2 1

使用ES6解构赋值,代码将变得非常简洁。


let a = 1;
let b = 2;
[a, b] = [b ,a];

console.log(a, b); // 2 1

2.从函数返回多个值

JavaScript函数只能返回单一值,若需返回多个值,必须将它们封装在数组或对象中。借助解构赋值,提取这些返回值变得十分便捷。


// 返回一个数组
function example() {
  return [1, 2, 3];
}
let [a, b, c] = example();

// 返回一个对象
function example() {
  return {
    foo: 1,
    bar: 2
  };
}
let { foo, bar } = example();

3.访问数组中元素

存在一种场景:处理一个可能为空的数组,希望访问第一个、第二个或第n个元素,若该元素不存在,则使用指定的默认值。

传统做法通常利用数组的length属性进行判断。


const list = [];

let firstItem = 'hello';
if (list.length > 0) {
    firstItem = list[0];
}

console.log(firstItem); // hello

若使用ES6解构赋值来实现上述逻辑:


const list = [];
const [firstItem = 'hello'] = list;

console.log(firstItem); // 'hello'

4.提取 JSON数据


let jsonData = {
  id: 42,
  status: "OK",
  data: [867, 5309]
};

let { id, status, data: number } = jsonData;

console.log(id, status, number);
// 42, "OK", [867, 5309]

5.遍历 Map 结构

任何部署了Iterator接口的对象,均可通过for...of循环进行遍历。Map结构原生支持Iterator接口,配合变量解构赋值,可以方便地获取键名和键值。


const map = new Map();
map.set('first', 'hello');
map.set('second', 'world');

for (let [key, value] of map) {
  console.log(key + " is " + value);
}
// first is hello
// second is world

如果仅需获取键名或仅获取键值,可采用如下写法。


// 获取键名
for (let [key] of map) {
  // ...
}

// 获取键值
for (let [,value] of map) {
  // ...
}

以上就是详解JS ES6变量的解构赋值的详细内容,更多关于JS ES6变量解构赋值的资料请关注本站其它相关文章!

作者最新文章