結構賦值容許使用默認值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