JavaScript解构赋值实用技巧与进阶指南

作者:拾光时间:2026-10-25 06:49:35浏览:260

本文深入解析JavaScript解构赋值语法,涵盖对象与数组的完整及简写形式、嵌套结构处理、默认值设置机制及计算属性。详细演示函数参数解构、动态属性访问、变量交换及数组拷贝等实用技巧,并指出undefined与null在默认值判定中的关键差异,帮助开发者编写更简洁高效的代码。

一、核心概念

引入解构的必要性,示例如下:

const student = {
    name: 'ZhangSan',
    age: 18,
    scores: {
        math: 19,
        english: 85,
        chinese: 100
    }
};

function displayInfo(student) {
    console.log('name:', student.name);
    console.log('math:', student.scores.math);
    console.log('english:', student.scores.english);
    console.log('chinese:', student.scores.chinese);
}

displayInfo(student);

此方式虽能达成目标,但代码显得繁琐。若对象层级较深,属性访问链将显著延长。尽管这并非致命缺陷,但采用解构赋值能显著提升代码的简洁性与可读性。

接下来探讨解构赋值的定义。参考 MDN 官方描述:

解构赋值是一种 JavaScript 表达式。借助该语法,可从对象或数组中提取属性值,并将其赋值给其他变量。

本质上,解构是将复杂结构拆解为简单组成部分。该语法适用于变量声明及赋值操作。此外,还支持嵌套解构以处理深层结构。

例如,对前述对象执行解构操作:

function displayInfo(student) {
  const { name, scores: {math, english, chinese} } = student; 
    console.log('name:', name);
    console.log('math:', math);
    console.log('english:', english);
    console.log('chinese:', chinese);
}

如此处理,代码是否更为精简?

二、解构类型

依据 MDN 对解构赋值的定义,可将其划分为两大类别:

  • 对象解构
  • 数组解构

下文将分别阐述这两种解构方式。

1. 对象解构详解

对象解构亦称对象属性分配模式,允许将对象属性值赋给对应变量。其包含两种写法:

let obj =  {x: 1, y: 2, z: 3};

let {x: a, y: b, z: c} = obj;
console.log(a, b, c)

let {x, y, z} = obj;
console.log(x, y, z)
  • 第一种(第3行)为对象解构的标准形式,对象的每个属性均对应一个变量。冒号前标识源对象中的属性名,冒号后指定目标变量名;
  • 第二种(第5行)为对象解构的简写形式,当源对象属性名与目标变量名一致时,可采用此简写。

若需向已存在的变量赋值,需特别注意语法规范:

let obj =  {x: 1, y: 2, z: 3};

let x = 0, y = 0, z = 0;

({x, y, z} = obj)
console.log(x, y, z)

务必使用括号将赋值表达式包裹。若省略括号,解构对象将被解析为块语句,而块语句无法置于赋值表达式左侧。

在使用解构赋值时,可为变量指定默认值:

const person = {
    name: 'ZhangSan',
    height: 180
};

const { name, height, age = 25 } = person;

console.log(name, height, age);

此处为 age 属性设定了默认值。若源对象中不存在 age 属性,则 age 将被赋予默认值 25,而非 undefined。

若分配的对象属性值为 undefined,则触发默认值机制:

const {x = 2} = {x: undefined};
console.log(x);    // 2

2. 数组解构详解

执行数组解构时,系统实际利用迭代器将所需值与结构源分离。因此,可对各类可迭代对象使用数组解构,涵盖字符串、数组、集合、Map 及 DOM 元素。此外,解构赋值还可与扩展运算符结合使用。

(1)字符串处理

let message = 'Hello';
let [a, b] = message;
let [x, y, ...z] = message;

console.log(a, b);        // H e
console.log(x, y, z);     // H e ['l', 'l', 'o']

(2)数组处理

let numbers = [1, 2, 3];
let [x, y, z] = numbers;

console.log(x, y, z);    // 1 2 3

(3)集合处理

let set = new Set().add('foo').add('bar');
let [a, b] = set;

console.log(a, b);      // foo bar

(4)Map 对象处理

let map = new Map().set('a', 1).set('b', 2);
let [x, y] = map;

console.log(x, y);    // ["a", 1] ["b", 2]

在数组解构中,存储变量的数组内每个变量均映射至解构数组相同索引处的对应项。

若解构中某项无需使用,可利用逗号操作符进行占位分隔:

const rgb = [200, 255, 100];

const [,, blue] = rgb;

console.log(blue);   // 100

与对象解构类似,数组解构亦可为局部变量设定默认值:

const rgb = [200];

const [red = 255, green, blue = 255] = rgb;

console.log(`R: ${red}, G: ${green}, B: ${blue}`);

若变量已预先存在,可采用如下写法:


let red = 100, green = 200, blue = 50;

const rgb = [200, 255, 100];

[red, green] = rgb;

console.log(`R: ${red}, G: ${green}, B: ${blue}`);

与对象解构不同之处,此处无需使用括号将数组包裹。

若分配给变量的值为 undefined,则启用默认值:

const [x = 1] = [undefined];
console.log(x);    // 1

默认值未必为固定常量,亦可由计算属性生成:

function foo() {
    return 1;
}

let obj1 = {x: 2};
let obj2 = {x: undefined};

let {x=foo()} = obj1;
console.log(x);     // 2

let {x=foo()} = obj2;
console.log(x);     // 1

若需将数组部分元素赋给特定变量,而将其余元素归集至另一变量,可采用如下方式:

let [greeting,...intro] = ["Hello", "I" , "am", "CUGGZ"];

console.log(greeting);  // "Hello"
console.log(intro);     // ["I", "am", "CUGGZ"]

三、嵌套解构

前述内容涵盖普通数组与对象解构。实际上,解构赋值同样适用于嵌套数组及嵌套对象。例如,文章开篇示例即为嵌套对象解构:

const student = {
    name: 'ZhangSan',
    age: 18,
    scores: {
        math: 19,
        english: 85,
        chinese: 100
    }
};

const { name, scores: {math, english, chinese} } = student; 

另举一例,展示嵌套数组解构:

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

四、高级应用技巧

1. 函数解构应用

(1)函数参数解构

可对函数参数实施解构赋值:

function foo([a, b]) {
    console.log(a + b);
}
foo([1, 2]);       // 3


function bar({x, y}) {
    console.log(x, y);
}
foo({x: 1, y: 2}); // 1 2

亦可对函数返回值实施解构赋值:

function getStudentInfo() {
    return {
        name: 'ZhangSan',
        age: 18,
        scores: {
            math: 19,
            english: 85,
            chinese: 100
        }
    };
}
const { name, scores: {math, english, chinese} } = getStudentInfo();
console.log(name, math, english, chinese);

2. 循环内解构

当需遍历对象键值对时,亦可应用对象解构:

const students = [
    {
        'name': 'ZhangSan',
        'grade': 80
    },
    {
        'name': 'LiSi',
        'grade': 75
    },
    {
        'name': 'WangWu',
        'grade': 95
    }
];

for(let {name, grade} of students){
    console.log(name, grade);
}

3. 动态属性解构

诸多场景下,对象属性的 key 在编译期未知,仅于运行时确定。例如存在方法 getStudentInfo,接收 key 参数并返回对应属性值:

getStudentInfo('name'); 
getStudentInfo('age'); 

鉴于传递给 getStudentInfo 方法的参数具有动态性,代码可编写如下:

const getStudentInfo = key => {
  const {[key]: value} = student;
  return value;
}

务必注意,包裹 key 的方括号不可省略,否则将导致返回 undefined 值。

4. 变量交换

数组解构的一项实用功能在于实现局部变量交换。传统做法通常借助临时变量完成交换:

let width = 300;
let height = 400;

let temp = width;
width = height;
height = temp;

console.log(width, height)

若采用数组解构赋值,实现过程将大幅简化:

let width = 300;
let height = 400;

[width, height] = [height, width];

console.log(width, height)

5. 数组拷贝

可结合解构赋值与 rest 运算符实现数组拷贝:

const rgb = [200, 255, 100];

const [...newRgb] = rgb;
// 等同于 const newRgb = [...rgb]

console.log(newRgb)

四、解构赋值注意事项

为防止从数组中提取出值为 undefined 的对象,可在表达式左侧数组中为任意对象预设默认值。

含义解析:若定义变量或其值被设置为 undefined,而 null、空字符串、false 在变量解析过程中均视为有效值,此时默认赋值机制将失效。

示例如下:

const {a = '1', b = '2', c = '3', d = '4', e = '5'} = {a: 'a', b: null, c: undefined, d: false, e: ''}
console.log(a); //a
console.log(b); //null
console.log(c); //3
console.log(d); //false
console.log(e); // ""

若仅依据属性存在与否来绑定默认值,可直接使用解构赋值。

总结

至此,关于 JavaScript 解构赋值的文章介绍完毕。如需了解更多 JavaScript 解构赋值相关内容,请检索本站往期文章或继续浏览后续相关文章。感谢大家的支持!

作者最新文章