数组扩展

数组新增特性

Array.fromArray.ofcopyWithin
find/findIndexfillentries/keys/values
includes
{
    // 一组数字转换成数组
    let arr = Array.of(3,4,7,9,11);
    console.log('arr=',arr);// [3,4,7,9,11]
    
    // 不传入参数,返回的是空数组
    let empty=Array.of();
    console.log('empty',empty);// []
}

{
    // 把伪数组,集合转换成真正的数组
    let p=document.querySelectorAll('p');
    let pArr=Array.from(p);
    // forEach方法只能遍历真正的数组
    pArr.forEach(function(item){
        console.log(item.textContent);
    });
   
    // Array.from还有一个类似于数组方法中国map的功能,除了第一个参数外,还有第二个参数是一个函数
    // 转换数组的同时还遍历了数组并计算返回新的数组
    console.log(Array.from([1,3,5],function(item){return item*2})); // [2,6,10]
}

{
    console.log('fill-7',[1,'a',undefined].fill(7)); // [7,7,7]
    
    // 替换,第一个参数表示替换的值,第二个参数表示从哪开始替换(包含起始索引),第三个参数表示到哪结束,不包含结束索引
    console.log('fill,pos',['a','b','c'].fill(7,1,3));// [a,7,7]
}
{
    for (let index of ['a', 'b'].keys()) {
        console.log(index);
    }
    // 0
    // 1
    
    // 有兼容问题,需要补丁
    for (let elem of ['a', 'b'].values()) {
        console.log(elem);
    }
    // 'a'
    // 'b'
    
    for (let [index, elem] of ['a', 'b'].entries()) {
        console.log(index, elem);
    }
    // 0 "a"
    // 1 "b"
    
    //如果不使用for...of循环,可以手动调用遍历器对象的next方法,进行遍历。

    let letter = ['a', 'b', 'c'];
    let entries = letter.entries();
    console.log(entries.next().value); // [0, 'a']
    console.log(entries.next().value); // [1, 'b']
    console.log(entries.next().value); // [2, 'c']
}

{
    // 第一个参数 替换
    // Array.prototype.copyWithin(target, start = 0, end = this.length)
    // target(必需):从该位置开始替换数据。
    // start(可选):从该位置开始读取数据,默认为0。如果为负值,表示倒数。
    // end(可选):到该位置前停止读取数据,默认等于数组长度。如果为负值,表示倒数。
    [1, 2, 3, 4, 5].copyWithin(0, 3)
    // [4, 5, 3, 4, 5]
    console.log([1,2,3,4,5].copyWithin(0,3,4)); 
    // [4,2,3,4,5]
}

{
    // 找出第一个符合条件的返回
    console.log([1,2,3,4,5,6].find(function(item){return item>3})); // 4
    
    // 找出第一个符合条件的值的索引值
    console.log([1,2,3,4,5,6].findIndex(function(item){return item>3})); // 3
}


{
    // Array.prototype.includes方法返回一个布尔值
    console.log('number',[1,2,NaN].includes(1)); // true
    console.log('number',[1,2,NaN].includes(NaN)); // true
    
    [1, 2, 3].includes(4)     // false
    
    //该方法的第二个参数表示搜索的起始位置,默认为0。如果第二个参数为负数,则表示倒数的位置,如果这时它大于数组长度(比如第二个参数为-4,但数组长度为3),则会重置为从0开始。
    [1, 2, 3].includes(3, 3);  // false
    [1, 2, 3].includes(3, -1); // true
    
    // NAN是不能做相等运算的
    // es5中使用indexOf检查是否包含某一个值
    arr.indexOf(el)!==-1
    // indexOf一不够语义化,二是内部使用严格相等运算符(===)进行判断,会产生对NAN的误判
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96

es6中的数组方法会对数组空位转为undefined

ES5 对空位的处理,已经很不一致了,大多数情况下会忽略空位。

  • forEach(), filter(), every() 和some()都会跳过空位。
  • map()会跳过空位,但会保留这个值
  • join()和toString()会将空位视为undefined,而undefined和null会被处理成空字符串。