js深度解构

深度解构(Deep Destructuring)是指在解构赋值中,解构对象或数组中的嵌套结构。它允许你从复杂的数据结构中直接提取所需的嵌套数据,使代码更加简洁明了。

对象:
const person = {
    name: 'John',
    address: {
        city: 'New York',
        street: {
            name: '5th Avenue',
            number: 123
        }
    }
};

const { address: { city, street: { name, number } } } = person;

console.log(city);    // 输出 'New York'
console.log(name);    // 输出 '5th Avenue'
console.log(number);  // 输出 123

在上面中不能获取到address和street。可以通过以下方式获取:

const { address, address: { city, street, street: { name, number } } } = person;
数组:
const colors = ['red', ['green', 'lightgreen'], 'blue'];

const [primary, [ , lightSecondary]] = colors;

console.log(primary);       // 输出 'red'
console.log(lightSecondary);// 输出 'lightgreen'
深度解构函数参数:

深度解构还可以在函数参数中使用,特别是当函数接收复杂的对象或数组作为参数时:

function displayPerson({ name, address: { city, street: { name: streetName, number } } }) {
    console.log(`${name} lives on ${streetName}, ${city}. Street number: ${number}`);
}

displayPerson(person); 
// 输出 'John lives on 5th Avenue, New York. Street number: 123'

拓展

交换变量值
let name1 = "张三";
let name2 = "李四";
[name2,name1] = [name1,name2];
console.log(name1,name2);     // 李四 张三
默认值

在解构中,无论是深度解构还是普通结构,都可以为解构的属性设置默认值,防止属性不存在时导致 undefined 或报错:

const person = {
    name: 'John',
    address: {
        city: 'New York',
    }
};

const { address: { city, street: { name = 'Unknown', number = 0 } = {} } } = person;

console.log(city);    // 输出 'New York'
console.log(name);    // 输出 'Unknown'
console.log(number);  // 输出 0
  • name = ‘Unknown’ 和 number = 0 是两个具体的属性默认值。
  • street: { name = ‘Unknown’, number = 0 } = {} 通过 ={} 这一部分确保了在 street 对象不存在时依然能够安全地解构 name 和 number
function fn({name='李四', age=30}) {
  console.log(name, age);
}

fn(); // 输出: 李四 30

具体来说,当你调用 fn() 时,相当于 fn(undefined),而不是 fn({})。由于 undefined 不是一个对象,因此 JavaScript 无法对它进行解构赋值,这就导致了错误。

function fn({name='李四', age=30} = {}) {
  console.log(name, age);
}

fn(); // 输出: 李四 30

这里,{name=‘李四’, age=30} = {} 的意思是,如果没有传入参数或者传入的是 undefined,那么默认使用一个空对象 {} 进行解构,这样就不会出错。

const person = {
    name: 'Alice',
    age: 30
};

const { name, age, city = 'Unknown' } = person;

console.log(name);  // 输出 'Alice'
console.log(age);   // 输出 30
console.log(city);  // 输出 'Unknown'
同名属性

通过在解构时给属性起一个新的名字(别名)来避免冲突。

const people = [
    { name: 'John', age: 30, address: { city: 'New York' } },
    { name: 'Alice', age: 28, address: { city: 'Los Angeles' } }
];

const [
    { name: name1, address: { city: city1 } },
    { name: name2, address: { city: city2 } }
] = people;

console.log(name1);  // 输出 'John'
console.log(city1);  // 输出 'New York'
console.log(name2);  // 输出 'Alice'
console.log(city2);  // 输出 'Los Angeles'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值