ES6 解构

本文详细介绍了ES6中新增的解构赋值特性,包括数组和对象的解构方式,展示了如何简化变量赋值过程,并探讨了解构赋值在函数参数中的应用。

ES6引入了一个新的语法特性,名为解构,把这个功能看作是一个结构话赋值方法,可能会容易理解一些

以下代码就展示了手动的解构赋值

数组的解构

function foo() {
    return [1,2,3];
}

var tmp = foo(),
    a = tmp[0], b = tmp[1], c = tmp[2];

console.lof( a, b, c ); //  1,2,3

 对象的解构

function bar() {
    return {
        x: 4,
        y: 5,
        z: 6
    };
}

var tmp = bar(), x = tmp.x, y = tmp.y, z = tmp.z;

console.log( x, y, z);

ES6为结构新增了一个专门的语法,专用与数组结构和对象解构。

var [ a, b, c ] = foo();

 对象的解构赋值是 target: source 模式

var { x: x, y: y, z: z} = bar();

如果target 和 source 名字可以直接省略前的 target: 只写 source就行

解构甚至可以直接算出表达式的值

var which = "x",
    o = {};

({ [which]: o[which] } = bar() );

console.log( o.x );  //4

 重复赋值

var { a: X, a: Y } = { a: 1 };

X;  //1
y;  //1
var { a: { x: X, x: Y }, a } = { a: { x: 1} };

X;   //1
Y;   //1
a;    // { x: 1 }

( { a: X, a: Y, a: [Z] } = { a: [ 1 ] } );
x.push( 2 );
Y[0] = 10;

X; //[10,2]   
Y; //[10,2]
Z; // 1

上面的例子其实我觉得有些疑惑, 最开始X[0] = 1, Y[0] = 1, X.push(2)之后Y也会Y.push(2),Y[0] = 10的时候,x[0] = 10;

那么说明 X,Y实际上应该是引用的形式,两个都会改变原来的值,并与赋值对象保证一致性

解构赋值表达式组成链

var  o = { a:1, b:2, c:3}, p ={4,5,6},a,b,c,x,y,z;

( {a} = {b,c} = o );
[x,y] = [z] = p;

console.log( a, b, c);  //1,2,3
console.log( x, y, z);     // 4 5 4

 解构参数

1.解构默认值 + 参数默认值

function f6( { x = 10 } = {}, { y } = { y: 10} ) {
    console.log( x, y );
}

f6();      // 10 10
f6( undefined, undefined );   // 10 10
f6( {}, undefined );    // 10 10

f6( {}, {} );     //10,undefined
f6( undefined, {} ); // 10, undefined
f6( { x: 2}, { y: 3 } );  // 2,3

    两种默认值的不同 

{ y } = { y: 10 }  { x = 10 } = {}

x那种是不论你传入任何值

### ES6 解构赋值中默认值的用法 在ES6中,解构赋值允许为变量设置默认值。当目标对象中的属性值严格等于`undefined`时,会触发默认值的使用[^3]。这意味着如果属性值存在且不为`undefined`,即使它是`null`或其他假值(如`false`或`0`),默认值也不会生效[^4]。 以下是一个简单的示例展示如何在对象解构赋值中设置默认值: ```javascript const user = { userName: "光脚丫思考", blog: "https://blog.youkuaiyun.com/gjysk" }; const { userName = "匿名用户", blog = "无博客", status = "offline" } = user; console.log(userName); // "光脚丫思考" console.log(blog); // "https://blog.youkuaiyun.com/gjysk" console.log(status); // "offline" ``` 在这个例子中,`userName`和`blog`在`user`对象中已经定义,因此它们不会使用默认值。而`status`在`user`对象中未定义,所以它会采用默认值`"offline"`[^3]。 对于数组解构赋值,同样可以设置默认值。例如: ```javascript const [x = 10, y = 20] = [5]; console.log(x, y); // 5, 20 ``` 这里,`x`被赋予了数组中的值`5`,而`y`由于数组中没有提供第二个值,所以采用了默认值`20`[^4]。 ### 默认值表达式的惰性求值 需要注意的是,默认值表达式是惰性求值的,即只有在需要时才会计算默认值。例如: ```javascript function getValue() { console.log("getValue 被调用了"); return "default"; } const { name = getValue() } = {}; console.log(name); // "default" ``` 在这个例子中,`name`在对象中未定义,因此调用了`getValue()`函数来获取默认值。 ### 默认值与严格相等 默认值仅在属性值严格等于`undefined`时生效。如果属性值为`null`、`false`或`0`,默认值不会被使用。例如: ```javascript const { a = 10, b = 20 } = { a: null, b: undefined }; console.log(a, b); // null, 20 ``` 在这里,`a`的值为`null`,因此默认值`10`不生效;而`b`的值为`undefined`,所以默认值`20`生效。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值