? ? ? ES6中數(shù)組的擴展主要基于...擴展運算符,對象的擴展則是基于它本身的屬性和簡寫上的擴展保屯。首先說一下都會涉及到的Iterator接口唉俗,Iterator是一種機制,是遍歷那些具有集合(Array,Object,Set,Map)性質(zhì)的對象的機制,使得可以對于不同的數(shù)據(jù)結(jié)構(gòu)有著統(tǒng)一的訪問機制配椭,它提供給我們可以獲取這些集合中屬性和值的接口虫溜,同時在瀏覽器上呈現(xiàn)出一種規(guī)律的集合形式,還有新的訪問方法類似股缸,for...in..,for...of....衡楞,簡而言之就是具有數(shù)組結(jié)構(gòu)或者類數(shù)組結(jié)構(gòu)或者可以遍歷的數(shù)據(jù)都可以說具有iterator接口。
? ? ? ES6數(shù)組的擴展體現(xiàn)在擴展運算符...敦姻,它是基于Iterator接口瘾境,就是說具有Iterator接口的數(shù)據(jù)才能運用...。...用于參數(shù)上可以將數(shù)組轉(zhuǎn)化成逗號分開的參數(shù)序列镰惦,...用于數(shù)組中可以將字符串和數(shù)組互相轉(zhuǎn)化迷守,...替代apply方法將fun.apply(num,arr)==>fun(...arr),...與解析賦值結(jié)合為數(shù)組賦值旺入,合并數(shù)組兑凿,...將類數(shù)組或者說是可以遍歷的對象轉(zhuǎn)化成真正的數(shù)組凯力,將map、set礼华、generator函數(shù)生成的對象轉(zhuǎn)化成數(shù)組咐鹤,...[]不產(chǎn)生任何效果。不過這些用途圣絮,需要自己的探索和發(fā)現(xiàn)祈惶。
? ? ? ? ?Array.from可以將類似數(shù)組的對象(阮大大的解釋是具有l(wèi)ength屬性的對象)和具有可遍歷接口的對象;它能夠?qū)⒕哂蠭terator接口的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化為真正的數(shù)組扮匠。同時Array.from接受第二個參數(shù)類似map的作用即Array.from(obj,function(x){return x * x})==>Array.from(obj).map(function(x){return x * x});Array.of可以將一組值轉(zhuǎn)化成數(shù)組大致類似split;copyWithin(target,start,end)從start位置開始到end(end不存在就是到數(shù)組總長度)結(jié)束復制字符串替換到從target開始的位置然后返回當前數(shù)組( start,end為負值就表示倒數(shù)捧请,start默認為0,end默認為數(shù)組長度)棒搜;find找到第一個符合該條件的元素疹蛉,接受一個函數(shù)作為條件去查詢,找到了就是true否則是undefined帮非,findIndex呢是找到并返回第一個符合條件的元素的位置氧吐,如果不存在就是-1讹蘑,這就有點類似indexOf了末盔,不過它的使用方法和find一樣;fill填充數(shù)組座慰,也可以說是替換某個位置元素陨舱,當然如果補說具體位置的話,那就全給他替了版仔;includes 數(shù)組中是否包含某個元素類似indexof但是返回值不同游盲,而且相對比indeof更嚴格;直接使用Array(num)創(chuàng)建的數(shù)組里面的元素是空的沒有元素蛮粮,但是es6將它處理為undefined益缎,而es5則一般情況下會將它們給忽略掉。
? ? ? ? ?接下來說的是數(shù)組和對象擴展后都存在的新方法然想,entries(),keys(),values(),這些方法都是用來遍歷數(shù)組和對象的莺奔,entries()返回對應數(shù)組的index和value但是返回對應數(shù)組的key和value,keys就是返回數(shù)組的index和對象的key变泄,values就是返回對應位置的values令哟。
? ? ?對象的擴展提供了幾點便利,可以直接將某個變量寫到對象中妨蛹,其中變量名是key值屏富,變量值為value,當然如果有現(xiàn)成的key或者value另當別論蛙卤,我說的是{obj}狠半,當然也延伸到var o = {method(){}} ==>var o = {method:function(){}},反正就是怎么簡單怎么來噩死,能讓你看到基本認識就行,但是就是要簡單典予。擴展后對象的某個key值可以是表達式但是要用方括號擴起來(厲害了我的哥)甜滨,但是要是表達式表達key值還要做成又當key又當value是不可能的因為key一般是str這樣會造成數(shù)據(jù)出現(xiàn)錯誤;
? ? ? ?接下來是擴展后對象上屬性的改變瘤袖,首先是方法名name衣摩,傳統(tǒng)的普通函數(shù)name屬性獲取方法名,setter和getter函數(shù)的name則在對該方法的屬性描述對象上捂敌,bind生成的新函數(shù)name要在原函數(shù)名加bound艾扮,構(gòu)造函數(shù)生成的方法則需要加上個anoymous,至于symbol作為屬性的函數(shù)名則是symbol的描述(參數(shù))占婉;其次就是說說原來屬性的可枚舉性泡嘴,關(guān)于對屬性的描述可以具體看一下js高程三里的一章專門介紹屬性的描述,獲取的方法是getOwnPropertyDescriptor獲取屬性的屬性逆济,接著說它的枚舉性酌予,枚舉呢就是可遍歷,但是在屬性的屬性上有一項是禁止屬性被遍歷奖慌,可有的方法不同意啊抛虫,for...in..,object.keys,JSON.stringify,object.assign,其中assign只是拷貝對象自己的屬性原形鏈上的不考慮简僧,而這幾個不考慮可枚舉性的問題有時候會導致一些問題(挖個坑建椰,你們自己以后會碰到),ES6中class中的方法都是不可枚舉的。for...in,object.keys,getOwnPaopertyNames,getOwnPropertySymbols,reflect.ownKeys都可以獲取到對象的屬性只是獲取到的格式岛马,表現(xiàn)形式不同罷了棉姐,getOwnPropertyDescriptors一個getOwnPropertyDescriptor的集合版本;setPropertyOf設置一個對象的property啦逆,getPropertyOf獲取一個對象的property原型對象伞矩,對于設置對象的參數(shù),非對象轉(zhuǎn)化為對象夏志,轉(zhuǎn)化不了就報錯乃坤。
? ? ? 擴展方法,Object.is比較兩個值是否相等===盲镶,但是不同的是+0===-0侥袜,NaN!==NaN溉贿,object.is卻是相反枫吧;object.assign(target,...source)用于對象的可枚舉(可以遍歷到的)屬性合并,如果出現(xiàn)同名的屬性還會覆蓋,類似于淺拷貝(淺拷貝就是拷貝的是地址宇色,指針對數(shù)據(jù)的引用九杂,新數(shù)據(jù)會因為原來的數(shù)據(jù)變化而變化颁湖,深拷貝就是拷貝的是實實在在的數(shù)據(jù)),對于參數(shù)中非對象的數(shù)據(jù)例隆,如果在target位置就是能轉(zhuǎn)換轉(zhuǎn)換不能轉(zhuǎn)換就報錯甥捺,如果是source位置就是能轉(zhuǎn)換轉(zhuǎn)換不能轉(zhuǎn)換跳過,至于assign的用途就自己發(fā)掘吧镀层。