当前位置: 首页 > news >正文

【JS进阶】对象解构与数组解构

JavaScript 数组解构

数组解构(Destructuring Assignment)是ES6引入的一种语法,可以快速从数组或可迭代对象中提取值并赋值给变量。

一、基本用法

// 基础解构
const colors = ['red', 'green', 'blue'];
const [firstColor, secondColor, thirdColor] = colors;

console.log(firstColor);  // 'red'
console.log(secondColor); // 'green'
console.log(thirdColor);  // 'blue'

二、高级用法

1. 跳过某些元素

const numbers = [1, 2, 3, 4];
const [first, , third] = numbers;

console.log(first);  // 1
console.log(third);  // 3

2. 默认值

const fruits = ['apple'];
const [fruit1, fruit2 = 'banana'] = fruits;

console.log(fruit1); // 'apple'
console.log(fruit2); // 'banana' (默认值)

3. 剩余元素

const numbers = [1, 2, 3, 4, 5];
const [first, second, ...rest] = numbers;

console.log(first); // 1
console.log(second); // 2
console.log(rest);  // [3, 4, 5]

4. 变量交换

let a = 1;
let b = 2;

[a, b] = [b, a];

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

5. 嵌套数组解构

const colors = ['red', ['green', 'lightgreen'], 'blue'];
const [first, [second, third]] = colors;

console.log(first);  // 'red'
console.log(second); // 'green'
console.log(third);  // 'lightgreen'

三、实际应用场景

1. 函数返回多个值

function getSizes() {
  return [10, 20, 30];
}

const [small, medium, large] = getSizes();

2. 正则表达式匹配

const url = 'https://example.com/users/123';
const matches = url.match(/^https?:\/\/([^/]+)\/users\/(\d+)$/);

if (matches) {
  const [, domain, userId] = matches;
  console.log(domain);  // 'example.com'
  console.log(userId);  // '123'
}

3. 与迭代器配合使用

const map = new Map();
map.set('name', 'John');
map.set('age', 30);

for (const [key, value] of map) {
  console.log(`${key}: ${value}`);
}
// 输出:
// name: John
// age: 30

JavaScript 对象解构

对象解构(Destructuring Assignment)是ES6引入的一种语法,可以快速从对象中提取属性值并赋值给变量。

一、基本用法

// 基础解构
const person = { name: 'Alice', age: 25, job: 'Developer' };
const { name, age, job } = person;

console.log(name); // 'Alice'
console.log(age);  // 25
console.log(job);  // 'Developer'

二、高级用法

1. 别名赋值

const user = { id: 1, username: 'jsmith' };
const { username: login } = user;

console.log(login); // 'jsmith'
// console.log(username); // ReferenceError

2. 默认值

const options = { width: 100 };
const { width = 800, height = 600 } = options;

console.log(width);  // 100 (使用已有值)
console.log(height); // 600 (使用默认值)

3. 嵌套对象解构

const employee = {
  name: 'Bob',
  position: {
    title: 'Manager',
    department: 'IT'
  }
};

const { 
  name, 
  position: { title, department } 
} = employee;

console.log(name);       // 'Bob'
console.log(title);      // 'Manager'
console.log(department); // 'IT'

4. 剩余属性

const student = { name: 'Tom', age: 20, grade: 'A', school: 'XYZ' };
const { name, ...rest } = student;

console.log(name); // 'Tom'
console.log(rest); // { age: 20, grade: 'A', school: 'XYZ' }

5. 动态属性名解构

const key = 'username';
const { [key]: user } = { username: 'admin' };

console.log(user); // 'admin'

三、实际应用场景

1. 函数参数解构

function greet({ name, age }) {
  console.log(`Hello, ${name}. You are ${age} years old.`);
}

greet({ name: 'Alice', age: 25 });

2. 配置对象处理

function createElement({ tag = 'div', content = '', classes = [] }) {
  const el = document.createElement(tag);
  el.textContent = content;
  el.classList.add(...classes);
  return el;
}

const myDiv = createElement({
  content: 'Hello',
  classes: ['box', 'highlight']
});

3. 模块导入

// 代替 const fs = require('fs'); const path = require('path');
const { readFile, writeFile } = require('fs');
const { join, basename } = require('path');

4. React props 解构

function UserCard({ user: { name, avatar }, onClick }) {
  return (
    <div onClick={onClick}>
      <img src={avatar} alt={name} />
      <h3>{name}</h3>
    </div>
  );
}

四、注意事项

  1. 解构不存在的属性会得到undefined

    const { missing } = {};
    console.log(missing); // undefined
    
  2. 解构nullundefined会报错

    const { prop } = null; // TypeError
    const { prop } = undefined; // TypeError
    
  3. 解构赋值可以与数组解构混合使用

    const { props: [first, second] } = { props: [1, 2] };
    console.log(first, second); // 1 2
    
  4. 解构时可以计算属性名

    const prop = 'name';
    const { [prop]: myName } = { name: 'Alice' };
    console.log(myName); // 'Alice'
    

相关文章:

  • 基于3A4000及CentOS的银河麒麟V10离线源码编译安装VLC
  • Java八股文背诵 第四天JVM
  • BC3 有容乃大(sizeof关键字,sizeof(long long) >= sizeof(long) >= sizeof(int)
  • Spring 中的 @Cacheable 缓存注解
  • Hook_Unfinished
  • 【含文档+PPT+源码】基于微信小程序的学校体育馆操场预约系统的设计与实现
  • python的web框架flask(hello,world版)
  • 【读者求助】如何跨行业进入招聘岗位?
  • 并发编程--互斥锁与读写锁
  • Linux基础1
  • Linux 入门八:Linux 多进程
  • JavaScript 简单类型与复杂类型-简单类型传参
  • 多模态大语言模型arxiv论文略读(十四)
  • qt上设置 WebAssembly显示中文
  • 『生成内容溯源系统』详解
  • java之file和IO流
  • 关于编译原理——递归下降分析器的设计
  • 用 NextJS写一个 Rock Paper Scissors 小游戏(附在线试玩地址)
  • Java——数据类型与变量
  • 门禁管理系统:守护安全的智能卫士
  • 做本地网站应该选什么内容/数据网站有哪些
  • 个人业务网站教程/企业软文怎么写
  • 建站吧网站建设/推广app佣金平台正规
  • 公司网站横幅是做的吗/百度网站排名搜行者seo
  • 哔哩哔哩网页版在线观看网址/搜索引擎营销优化策略有哪些
  • 加工厂做网站/重庆森林影评