结构赋值容许使用默认值html
let [foo = true] = []; foo // true
ES6 内部使用严格相等运算符(===),判断一个位置是否有值。因此,只有当一个数组成员严格等于undefined,默认值才会生效。c++
let [x = 1] = [undefined]; x//1; let [x=1] = [null]; x//null ;
对象的结构和数据的结构相似,但数组的结构是根据顺序决定的,对象的结构是根据未知决定的,变量名与键值对应才能取到值es6
let { foo: baz } = { foo: 'aaa', bar: 'bbb' }; baz // "aaa" let obj = { first: 'hello', last: 'world' }; let { first: f, last: l } = obj; f // 'hello' l // 'world'
字符串也能够结构赋值ajax
const [a, b, c, d, e] = 'hello'; a // "h" b // "e" c // "l" d // "l" e // "o"
字符串和数组的结构还有一个属性编程
let {length:yx}=[1,2,3,,4,,5,] yx // 7
结构赋值的用途
第一个用途交换变量的值数组
在es5中咱们须要用一个中间变量来转换交换变量的值,可是在es6中不须要 var x=4,y=5,c; c=x;x=y;y=c; 在es6中咱们直接能够用结构的方式直接交换 [x,y]=[y,x]
第二个用途是给函数设置默认值安全
jQuery.ajax = function (url, { async = true, beforeSend = function () {}, cache = true, complete = function () {}, crossDomain = false, global = true, // ... more config }) { // ... do stuff }; 指定参数的
第三个用途输入模块的制定的方法app
const {set,index} = require('set-index');
es6给字符串提供了遍历的方法async
for(let item of 'sdfsdf'){ console.log(item) }
es5中的正则修饰符g(全局匹配)/i(不区分大小写匹配)/m(多行匹配),es6中新增的修饰符u用来正确处理大于uFFFF的 Unicode 字符函数
/?{2}/.test('??') // false /?{2}/u.test('??') // true
es6中数组扩展运算符的用法
在es5中咱们能够这样求取数组的最大值 var arr=[1,2,4,5,5] Math.max.apply(null,arr) 在es6中咱们能够直接 Math.max(...arr)
扩展运算发在字符串中也一样可使用
var hello = 'hello'; console.log(...hello) //h e l l o
扩展运算符和Array.from()均可以将类数组(类数组说的普遍一点其实就含有length属性的对象)的对象转换为数组对象,但其内部实质调用时遍历器接口(Symbol.iterator))[https://www.cnblogs.com/toulo...]
对象属性的书写:在es5中咱们是不容许把对象的键写成变量或者是表达式,可是在es6中咱们能够把对象的键写成表达式,以及函数名也能够写成表达式的形势
var a = 'index' var obj = {a:5} obj // {a:5} es5中的写法 let obj = {[a]:5} obj // {index:5} es6中的写法会获得这样的结果 function [a](){}
var obj1={a:1,b:{c:2}} var obj2=Object.assign({},obj1) obj1.a++; obj1.b.c++; obj2 // {a:1,b:{c:3}}
Object.assign也能够用来处理数组,同位置的值进行替换,不一样位置的源数组的值添加到目标数组
Object.assign([1,2,4],['sdfs',4,{a:5},4,6]) ['sdfs',4,{a:5},4,6] 直接返回这样的结果
null运算符
编程实务中,若是读取对象内部的某个属性,每每须要判断一下该对象是否存在。好比,要读取message.body.user.firstName,安全的写法是写成下面这样。
const firstName = (message && message.body && message.body.user && message.body.user.firstName) || 'default';
这样的层层判断很是麻烦,所以如今有一个提案,引入了“Null 传导运算符”(null propagation operator)?.,简化上面的写法。
const firstName = message?.body?.user?.firstName || 'default';
扩展
// 若是 a 是 null 或 undefined, 返回 undefined // 不然返回 a.b.c().d a?.b.c().d // 若是 a 是 null 或 undefined,下面的语句不产生任何效果 // 不然执行 a.b = 42 a?.b = 42 // 若是 a 是 null 或 undefined,下面的语句不产生任何效果 delete a?.b