es6-----數組的擴展

Array.from() :   用於將兩類對象轉化爲數組

let arr1 = {

   '1':'a',

   '2':'b',

    '3':'c',

   length:3

}

let arr2 = Array.from(arr1)

arr2 ---- ['a','b','c']

 

Array.from() 還可以將對象中只有長度屬性的轉換成數組,得到的數組是多少長度的undefined的值

如果瀏覽器不支持這個寫法,可以使用  Array.prototype.slice代替

 

const toArray = (() =>
  Array.from ? Array.from : obj => [].slice.call(obj)
)();

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

Array.from([1,2,3],(x) => x * x)

//  1  4   9

獲取dom節點的文本內容

let span = document.querySelectorAll('span name')

let name = Array.from(span, s => s.textContent ) 

布爾值

Array.from( [1,,2,,3],(n) => n || 0 )

[1,0,2,0,3]

返回各種數據類型

function typeOf() {

    return Array.from(arguments,value => typeof value )

}

typeOf( null, [] , NaN )

//   [ 'object' , 'object' , 'number']

 

 

Array.from() 還有一個應用就是可以將  字符串 轉化成 數組, 然後返回字符串的長度,

因爲它能正確處理各種unicode字符

function countSymbols(string) {

   return Array.from(string).length

}

 

 

 

---------------------------------------------------------------------------------------------------------------------------------------

 

擴展運算符(...)

 使用擴展運算符也可以將對象轉換成數組

擴展運算符的應用:

     1:  合併數組    

var arr1 = ['a', 'b'];
var arr2 = ['c'];
var arr3 = ['d', 'e'];

// ES5的合併數組
arr1.concat(arr2, arr3);
// [ 'a', 'b', 'c', 'd', 'e' ]

// ES6的合併數組
[...arr1, ...arr2, ...arr3]
// [ 'a', 'b', 'c', 'd', 'e' ]

      2: 與解構賦值結合,生成數組

       

// ES5
a = list[0], rest = list.slice(1)
// ES6
[a, ...rest] = list

       如果將擴展運算符用於數組賦值,只能放在參數的最後一位,否則會報錯

    3:  函數的返回值   如果函數需要返回多個值,就可以使用到擴展運算符

var dateFields = readDateFields(database);
var d = new Date(...dateFields);

        4:  字符串  將字符串轉換成真正的數組

[...'hello']
// [ "h", "e", "l", "l", "o" ]

        5:  實現了Iterator接口的對象

var nodeList = document.querySelectorAll('div');
var array = [...nodeList];

     6:  Map, Set結構,Generator函數   擴展運算符內部調用的是數據結構的Iterator接口,因此只要有Iterator接口的對象都可以使用

 

 

 

Array.of()     用於將一組 值 轉化成 數組

Array.of()  [ ] 

Array.of(undefined)  undefined

 Array.of(3,2,1)     ===>  [3,2,1]

Array.of(3)          ====> [3]

Array.of(2,1).length ===> 2

Array.of() 總是把參數值組成數組,如果沒有參數,則返回一個空數組

 

 Array() 後面可以接數組,也可以什麼都不接,什麼都不接代表空數組,一個數代表長度,數值爲空,多個數表示一個數組

 

copyWithin()    再當前數組內部,將指定位置的成員複製到其他位置上(原本數據會被覆蓋)

Array.prototype.copyWithin( target , start = 0 , end = this.length )

target 必填 從該位置開始替換數據

start 可選 從該位置開始讀取數據,默認值爲0 ,如果爲負數,表示倒數

end  可選  到該位置停止讀取數據,默認等於數組長度,如果爲負數,表示倒數

這三個參數都是數組,如果不是數組會自動轉換成數值

 

find()  findIndex()

find() 用於找出 第一個 符合條件的數組成員,它的參數是一個回調函數,所有數組

成員依次執行該回調函數,直到找出第一個返回值,返回該返回值,如果沒有找到則

返回undefined

find() 的回調函數可以接受三個參數, 第一個爲當前的值, 第二個爲 當前值的位置

第三個是原數組

[ 1,2,3,10].find( (n) => n >9 )

//  10

[ 1,2,3,10].find( ( value , index , arr ) => return value)

//  

 findIndex() 返回第一個符合條件的數組成員的位置,如果沒有成員符合條件,則返回-1

findIndex() 可以藉助Object.is()來識別數組的NaN成員

 

fill() 給定值,填充數組

將數組中的元素全部抹去

['a', 'b', 'c'].fill(7)
// [7, 7, 7]

new Array(3).fill(7)
// [7, 7, 7]

fill()  還可以接受三個參數,第二個參數表示填充的起始位置, 第三個表示填充的結束位置

['a', 'b', 'c'].fill(7, 1, 2)
// ['a', 7, 'c']

entries()  keys()  values()

entries()  對鍵值對進行遍歷

keys()  對鍵名進行遍歷

values()  對鍵值進行遍歷

                 三者可以是使用for ...of進行遍歷

for ( let index of ['a],'b'].keys()) {

    console.log(index)   //0  //1
 }


for ( let el of ['c','d'].values()){

    console.log(el)  //c //d
}


for ( let [index,value] of ['a','v'].entries()){
    
    console.log(index,value)  // 0 "a" // 1 "v"
}

如果不適用for ..of 循環,可以手動調用遍歷器對象的next方法,進行遍歷

let arr = ['1','2','3']
let entries = arr.entries()

console.log(entries.next().value)  //[0.'1']
console.log(entries.next().value); // [1, '2']
console.log(entries.next().value); // [2, '3']

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

[1, 2, 3].includes(2);     // true
[1, 2, 3].includes(4);     // false
[1, 2, NaN].includes(NaN); // true

includes(n,m)  m表示搜索的起始位置,如果值爲負數表示倒數的位置,如果位置大於長度會重置爲0

                        n表示搜索的數值

[1, 2, 3].includes(3, 3);  // false
[1, 2, 3].includes(3, -1); // true

下面代碼用來檢查當前環境是否支持該方法,如果不支持,部署一個簡易的替代版本。

const contains = (() =>
  Array.prototype.includes
    ? (arr, value) => arr.includes(value)
    : (arr, value) => arr.some(el => el === value)
)();
contains(["foo", "bar"], "baz"); // => false

數組的空位  空位指的是數組中的某個值爲空,也就是沒有任何值

                  注意 空位並不是Undefined , 一個位置的值是undefined,依然是有值的

es6明確將空位轉爲undefined, 空位不能忽略

Array.from() 方法將數組的空位轉化爲undefined, 

擴展運算符(...) 也會將空位轉化爲undefined

copyWithin() 會連空位一個複製過去

fill()  將空位視爲正常的數組位置

for ...or  循環的時候會連空位也一起循環遍歷

entries()  keys()  values()  find()  findIndex()  都將空位視爲undefined

 

由於空位的處理規則非常不統一,請避免出現空位

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章