1.数组的解构赋值

1.1 基本用法

解构赋值:在ES6中 ,按照一定模式从数组和对象中提取值,然后对变量进行赋值,这被称为解构赋值。
本质:这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。

let [foo,[bar],baz]=[1,[2],3]
foo //
bar //
baz //

如果j解构不成功,变量的值就为undefined

let [x,y,...z]=['a']
x // 'a'
y // undefined
z // []

1.2 默认值

解构赋值允许指定默认值

let [foo=true]=[];
foo // true

ES6内部使用严格相等于运算符(===)来判断一个位置是否有值,如果数组的成员不严格等于undefined,默认值就不会生效。即,一个位置的值不是undefined,那么即使设置了默认值,也不会有效。

let [x=1]=[undefined]
x // let [x=1] =[null] x // null

2.对象的解构赋值

let {foo,bar}={foo:'abc',bar:'xyz'}

foo // 'abc'
bar // 'xyz'

2.1 当变量名和属性名相同时

let {foo,bar}={foo:'abc',bar:'xyz'}
foo // 'abc'
bar // 'xyz'
上述代码的实质应该是:
let {foo:foo,bar:bar}={foo:'abc',bar:'xyz'}
// 当变量名和属性名一样时,可以简写 {foo,bar}来代替{foo:foo,bar:bar}

对象解构赋值的内部机制:是先找到同名属性,然后再赋值给对应的变量。真正赋值的是后者,而不是前者

2.2 当变量名与属性名不同时:

let {foo:hello,bar:world}={foo:'abc',bar:'xyz'}
hello // 'abc'
world // 'xyz'
foo // error: foo is not defined

foo是匹配的模式,hello才是整正的变量

数组解构赋值与对象结构赋值的差异

数组的元素是按次序排列的,变量的取值由位置决定;而对象没有次序,变量名必须与属性名相同,才能取到正确的值。

3.字符串的解构赋值

字符串结构赋值的时候,字符串被转换成了一个类似数组的对象

const [a,b,c,d,e]='hello'
a // 'h'
b // 'e'
c // 'l'
d // 'l'
e // 'o'


//这种类数组的对象,有length属性,因此也可以对length属性进行解构赋值
let {length:len}='hello'
len //
 

4.数值和布尔值的解构赋值

数值和布尔值进行解构赋值的时候,会先转换为对象

let {toString:s} = 123
s // Number.prototype.toString let {toString:s} = true s // Boolean.prototype.toString //数值对象和布尔值的包装对象都有toString属性,因为变量s可以取到值

解构赋值的规则:只要等号右边的值不是数组或者对象,就先将其转化为对象,由于null和undefined无法转化为对象,所以对他们解构赋值会报错

let {proxy:x}=undefined;
x // TypeError let {proxy:y} = null;
y // TypeError

5.函数参数的解构赋值

function add ([x,y]){
return x+y;
} add([1,2]) //

6.用途

6.1 交换变量的值

没有解构赋值的情况下,交换两个变量需要一个临时变量

let x=1;
let y=2;
[x,y] = [y,x]
x //
y //

6.2 从函数中返回多个值

从一个函数返回一个数组是十分常见的情况
但是函数只能返回一个值,如果需要返回多个值,只能将他放在数组或者对象里返回,有了结构赋值,取出这些值就非常方便

// 返回数组
function example(){
return [1,2,3]
} let [a,b,c]=example()
a //
b //
c // // 返回对象
function example(){
return {
foo:1,
bar:2
}
} let [foo,bar]=example()
foo //
bar //

6.3 函数参数的定义

解构赋值,可以很方便的将一组参数与变量名对应起来

6.4 提取JSON数据

解构赋值在提取JSON数据尤为有用

let jsonData = {
id:42,
status:"OK",
data:[23,45]
} let {id,status,data}=jsonData console.log(id,status,data)
// 42,"OK",[23,45]

6.5 定义函数参数的默认值

避免在函数体内部再写 var foo = config.foo || "default foo"这样的语句

   jQuery.ajax= function(url,{
asyc=true,
beforeSend=function(){},
cache=true,
complete=function(){},
crossDomain=false,
global = true,
// .... more config
}){
// ... do stuff
}

6.6 遍历Map结构

任何部署了Iterator接口的对象都可以使用for...of循环遍历
Map结构原生支持Iterator接口,配合变量的解构赋值,获取键名和键值都非常方便

    var map = new Map()
map.set("first",'hello')
map.set("second",'world') for (const [key,value] of map) {
console.log(key + "is" +value)
} // first is hello
// second is world // 只想获取键名
for (const [key] of map) {
//
}
// 只想获取键值
for (const [,value] of map) {
//
}

6.7 引入模块中的某些方法

cosnt {sourceMapConsumer,SourceNode} = require('source-map')

注:该笔记仅为学习参考地址:阮一峰《ES6标准入门》(http://es6.ruanyifeng.com/#docs/destructuring)

ES6---变量解构赋值的更多相关文章

  1. ES6变量解构赋值

    ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构ES6之前我们申明多个变量需要按照下面的方法: let l a=1; let b=2; let c=3; let d=4; ...

  2. es6变量解构赋值的用途

    这里是我觉得es6解构赋值,在平时我们写js的时候非常有用,而且经常用到的地方,能简化我们的代码,让写代码简介优雅易读; 用途 1.交换变量的值,太方便了这逼,写法不仅简介而且一看就明白 let [x ...

  3. ES6变量解构赋值的用法

    一.数组赋值(从数组中提取值,按照对应位置,对变量赋值) 1. 完全解构(变量与值数目相等) let arr = [1, 2, 3]; let [a,b,c] = arr; console.log(a ...

  4. ES6的变量解构赋值

      前  言 ES6 解构赋值: ES6允许按照一定模式从数组和对象中提取值,然后对变量进行赋值,这被称为解构. 1.1 数组的结构赋值 1.1.1基本用法 JS中,为变量赋值直接指定.例如下面代码: ...

  5. ECMAScript6学习笔记 ——let、const、变量解构赋值

    let 不存在变量提升 通过let声明的变量仅在块级作用域内有效 不允许在同一个作用域内重复声明一个变量 防止值公用 var oUl = document.querySelectorAll('ul&g ...

  6. ES6 的解构赋值前每次都创建一个对象吗?会加重 GC 的负担吗?

    本文来源于知乎上的一个提问. 为了程序的易读性,我们会使用 ES6 的解构赋值: function f({a,b}){} f({a:1,b:2}); 这个例子的函数调用中,会真的产生一个对象吗?如果会 ...

  7. 【es6】变量解构赋值

    1.数组解构赋值 let [a,b,c]=[1,2,3];//数组解构赋值,注意:左右两边格式需一致 let [a,b]=[1,2,3];//不完全解构,取位置靠前的值 let [a=1,b]=[un ...

  8. ES6之解构赋值

    截止到ES6,共有6种声明变量的方法,分别是var .function以及新增的let.const.import和class: 我们通常的赋值方法是: var foo='foo'; function ...

  9. 进军es6(2)---解构赋值

    本该两周之前就该总结的,但最近一直在忙校招实习的事,耽误了很久.目前依然在等待阿里HR面后的结果中...但愿好事多磨!在阿里的某轮面试中面试官问到了es6的掌握情况,说明es6真的是大势所趋,我们更需 ...

  10. es6的解构赋值学习(1)

    相对es5的简单的"="赋值来说,es6增加了一种新的赋值模式--解构赋值,按照它的规则,可以从数组和对象中提取值来对变量进行赋值,个人觉得方便了很多,但是这个模式有点恶心人,相比 ...

随机推荐

  1. JMeter 压测Server Agent无法监控资源问题,PerfMon Metrics Collector报Waiting for sample,Error loading results file - see file log, Can't accept UDP connections java.net.BindException: Address already in use 各种疑难杂症

    如何安装插件此博主已经说得很详细了. https://www.cnblogs.com/saryli/p/6596647.html 但是需注意几点: 1.修改默认端口,这样可以避免掉一个问题.Serve ...

  2. 怎样实现给DEDE5.7的栏目增加栏目图片

    前两天用DEDE做二次开发的时候,遇到一个问题,领导让给每个栏目增加一个栏目图片的功能,网上找了些东西,结合自己实际做的时候的方法,下面详细描述下具体的实现方式(只测试了V5.7版本,对低版本是否适用 ...

  3. Ubuntu server 安装及jdk+mysql安装教程

    Ubuntu server 安装教程 1.查找及下载Ubuntu镜像文件 可以在以下页面下载想要的版本,我这里选择19.04 server版的iso镜像文件: http://mirrors.163.c ...

  4. Web应用程序并发问题处理的一点小经验

    在web应用中,一个账户,会有N多个涉及到数字的字段.比如一个账户的金额,积分等.这些字段就涉及到增减的情况.如果是在测试环境下,靠程序员或者测试手动点击.一般是发现不了问题. 一旦上到正式环境下.有 ...

  5. Spring Boot WebFlux 增删改查完整实战 demo

    03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello .这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD ...

  6. springboot配置logback日志

    springboot配置logback日志 java web 下有好几种日志框架,比如:logback,log4j,log4j2(slj4f 并不是一种日志框架,它相当于定义了规范,实现了这个规范的日 ...

  7. Codeforces1141F_Same Sum Blocks

    题意 给定一个序列,求最多的不相交区间满足区间和相同. 分析 从暴力的角度想,是枚举区间再求和,反过来想,直接记录每个和对应是那些区间,然后排个序求最大不相交即可. 代码 #include <b ...

  8. 防止CSRF跨站请求伪造

    CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站 ...

  9. vc++木马源码免杀一些常用方法

    1.字符串连接 ////////////////////////////////////////////////////////////把字符串"canxin"连接起来(字符串连接 ...

  10. 物理机安装Kali Linux + Windows10双系统安装教程

    转自 https://www.linuxidc.com/Linux/2018-08/153429.htm 一.镜像下载: 根据需求下载自己需要的版本 从官网下载kali 2018.2 的安装包:htt ...