ES6笔记(3)-- 解构赋值

系列文章 -- ES6笔记系列

解构赋值,即对某种结构进行解析,然后将解析出来的值赋值给相关的变量,常见的有数组、对象、字符串的解构赋值等

一、数组的解构赋值

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

var [id1, id2, id3] = ids();

console.log(id1, id2, id3); // 1 2 3

如上,解析返回的数组,取出值并赋给相应的变量,这就是解构赋值

1. 还可以嵌套多层,只要相应的模式匹配了就能解析出来

var [a, [b, [c]]] = [1, [2, [3]]];

a // 1
b // 2
c // 3

2. 如若模式不匹配则报错

var [a, [b, [c]]] = [1, [2, 3]]; // Uncaught TypeError: undefined is not a function

a 

其实,解构赋值内部的实现方式使用到了ES6的Iterator迭代器,通过层层遍历,保证了相应值的获取

3. 解构不成功,但模式匹配了,相应值为undefined

var [a, b] = [1];

a // 1
b // undefined

4. 不需要匹配的位置可以置空

var [, b] = [1, 2];

b // 2

5. 使用...这个扩展运算符,匹配余下的所以值,形成一个数组(匹配不上则为[]),这个符号内部也用到了迭代器Iterator

var [a, ...b] = [1, 2, 3];

a // 1
b // [2, 3]

var [a, ...b] = [1];

a // 1
b // []

6. 可以设置默认值,当相应的值严格等于undefined时,默认值会生效

var [a, b = [2, 3]] = [1];

a // 1
b // [2, 3]
var [a, b = [2, 3]] = [1, undefined];

a // 1
b // [2, 3]
var [a, b = [2, 3]] = [1, null];

a // 1
b // null

7. 惰性求值,对于默认值中出现函数调用模式的,只有默认值生效,函数才会调用,如下,foo函数将不会被调用

function foo() {
    console.log(‘hit‘);
}

var [str = foo()] = [1];

str // 1

8. 可以方便的进行变量值的交换

var x = 1,
    y = 2;

[x, y] = [y, x];

x // 2
y // 1

二、对象的解构赋值

与数组类似,对象也可以进行解构赋值

var {name, agee} = {
    name: ‘jack‘,
    age: 22,
};

name // jack
agee // undefined

如上,对象的解构赋值要求属性名称匹配正确,agee不匹配则变成undefined

1. 不过我们可以自定义属性名称,但要注意的是被赋值的只是我们自定义的属性名称,匹配的模式(项)并未被赋值

var {name, id: ID} = {
    name: ‘jack‘,
    id: 1
};

ID // 1
id // Uncaught ReferenceError: id is not defined

更复杂的如

var {
    a0: {
        b0: {
            c0
        }
    }
} = {
    a0: {
        b0: {
            c0: ‘cc‘,
            d0: ‘dd‘
        }
    }
};

a0 // Uncaught ReferenceError: a0 is not defined
b0 // Uncaught ReferenceError: b0 is not defined
c0 // cc

2. 类似于数组,也可使用默认值

var {a:b = 2} = {};
b // 2

var {a:b = 2} = {
    a: 1
};
b // 1

3. 因为数组实际上也是个对象,所以

var {0: one, 1: two} = [1, 2];

two // 2

4. 可以方便地将某个对象上的属性方法一次性提取出来

var {map, slice} = Array.prototype;

slice //
const {foo, bar} = require(‘./util‘);

5. 非声明时的解构赋值

非声明时,这里是指纯粹的解构赋值,如下代码

var a;
{a} = {
    a: 1
}; // Uncaught SyntaxError: Unexpected token =

a 

以上代码报错了,但某些情况下我们还是需要直接赋值怎么办?

大括号{位于行首,匹配了}之后JS引擎就会认为{a}是一个代码块,所以等号就出问题了,解决方式是在行首放个括号(,即外包裹一层括号()

var a;
({a} = {
    a: 1
}); 

a // 1

括号的出现,让整个解构赋值的结构被看做一个代码块,而内部的{a}模式则可以正常匹配到

细心的盆友会注意到,右括号换个位置,报错了

var a;
({a}) = {
    a: 1
}; // Uncaught SyntaxError: Unexpected token (

a 

6. 其实,解构赋值中括号的使用还是有讲究的

1) 不能使用括号的情况

 1-1)变量声明语句中,不能带有括号

// 以下代码都会报错

var [(a)] = [1];

var {x: (c)} = {};
var ({x: c}) = {};
var {(x: c)} = {};
var {(x): c} = {};

var { o: ({ p: p }) } = { o: { p: 2 } };

 1-2)函数参数中,模式不能带有括号

// 报错
function f([(z)]) {
    return z;
}

f([1])

 1-3)赋值语句中,不能将整个模式,或嵌套模式中的一层,放在括号之中

var a;
({a}) = {
    a: 1
}; // Uncaught SyntaxError: Unexpected token (

a 

2)可以使用括号的情况

可以使用括号的情况很好记,只有一种:赋值语句的非模式部分,可以使用括号

// 都正确
[(b)] = [3];
({ p: (d) } = {});
[(b)] = ([3]); 

三、字符串的解构赋值

字符串也可进行解构赋值,因为此时的字符串被转换成了类数组的对象,模式能够匹配起来,如

var [a, b] = ‘str‘;
a // s
b // t

var {0:a, 1:b, length:len} = ‘str‘;
a // s
b // t
len // 3

四、其他类型的解构赋值

1. 解构赋值的规则是,只要等号右边的值不是对象,就先尝试将其转为对象。如果转换之后的对象或原对象拥有Iterator接口,则可以进行解构赋值,否则会报错。

var {toString: s} = 1;
s //

var {toString: s} = true;
s //

以上的数组和布尔值会转换成对象,toString模式匹配上了对象的toString属性,所以解构成功,而null或undefined却不能转换成此类对象,所以报错

var {toString: s} = null;
s // Uncaught TypeError: Cannot match against ‘undefined‘ or ‘null‘.

ES6引入了Iterator迭代器,集合Set或Generator生成器函数等都部署了这个Iterator接口,所以也可以用来进行解构赋值

2. 比如Set的解构赋值

var [a, b, c] = new Set([1, 2, 3]);

a // 1
b // 2
c // 3

3. 函数参数的解构赋值

function calc([a, b, c = 10]) {
    console.log(a + b + c); // 13
}

calc([1, 2]);
时间: 2024-08-06 19:21:38

ES6笔记(3)-- 解构赋值的相关文章

es6 变量的解构赋值

一.数组的解构赋值 数组解构赋值,索引很重要,即顺序很重要 1.解构[1,2,3] //把1,2,3分别赋值给a,b,c var [a,b,c]=[1,2,3]; console.log(a+' | '+b+' | '+c);//1 | 2 | 3 2.更复杂,更强大的赋值,解构[1,[2,3]] //把1,2,3分别赋值给a,b,c var [a,[b,c]]=[1,[2,3]]; console.log(a+' | '+b+' | '+c);//1 | 2 | 3 3.跳着赋值 //把1赋值

ES6-个人学习笔记二--解构赋值

第二期,解构赋值如果能够熟练应用确实是个十分方便的功能,但是过分的依赖和嵌套只会让代码理解和维护起来十分困难,是个体现高逼格的表达式呢~ 1,解构赋值的基础 //定义:es6运行按照一定模式,从数组或对象中提取值,并对变量进行赋值,如 var [a,b,c] = [1,2,3]; //一些其他方式 let [ , , a1] = [1,2,3]; //a1:3 let [a2,...b2] = [1,2,3,4]; //a2:1,b2:[2,3,4] let [a3,b3,...c3] = [1

ES6中的解构赋值

在解释什么是解构赋值前,我们先来看一下, ES5 中对变量的声明和赋值. var str = 'hello word'; 左边一个变量名,右边可以是字符串,数组或对象. ES6 中增加了一种更为便捷的赋值方式.称为 Destructuring .好像大家普遍翻译为解构.解构赋值允许我们将数组或对象的属性赋予给任何变量,该变量的定义语法与数组字面量或对象字面量很相似.举个例子可以直观的说明. let [speak, name] = ['hello', 'destructuring']; conso

ES6 - Note2:解构赋值

ES6的解构赋值就是利用模式匹配从按照一定模式的数组或者对象中提取值赋值给变量. 1.数组的解构赋值 在ES6以前,变量的赋值是直接指定的,以后可以这么来写,如下所示 let [a,b,c] = [1,2,3]; console.log(a,b,c) 1 2 3 解构赋值只要等号两边的模式一致,便可解析成功,如下所示 var [d,[f,g]] = [3,[4,5]]; console.log(d,f,g); 3 4 5 ----------------------------- var [,,

ES6数组的解构赋值( 下)

对象的解构赋值 对象的解构赋值跟数组的解构赋值很类似,我们来看一段小代码: var { a,b,c} = {"a":1,"b":2,"c":3}; console.log(a);//结果:a的值为1 console.log(b);//结果:b的值为2 console.log(c);//结果:c的值为3 这段例子的代码是不是跟数组的解构赋值很相似,只不过是数组换成了对象.但是两者有一个不同的地方,我们对上面的代码稍做修改: var { a,b,c

ES6变量的解构赋值

// -------------------------------------------------------------------/** * 基本概念: * 本质上就是一种匹配模式,只要等号两边的模式相同,那么左边的变量就可以 * 被赋予对应的值. * 结构赋值主要分为: * 1 数组的解构赋值 * 2 对象的结构赋值 * 3 基本类型的解构赋值 */// let a = 1;// let b = 2;// let c = 3; // let [a, b, c] = [1, 2, 3]

【es6】变量解构赋值

1.数组解构赋值 let [a,b,c]=[1,2,3];//数组解构赋值,注意:左右两边格式需一致 let [a,b]=[1,2,3];//不完全解构,取位置靠前的值 let [a=1,b]=[undefined,2];//可以带默认值,内部解析必须是===undefined时,才会取默认值,注意,null都不能取默认值 2.对象解构赋值 变量必须与属性同名,可以不按顺序(不同于数组) let {foo,bar}={foo:1,bar:2}; let {foo:baz}={foo:1};//b

ES6相关特性(解构赋值)

解构赋值:本质上是一种匹配模式,等号两边的模式相同,则左边的变量可以被赋予对应的值. 注意:null & undefined 不能解构赋值!!! 数组的解构赋值: let [a,[[b],c]]=[1,[[2],3]]; // a=1,b=2,c=3; let [,,c]=[1,2,4]; // c=4; let[x]=[]; // let x; // x=undefined; 可以指定默认值: let [y=1]=[]; // y=1; 对象的解构赋值(找同名属性): let {a,b}={b

Es6 -- 对象的解构赋值

解构不仅可以用于数组,还可以用于对象. var {foo, bar} = {foo: "aaa", bar: "bbb"}; console.log(foo); //aaa console.log(bar); //bbb 对象的解构与数组有一个重要的不同.数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值. var {bar, foo} = {foo: "aaa", bar: "

ES6变量的解构赋值(一)数组的解构赋值

let[a,...arr]=[1,2,3,4];//a==>1 arr==>[2,3,4] let [x, y, ...z] = ['a'];//a==>'a' y==>undefined z==> [] let [a, [b], d] = [1, [2, 3], 4];//a==>1 b==>2 c==>4 let[a,b]=[1,2,3];//a==>1 b==>2 数组中变量左右两边一对一对应: let[a,b,c]=[1,2,3];//a