1.数组解构赋值

1.1.基本用法

    // (1)对数组变量赋值
let [foo, [[bar], baz]] = [1, [[2], 3]];
foo; // 1
bar; // 2
baz; // 3 let [, , third1] = ["foo", "bar", "baz"];
third1; // "baz" let [aa, , bb] = [1, 2, 3];
aa; // 1
bb; // 3 let [head, ...tail] = [1, 2, 3, 4];
head; // 1
tail; // [2, 3, 4] //(2)解构不成功(变量数 > 赋值数) 1.
let [x, y, ...z] = ["a"];
x; // "a"
y; // undefined
z; // [] //解构不成功 2.
let [foo1] = [];
let [bar1, foo2] = [1];
foo1; // undefined
bar1; // 1
foo2; // undefined //(3)解构不完全(变量数 < 赋值数) 1.
let [x1, y1] = [1, 2, 3];
x1; // 1
y1; // 2 //解构不完全 2.
let [a, [b], d] = [1, [2, 3], 4];
a; // 1
b; // 2
d; // 4 //(4)如果等号的右边不是数组-->报错
// let [foo] = 1;
// let [foo] = false;
// let [foo] = NaN;
// let [foo] = undefined;
// let [foo] = null;
// let [foo] = {}; //(5) Set 结构,也可以使用数组的解构赋值
let [e, f, g] = new Set(["a", "b", "c"]);
e; // "a"
f; // "b"
g; // "c" // (6) 只要某种数据结构具有 Iterator 接口,都可以采用数组形式的解构赋值。
function* fibs() {
let a = 0;
let b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
} let [first, second, third, fourth, fifth, sixth] = fibs();
sixth; // 5

1.2.默认值

 {
let [foo = true] = [];
foo; // true let [x, y = "b"] = ["a"]; // x='a', y='b'
let [a, b = "b"] = ["a", undefined]; // a='a', b='b'
} // (2)ES6 内部使用严格相等运算符(===),判断一个位置是否有值。只有当一个数组成员严格等于undefined,默认值才会生效。
{
let [x = 1] = [undefined];
x; // 1 let [y = 1] = [null];
y; // null 如果一个数组成员是null,默认值就不会生效,因为null不严格等于undefined。
} // (3)默认值是一个表达式,那么这个表达式是惰性求值的,即只有在用到的时候,才会求值。
function f() {
console.log("aaa");
} let [x = f()] = [1];
x; //等价于上面 let [x = f()] = [1];
let y;
if ([1][0] === undefined) {
y = f();
} else {
y = [1][0];
} // (4)默认值可以引用解构赋值的其他变量,但该变量必须已经声明。
let [c = 1, d = c] = []; // c=1; d=1
let [e = 1, g = e] = [2]; // e=2; g=2
let [h = 1, i = h] = [1, 2]; // h=1; i=2
let [j = k, k = 1] = []; // ReferenceError: k is not defined -> k没有声明

对象

//(1) 基础用法
{
let { foo, bar } = { foo: "aaa", bar: "bbb" }; //等价于 let { foo: foo, bar: bar } = { foo: "aaa", bar: "bbb" };
foo; // "aaa"
bar; // "bbb"
} //(2) 变量名与属性名不一致:错误写法
{
let { bar, foo } = { foo: "aaa", bar: "bbb" };
foo; // "aaa"
bar; // "bbb" let { baz } = { foo: "aaa", bar: "bbb" };
baz; // undefined
} //(3) 变量名与属性名不一致:正确写法
{
let { foo: baz } = { foo: "aaa", bar: "bbb" };
baz; // "aaa"
// foo是匹配的模式,baz才是变量。真正被赋值的是变量baz,而不是模式foo。 let obj = { first: "hello", last: "world" };
let { first: f, last: l } = obj;
f; // 'hello'
l; // 'world'
} //(4) 嵌套结构:数组一样,解构也可以用于嵌套结构的对象。 这时p是模式,不是变量,因此不会被赋值
{
let obj = {
p: ["Hello", { y: "World" }]
}; let {
p: [x, { y }]
} = obj;
x; // "Hello"
y; // "World"
} //(5) 嵌套结构:如果p也要作为变量赋值,可以写成下面这样。
{
let obj = {
p: ["Hello", { y: "World" }]
}; let {
p,
p: [x, { y }]
} = obj;
x; // "Hello"
y; // "World"
p; // ["Hello", {y: "World"}]
} //(6) 只有line是变量,loc和start都是模式
{
const node = {
loc: {
start: {
line: 1,
column: 5
}
}
}; let {
loc,
loc: { start },
loc: {
start: { line }
}
} = node;
line; // 1
loc; // Object {start: Object}
start; // Object {line: 1, column: 5}
} //(7) 嵌套赋值:
{
let obj = {};
let arr = []; ({ foo: obj.prop, bar: arr[0] } = { foo: 123, bar: true }); obj; // {prop:123}
arr; // [true]
}
//(8) 默认值
{
var { x = 3 } = {};
x; // 3 var { a, b = 5 } = { a: 1 };
a; // 1
b; // 5 var { c: d = 3 } = {};
d; // 3 var { e: f = 3 } = { e: 5 };
f; // 5 var { message: msg = "Something went wrong" } = {};
msg; // "Something went wrong"
} //(9) 默认值生效的条件是,对象的属性值严格等于undefined。
{
var { x = 3 } = { x: 4 };
x; // 3 var { y = 3 } = { y: null };
y; // null
} //(10) 解构失败
{
let { foo } = { bar: "baz" };
foo; // undefined
} //(11) 嵌套的对象,而且子对象所在的父属性不存在
{
//// 报错,等号左边对象的foo属性,对应一个子对象。该子对象的bar属性,解构时会报错。原因很简单,因为foo这时等于undefined,再取子属性就会报错,
// let {
// foo: { bar }
// } = { baz: "baz" };
//// 对上面的解读
// let _tmp = { baz: "baz" };
// _tmp.foo.bar; // 报错 _tmp.foo = undefined 再取子属性就会报错
} //(12) 已经声明的变量用于解构赋值
{
let x;
// 错误的写法
// {x} = {x: 1}; 这里{x} 被理解为代码块 // 正确的写法
({ x } = { x: 1 });
console.log(x);
// SyntaxError: syntax error
} //(13) 解构赋值允许等号左边的模式之中,不放置任何变量名 -> 虽然毫无意义,但是语法是合法的,可以执行。
{
({} = [true, false]);
({} = "abc");
({} = []);
} //(14) 代码将Math对象的对数、正弦、余弦三个方法,赋值到对应的变量上,使用起来就会方便很多。
let { log, sin, cos, PI } = Math;
console.log(sin); //sin() { [native code] }
console.log(PI); //3.141592653589793 //(15) 由于数组本质是特殊的对象,因此可以对数组进行对象属性的解构。
//上面代码对数组进行对象解构。数组arr的0键对应的值是1,[arr.length - 1]就是2键,对应的值是3。方括号这种写法,属于“属性名表达式”
let arr = [1, 2, 3];
let { 0: first, [arr.length - 1]: last } = arr;
first; // 1
last; // 3

ECMAScript6 - 2.变量的解构赋值的更多相关文章

  1. ECMAScript6 入门教程记录 变量的解构赋值

    (1)变量的解构赋值 基本用法:ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). let a = 1; let b = 2; let c = ...

  2. ES6新特性2:变量的解构赋值

    本文摘自ECMAScript6入门,转载请注明出处. ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring).不仅适用于var命令,也适用于let和c ...

  3. es6之变量的解构赋值

    es5中通常我们声明变量都是以下的方式: var a = 10; var b = 20; var c = 30; //或者 var a = 10,b = 20,c = 30; //或者 var arr ...

  4. es6分享——变量的解构赋值

    变量的解构赋值:ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前的写法: var a = 1; var b = 2; es6允许的写法 ...

  5. 变量的解构赋值////////////z

    变量的解构赋值 数组的解构赋值 对象的解构赋值 字符串的解构赋值 数值和布尔值的解构赋值 函数参数的解构赋值 圆括号问题 用途 数组的解构赋值 基本用法 ES6允许按照一定模式,从数组和对象中提取值, ...

  6. ES6 变量的解构赋值

    数组的解构赋值     var [a,b,c] = [1,2,3];    左边是变量,右边是值,根据数据结构一一对应 只要等号两边的模式相同,左边的变量就会被赋予右边对应的值,必须模式相同 如果等号 ...

  7. ES 6 : 变量的解构赋值

    1. 数组的解构赋值 [ 基本用法 ] 按照一定的模式从数组或者对象中取值,对变量进行赋值的过程称为解构. 以前,为变量赋值只能直接指定值: 而ES 6 允许写成下面这样: 上面的代码表示,可以从数组 ...

  8. ES6 - 变量的解构赋值学习笔记

    变量的解析赋值 数组的解析赋值 es6允许按照一定的模式,从数组和对象中提取值,对变量进行赋值,这就称为解构. var a = 1; var b = 2; var c = 3; //在es6中允许写成 ...

  9. ECMAScript 6入门 - 变量的解构赋值

    定义 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 解构赋值不仅适用于var命令,也适用于let和const命令. 解构赋值的规则是,只要 ...

随机推荐

  1. c指针作业(第一次)

    1. 数据类型的本质是什么? (从编译器的角度考虑) 数据类型可理解为创建变量的模具:是固定内存大小的别名 数据类型的作用:编译器预算对象(变量)分配的内存空间大小 注意:数据类型只是模具,编译器并没 ...

  2. tomcat知识(一)

    1.tomcat配置javaWeb项目常见错误: ①:端口占用 ②:未配置JAVA_HOME环境变量 2.tomcat修改端口号 tomcat安装路径下面找到conf文件夹,修改server.xml文 ...

  3. Andriod App类型简介

    App三种类型与区别 原生应用程序:(Native App) 原生APP是什么?原生APP就是利用Android.iOS平台官方的开发语言.开发类库.工具进行开发.比如安卓的java语言,iOS的ob ...

  4. springboot 集成swagger

    了解到swagger 就记录下用法 pom.xml <dependency> <groupId>io.springfox</groupId> <artifac ...

  5. 如何在源码里修改openwrt root密码

    root密码在etc/shadow文件里,但里边的密码是加密过后的.具体的加密方式我不清楚,应该是Linux里的一套加密算法.但要达到修改源码密码的目的,我还是想到了一个间接的办法.首先在源码里改成t ...

  6. vue+webpack+vue-cli获取URL地址参数

    在没有使用webpack+vue router开发中,想要获取RUL传的参数地址,直接通过一个函数就可以获得. 比如在  www.test.com/test.html?sign=test  地址中,想 ...

  7. AVL树探秘

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev) ,专注于干货分享,号内有 10T 书籍和视频资源,后台回复 「1024」 即可领取,欢迎大家关注,二维码文末可以扫. 一.AV ...

  8. C. Multiplicity 简单数论+dp(dp[i][j]=dp[i-1][j-1]+dp[i-1][j] 前面序列要满足才能构成后面序列)+sort

    题意:给出n 个数 的序列 问 从n个数删去任意个数  删去的数后的序列b1 b2 b3 ......bk  k|bk 思路: 这种题目都有一个特性 就是取到bk 的时候 需要前面有个bk-1的序列前 ...

  9. Django_RBAC_demo2 升级版权限控制组件

    RBAC 升级版 预期要求 前端在无权限时不在提供操作标签 更改部分硬编码 实现更加精准的权限控制 未改动前的版本 在这里 ⬇ Django_rbac_demo 权限控制组件框架模型 具体更改 数据库 ...

  10. vue数组中对象属性变化页面不渲染问题

    问题引入 Vue之所以能够监听Model状态的变化,是因为JavaScript语言本身提供了Proxy或者Object.observe()机制来监听对象状态的变化.但是,对于数组元素的赋值,却没有办法 ...