Array的擴展

1. Array.from( likeArrObj, [valueHandleFn], [thisObj] )

Array.from()用於將如下兩類對象轉化爲真正的數組:javascript

  • 相似數組的對象(array-like object,即自己 具備length屬性的對象
  • 可遍歷對象( 原型鏈上具備[Symbol.iterator]方法的對象 ,即具備iterator接口的iterable對象)

它接受三個參數:java

  • likeArrObj: 須要被轉化的對象
  • [valueHandleFn]: 用於處理該對象中每一個值的一個 遍歷函數 ,相似於map(),該參數可選。
  • [thisObj]: 用於 綁定[valueHandleFn]中的this ,也就是隻有使用了[valueHandleFn],它纔會有做用

它返回的是將該對象轉化成功後,獲得的數組。es6

1.1 代碼示例

let likeArrObj = {
    '0': 0,
    '1': 1,
    '2': 2,
    length: 3,
  }

  // ES5 的寫法 (兩種)
  var arr_es5_01 = Array.prototype.slice.call( likeArrObj )
  var arr_es5_02 = [].prototypr.slice.call( likeArrObj )

  // ES6 的寫法 (兩種)
  let arr_es6_01 = Array.from( likeArrObj )
  let arr_es6_02 = [...likeArrObj]

1.1.1 對代碼的說明:

  1. Array.prototype.slice( startNum, endNum ) 能夠淺複製一部分array元素,起始於startNum,終止於(endNum - 1)。

淺複製 是說只拷貝數組元素的內容,而無論該內容是否是指向另外一個值。數組

  • 通俗點講,就是隻拷貝一層數據。
    深複製 與淺複製對應,它會不只拷貝數組元素的內容,還會分析其內容是否爲一個「 指針 」類型的值,如對象,函數,數組等。
  • 若是是一個「 指針 」類型的值,則會繼續將其值下的全部內容通通複製一份.
  • 內容中的內容全要複製,直到其內容爲 undefinednullBooleanNumberStringSymbol 的一種。
  1. Function.prototype.call( thisObj, arg1, arg2, ..., argn ) 用於在運行時指定該函數的this綁定對象

thisObj 是須要綁定的對象
arg1, arg2, ..., argn 是該函數調用的參數
Function.prototype.apply( thisObj, argArr ) 與該方法功能一致,只是在參數傳遞上,使用的是一個數組形式app

  1. [...likeArrObj]中的 ... 是擴展運算符,它經過調用likeArrObj的 [Symbol.iterator]方法 來將其打散成一個個獨立的量,最後再用 [] 來將其合成一個新的數組,因此使用該寫法時,必定須要確保likeArrObj具備 [Symbol.iterator]方法

1.2 應用場景

它的常見應用場景:函數

  • document.querySelectorAll( str ) 返回的NodeList集合轉化爲真正的數組
  • arguments 對象轉化爲真正的數組

轉化爲真正的數組以後,就可使用 Array.prototype.forEach() 方法來操做該對象了。this

相關文章
相關標籤/搜索