热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ECMAScript6(2):解构赋值

解构赋值解构赋值简朴来讲就是对应位置(数组)或对应键名(对象)的变量婚配历程。假如婚配失利,关于平常变量婚配不到效果就是undefined,关于具有睁开运算符(…)的变量效果就是空

解构赋值

解构赋值简朴来讲就是 对应位置(数组)或对应键名(对象)的变量婚配历程。假如婚配失利, 关于平常变量婚配不到效果就是 undefined, 关于具有睁开运算符(…)的变量效果就是空数组。

数组的解构赋值

var [a, b, c] = [1, 2, 3]; //a=1, b=2, c=3
var [, , c] = [1, 2, 3]; //c=3
var [x, , y] = [1, 2, 3]; //x=1, y=3
var [head, ...tail] = [1, 2, 3, 4]; //head = 1, tail = [2, 3, 4];
var [x, y, ...z] = [1]; //x=1, y=undefined, z=[];
var [a, [b, c], d] = [1, [2, 3], 4]; //a=1.b=2, c=3, d=4
var [a, [b], d] = [1, [2, 3], 4]; //a=1.b=2, d=4

数组的解构赋值能够具有默许值, 在 ES6中关于目的数据运用严厉相称(===)比较是不是为空(undedined)。假如默许值是表达式, 那末关于该表达式采纳惰性求值, 即只要在对应位置为空(undedined)时才实行该表达式。

var [a=1, b] = []; //a=1, b=undefined
var [a=1, b] = [2, 3]; //a=2, b=3
var [a=1, b] = [undefined, 3]; //a=1.b=3
var [a=1, b] = [null, 3]; //a=null, b=3
var [a=1, b] = [NaN, 3]; //a=NaN, b=3
function f(){
console.log("done");
return 2;
}
var [a=f()] = [1]; //a=1
var [a=f()] = []; //a=2, 输出 "done"

解构赋值的右边表达式在必要的隐式转换后假如不具有 iterator 则遍历失利, 关于 iterator, 详细看iterator部份。这里能够先记着, 左侧是数组构造的解构赋值, 右边能够是数组, 字符串, 鸠合, Generator 函数, map等。

//字符串
var [a, b, c, d] = "123"; //a='1', b='2', c='3', d=undefined
//鸠合
var [a, b, c] = new Set(['1', '2', '3']); //a='1', b='2', c='3'
//Generator
function* fib(){
let a = 1;
let b = 1;
while(1){
yield a;
[a, b] = [b, a + b]; //运用构造赋值完成叠加并交流变量
}
}
var [a, b, c, d, e, f] = fib(); //a=1, b=1, c=2, d=3, e=5, f=8
//map
var map = new Map();
map.set('a', 1);
map.set('b', 2);
var [a, b] = map; //a=['a', 1], b=['b', 2]

对象的解构赋值

对象的解构赋值与变量位置序次无关, 只取决于键名是不是严厉相称(===)。假如婚配失利, 效果就是 undefined

var {a, b, f} = {b:2, a:3, d:4}; //a=3, b=2, f=undefined
var node = {
loc: {
start:{
x:1,
y:2
}
}
};
var {loc: {start: {x:line}}} = node; //line=1

能够在复制时对属性重命名, 但此时原名只用于婚配参数, 不天生变量:

var {name:alias} = {name:'Bob'}; //alias='Bob'
console.log(name); //"global"
console.log(alias); //"Bob"

对象解构一样能够指定默许值, 默许值见效(或表达式被行)的前提是对应属性值严厉即是(===) undefined

var {a:3, b} = {b:2}; //a=3, b=2
var {a:3, b} = {a:null, b:2}; //a=null, b=2

解构嵌套对象父属性不存在会报错:

var {foo:{bar}} = {ba: 2}; //报错

解构对象假如和声明离开, 自力成为一行要加圆括号, 就想用 eval 剖析 JSON 字符串的时刻一样。由于体系会把一行开头花括号默许作为块级作用域的最先, 而不是对象的最先。

var a, b;
({a, b} = {a:2, b:10}); //a=2, b=10
{a, b} = {a:2, b:10}; //报错
//以下表达式无意义, 但没有错
({}=[1, 2]);
({}="abc");
({}=[]);

注重, 除了如许的状况, 不要滥用圆括号

右边变量经由过程隐式范例转换能够转为对象的状况下也能够构造赋值:

var {toString: s} = 123; //s=Number.prototype.toString

技能: 解构的用途许多, 包含交流变量, 简化传参(可带默许值),

//参数通报
function f([x, y, z=4]){
return [x+1, y+2, z+3];
}
var [a, b, c] = f([1, 2]); //a=2, b=4, c=7
[[1, 2], [3, 4]].map(([a, b]) => a + b); //返回 [3, 7]

//交流变量
var a=2, b=4;
[a, b] = [b, a]; //a=4, b=2

推荐阅读
  • 作用域链迷惑性代码vara100;functiontest(){console.log(a);}functiontestFun(){vara200;test();}不假思索的想到出 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 获取时间的函数js代码,js获取时区代码
    本文目录一览:1、js获取服务器时间(动态)2 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文整理了Java中org.apache.hadoop.hive.ql.plan.ExprNodeColumnDesc.getTypeInfo()方法的一些代码示例,展 ... [详细]
  • KVC:Key-valuecodingisamechanismforindirectlyaccessinganobject’sattributesandrelations ... [详细]
  • fileuploadJS@sectionscripts{<scriptsrc~Contentjsfileuploadvendorjquery.ui.widget.js ... [详细]
author-avatar
静静静静静静妹儿_
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有