ES6入門筆記(三)

數組的擴展

1.Array.from()

Array.from方法用于將兩類對象轉為真正的數組:類似數組的對象(array-like object:本質特征只有一點,即必須有length屬性)和可遍歷(iterable)的對象

但是這里有個問題,arr1要怎么打印出來,arr2可以打印

實際應用中類似數組的對象式DOM操作返回的NodeList集合,以及函數內部的arguments對象,有點難以理解吧,請看實例

下面這張圖片說明,字符串和Set結構都具有Iterator(可遍歷)接口,因此可以被Array.from轉化為真正的數組

對于還沒有部署該方法的瀏覽器,可以用Array.prototype ,slice方法替代

這種寫法真心看不懂

Array.from還可以接受第二個參數,作用類似于數組的map方法,用來對每個元素進行處理,就昂處理后的值放入返回的數組

=>據說會在第7章講到

Array.from()的另一個應用是,將字符串轉為數組,然后返回字符串的長度。因為它能正確處理各種Unicode字符,可以避免js將大于\uFFFF的Unicode字符算作兩個字符的bug

2、Array.of()

Array.of()方法用于將一組值,轉換為數組

Array.of基本上可以用來替代Array()或new Array(),并且不存在由于參數不同而導致的重載

3、數組實例的copyWithin(),它的作用是將指定位置的成員復制到其他位置(會覆蓋原有成員),然后返回當前數組。也就是說,使用這個方法,會修改當前數組

它接收三個參數

-target 必需(從該誒之開始替換數據)

-start (可選):從該位置開始讀取數據,默認為0,負數表示倒數

-end(可選):到該位置前停止讀取數據,默認等于數組長度。

4、數組實例的find()和findIndex()

數組find()用于找出第一個符合條件的數組成員,它的參數是一個回調函數,所有數組成員依次執行該回調函數,直到找出第一個返回值為true的成員,然后返回該成員。如果沒有符合條件的成員,則返回undefined

find方法的回調函數可以接受三個參數,依次為當前的值value、當前的位置index和原數組arr

findIndex與find()方法非常類似,返回第一個符合條件的數組成員的位置,如果所有的成員都不符合條件,則返回-1

這兩方法都可以發現NaN,彌補了數組的IndexOf方法的不足

5、數組的實例fill()

fill方法使用給定值,填充一個數組

fill方法還可以接受第二個和第三個參數,用于指定填充的起始位置和結束位置

6、數組實例的entries、keys()、values()

這三個新的方法都返回一個遍歷器對象,它們的區別keys()是對鍵名的遍歷,entries()是對鍵值對的遍歷,values是對鍵值的遍歷

7、數組實例的includes()

Array.prototype.includes方法返回一個布爾值,表示某個數組是否包含給定的值,與字符串的includes方法類似

沒有該方法之前,我們通常使用數組的indexof方法,檢查是否包含某個值。但是indexof有兩個缺點,一是不夠語義化,而是,它內部使用楊哥相等運算符(===)進行判斷,這會導致對NaN的誤判

8、數組的空位

數組的空位值,數組的某一個位置沒有任何值。空位不是undefined,一個位置的值等于undefined,依然是有值的。空位時沒有任何值,in運算符可以說明這一點

第一個數組的0號位置是有值的,第二個數組的0號位置沒有值


函數的擴展

參數已經聲明,所以不能再用let或者const再次聲明

使用默認參數時,函數不能有同名函數

函數的length屬性

指定了默認值以后,函數的length屬性,將返回沒有指定默認值得參數的個數,也就是說,指定了默認值參數,length屬性將失真

如果設置了默認值得參數不是尾參數,那么length屬性也不再計入后面的參數了

作用域

一旦設置了參數的默認值,參數會形成一個單獨的作用域,等到初始化結束,這個作用域就會消失(如果不設置參數默認值,是不會出現的)

這個已經設置了參數,形成了單獨的作用域
這里的x參數并沒有聲明,因此沒有形成一個單獨的作用域,所以它的輸出值是1

如果參數的默認值是一個函數,該函數的作用域也遵守這個規則

bar函數的參數的默認值是一個匿名函數,返回值為變量foo。函數參數形成的單獨作用域里面,并沒有定義變量foo,所以foo指向外層的全局變量foo


注意下區別

reset函數(形式為“...”變量名)

它的作用是獲取函數的多余參數,這樣就不需要使用arguments對象了,rest參數搭配的變量是一個數組,該變量將多余的參數放入數組中

不是很明白這種寫法

rest參數中的變量代表一個數組(...變量名)好奇怪的寫法

不過這樣子寫的話就很好理解了

注意reset參數之后不能再有其他參數(即只能是最后一個參數),否則會報錯

函數lenght屬性,不包括rest參數

擴展運算符(spread...)

它的作用好比reset參數的逆運算,將一個數組轉為用逗號分隔的參數序列

這里小結下,reset是多余的參數中放入到數組中,而擴展運算符是將數組轉為用逗號分隔的參數序列

替代數組的apply方法

由于擴展運算符可以展開數組,所以不再需要apply方法,將數組轉為函數的參數了

看看這個例子,之前不明白ES5的寫法為什么一定要加上apply的方法,現在明白了,是因為push方法的參數不能是數組,所以只好通過apply方法變通使用push方法

擴展運算符的應用

1)合并數組

2)與解構賦值結合

擴展運算符用于數組賦值,只能放在參數的最后一位

3)函數的返回值

擴展運算符可以返回多個值

4)字符串

擴展運算符還可以經字符串轉為真正的數組

5)實現了遍歷接口的對象

var nodelist = document.querySelectorAll('div');

var array = [...nodeList];

但是對于沒有不熟遍歷接口類似數組的對象,可以使用Array.from方法獎arrayLike轉為整整的數組

6)Map和Set結構,Generator函數

反正只要有遍歷接口,都可以使用擴展運算符

name屬性,返回該函數的函數名

注意:1)如果將一個匿名函數賦給一個便令,ES5的name屬性,返回空字符串,而ES6的name屬性會返回實際的函數名

2)如果將一個具名函數賦值給一個變量,則ES5和ES6的那么屬性都返回這個具名函數原本的名字

3)Function構造函數返回的函數實例,那么屬性的值為anonymous,bind返回的函數,name 屬性值會加上bound前綴

箭頭函數

之前我是不太明白這種寫法的,現在一看就明白了,=>這個后面是返回值的意思

如果返回值是一個對象的話,那么使用括號

再看看幾個例子

簡化回調函數

注意點:函數體內的this對象,就是定義時所在的對象,而不是使用時所在的對象

setTimeout函數的this指向window,所以結果是21;而setTimeout的參數是一個箭頭函數,this指向函數定義生效時所在的對象(本例是{id:42}),所以結果是42

上面的Timer函數內部設置了兩個定時器,分別使用了箭頭函數和普通函數,前者的this綁定定義所在的作用域(timer函數),后者的this指向運行時所在的作用域(即全局對象)

this指向的固定化,并不是因為箭頭函數內部有綁定this的機制,實際原因是箭頭函數更笨沒有自己的this,導致內部的this就是外層代碼塊的this.正式因為他沒有this,所以也就不能用作構造函數

除了this,arguments\super\new.target在箭頭函數之中也是不存在的,所以當然也不用call()、apply()、bind()這些方法去改變this的指向

綁定this(Es7提出了函數綁定運算符,但是Babel轉碼器已經支持)

函數綁定運算符并排的兩個冒號(::),雙冒號左邊是一個對象,右邊是一個函數,該運算符會自動將左邊的對象,作為上下文環境,綁定到右邊的函數上面

尾調用:是函數式變成的一個重要改變,就是只某個函數的最后一步是調用另一個函數

只有第四種屬于尾部調用,第三種和第五種是一樣的意思

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,481評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,241評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,697評論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,182評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,406評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,933評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,772評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,973評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,644評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,953評論 2 373

推薦閱讀更多精彩內容

  • 三,字符串擴展 3.1 Unicode表示法 ES6 做出了改進,只要將碼點放入大括號,就能正確解讀該字符。有了這...
    eastbaby閱讀 1,552評論 0 8
  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創建并操作數組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,261評論 0 4
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,532評論 1 51
  • 民國二十六年的夏天,對陳家鋪子的人來說,是一個災難性的夏天。 史載,這一年:蒲臺正覺寺黃河大堤十華里被...
    涅槃鳳凰飛閱讀 1,476評論 8 3
  • 或許有時候我一直在想 找到像我一樣的人會有多難 迷茫于缺少志同道合的人 甚至覺得這個世界只有我一樣
    安舊閱讀 115評論 0 0