ES6-3 变量的解构赋值
1.数组的解构赋值
数组的解构赋值其实是=左右进行“模式匹配”。
❗️❗️❗️=右侧是具体的数值,不是变量!,=左侧的是变量!如果右侧是变量形式,需要先计算出具体的数值!!
let [a,[b],c] = [1,[2],3]; // a=1;b=2;c=3
let [a, ...tail] = [1,2,3,4,5]; // a = 1, tail = [2,3,4,5]
let [a,b,c] = [1]; // a=1 b=undefined c=undefined
=有侧不能是非数组,非数组会自动转为包装对象。{}不行,因为对象不含iterator接口。但是Set可以,Set有iterator接口。
let [a,b,c] = new Set([1,2,3]) // a=1, b= 2, c= 3
只要数据结构有iterator接口就可以使用数组结构。用Generator函数生成的iterator对象也可以解构。
function* fibs() {
let a = 0;
let b = 1;
while (true) {
yield a;
[a, b] = [b, a + b]; // ⚠️ 千万不要理解成a=b;b=b+a;
// 解构赋值会先计算=右侧的值。所以会先计算出[b,a+b]的值,然后再进行解构
// 如第一次是[1,1]
}
};
const a = fibs();
a.next();// { value: 0, done: false } // a=1,b=1
a.next();// { value: 1, done: false } // a=1,b=2
a.next();// { value: 1, done: false } // a=2,b=3
a.next();// { value: 2, done: false } // a=3,b=5
a.next();// { value: 3, done: false }
a.next();// { value: 5, done: false }
let [first,second,third,four,five,six] = fibs();
console.log(first,second,third,four,five,six) // 0,1,1,2,3,5
数组解构允许设置默认值,=右侧的值为undefined时,左侧使用默认值
let [a=5,b=6, c=7] = [undefined,null,];
// a = 5, b=null, c=7
2.对象的解构赋值
对象解构的=右侧要求必须是对象,null或者undefined不能被解构,会报错!
对象的解构赋值其实本质上也是“模式匹配”。
let {foo, bar} = { foo: 'aaa', bar: 'bbb' }
因为对象可以简写,其实应该是下面的形式
let { foo: foo, bar: bar } = { foo: 'aaa', bar: 'bbb' };
解构赋值的变量其实是:后面的变量名,:前端的值相当于匹配的模式
let { hello: h, world: w } = { hello: 'hello', world: 'world'}
// h='hello' w = 'world'
对于对象的扩展运算符(ES2018)用于对象解构赋值
let { x, y, ...z } = { x:1, y:2, z:3, k:4}
// x = 1 y=2 z={z:3, k:4}
// ⚠️对于解构赋值来说,扩展运算符位于=左侧的时候只能用于最后一个元算,对于变量扩展来说...是剩余元素运算符。同理,作为函数参数的时候是参数对象的解构赋值,也只能用于最后一个参数
对于嵌套解构,普通属性可以在左侧变量声明中解构;但是扩展运算符...解构,不能用于嵌套解构。
let obj = {
web: {
js: {
nodejs: 'node',
reactjs: 'react'
}
}
}
const { web, web: {js}, web: {js: {nodejs, reactjs}}} = obj;
// web= { js: { nodejs: 'node', reactjs: 'react' } }
// js = { nodejs: 'node', reactjs: 'react' }
// nodejs = 'node'
// reactjs = 'react'
普通解构可以取到继承的原型对象上的属性;但是扩展运算符解构取不到原型对象上的属性。
let obj1 = { a:1, b:2, c:3, d:4 };
let obj2 = Object.create(obj1);
obj2.x = 5;
let { a, ...y} = obj2;
// 其中a是正常解构,可以取到原型对象上的属性;y是扩展解构,只能解构自身的属性
// a = 1, y = {x:5}
对象解构允许设置默认值
let { x: y = 1, z = 5, k: m=8} = { x:5, z:6 }
// y=5, z=6, m=8
⚠️1)先声明,再解构的情况
let x;
({x} = {}) // 必须有小括号,否则js引擎将{x}作为代码块处理
// x = undefined
2)数组是特殊对象,允许对数组进行对象解构赋值
const arr = [1,4,2,3];
let {0: first, [arr.length-1]: last, length} = arr;
console.log(first,last,length) // 1,3,4
3. 字符串解构赋值
对字符串使用解构赋值时,js引擎将字符串转为类数组对象String(),类数组都有length属性
let str = 'hello';
let [a,b,c,d,e] = str;// 数组解构 'h' 'e' 'l' 'l' 'o'
let { length } = str; // 对象解构 5
4. 数值和布尔值解构赋值
数值和布尔值进行赋值操作时,右侧的数值和布尔值会自动转为包装对象Number(),Boolean()
let { toString: s } = 124;
//s === Number.prototype.toString
5.函数参数解构赋值
函数参数的解构赋值类似数组,对象的解构赋值
[[1, 2], [3, 4]].map(([a, b]) => a + b);
对于参数的对象解构,注意默认值的赋值位置
function move1({a=0,b=0} = {}) { // 相当于给参数a,b赋初值
return [a,b]
}
function move2({a,b} = {a:0, b:0}) { // 相当于默认传参a = 0, b= 0,即不传参时的默认值
return [a,b]
}
console.log(move1()); // [0,0]
console.log(move2()); // [0,0]
console.log(move1({}));// [0,0]
console.log(move2({}));// [undefined,undefined]
console.log(move1({a: 3})); // [3,0]
console.log(move2({a: 3})); // [3,undefined]
6.小括号的使用
避免使用小括号。(
ES6-3 变量的解构赋值的更多相关文章
- es6之变量的解构赋值
es5中通常我们声明变量都是以下的方式: var a = 10; var b = 20; var c = 30; //或者 var a = 10,b = 20,c = 30; //或者 var arr ...
- es6分享——变量的解构赋值
变量的解构赋值:ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前的写法: var a = 1; var b = 2; es6允许的写法 ...
- ES6 继续 变量的解构赋值
春节放假这几天,感觉跟梦一样,瞬间就过去了.现在上班的前几天,都感觉有点不真实,不过看到口袋里的钱,就知道,是真真实实的度过了这个假期. 现在得开始重新工作了: 变量的解构赋值 ES6 允许按照一定模 ...
- ES6入门——变量的解构赋值
1.数组的解构赋值 以前为变量复制,只能直接指定值.现在ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 本质上,这种写法属于模式匹配,只要等 ...
- ES6中变量的解构赋值
1.数组的解构赋值 基本用法 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 输出: 上面代码表示,可以从数组中提取值,按照对应位置,对变 ...
- ES6 中变量的解构赋值
1. 数组的解构赋值 解构: ES6 中允许按照一定的模式从数组和对象中提取值,然后对变量进行赋值,这被称为解构(Destructuring). 1. 基本用法 本质上,这种写法属于"模式匹 ...
- es6系列-变量的解构赋值
git地址: https://github.com/rainnaZR/es6-study/tree/master/src/destructuring 变量的解构赋值 变量的解构赋值: 数组, 对象, ...
- ES6基础-变量的解构赋值
作者 | Jeskson 来源 | 达达前端小酒馆 解构赋值: 数组的解构赋值,对象的解构赋值,字符串的解构赋值,数值与布尔值的解构赋值,函数参数的解构赋值. 开发环境准备: 编辑器,VS Code, ...
- 【ES6】变量的解构赋值
1. 数组 var [a, b, c] = [1, 2, 3]; let [a, [b], d] = [1, [2, 3], 4]; 默认值生效的条件是,对象的属性值严格等于undefined. [x ...
- ES6 变量的解构赋值
数组的解构赋值 var [a,b,c] = [1,2,3]; 左边是变量,右边是值,根据数据结构一一对应 只要等号两边的模式相同,左边的变量就会被赋予右边对应的值,必须模式相同 如果等号 ...
随机推荐
- Python语言中各种进制相互转换
目录 Python语言中各种进制相互转换 将二进制.八进制.十进制的数分别转换成十进制的方法 将十进制转换成二进制.八进制.十六进制 Python语言中各种进制相互转换 本文参考自https://ww ...
- SAS学习笔记34 指针控制
指针控制符分为行指针和列指针两种 列指针控制符模式 @n:指明列的开始位置,是对应变量的数据开始列位置 列控制符号模式 n1-n2:n1列开始位置,n2列结束位置 @与@@符号应用 @行控制符号,控制 ...
- 谷歌浏览器添加插件时显示程序包无效:"CRX_HEADER_INVALID" 解决办法
今天在添加谷歌插件的时候,却发现谷歌浏览器显示 程序包无效:"CRX_HEADER_INVALID",现整理解决方法如下: 下图是下载好的 .crx 结尾的插件. 将插件的后缀名改 ...
- 轻松搭建CAS 5.x系列(9)-登录后显示通知信息
概述说明 用户在账号名密码认证通过后,CAS可以跳转到登陆完成页面前,显示相关的通知页面. 搭建步骤 `1. 首先,您需要有个CAS Server端 如果您没有,可以按照我之前写的文章<轻松搭建 ...
- 从零开始学ios开发(二):Hello World!
今天看了书的第二章,主要介绍了一下Xcode的使用方法和一些必要的说明,最后做了一个“Hello World!”的小程序,其实就是在屏幕上用一个Label显示“Hello World!”,一行代码都没 ...
- 巧用Ajax的beforeSend 提高用户体验--防止重复数据
巧用Ajax的beforeSend 提高用户体验 jQuery是经常使用的一个开源js框架,其中的$.ajax请求中有一个beforeSend方法,用于在向服务器发送请求前执行一些动作.具体可参考jQ ...
- C# explicit interface implementation(显式接口实现)
C# explicit interface implementation 某个类要实现两个包含相同方法名的接口, 应该如何实现这两个方法? namespace ExplicitInterfaceImp ...
- Myeclipse debug 调式java 报错,留做后面解决!
FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_INIT( ...
- 【原创】大叔经验分享(93)centos安装oracle客户端
1 下载客户端 官方下载地址:https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.ht ...
- bat实现守护程序保证平台正常运行
1.systeminfo查看系统最近一次重启时间: 2.杀进程: :start taskkill /f /im "xx.exe" goto start "xx.exe&q ...