JavaScript数据结构【数组3】

108 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情 昨天学习ECMAScript 6 和数组的新功能中的for...of的循环迭代,以及一些拓展,今天继续往后学习

一、使用@@iterator对象

首先的得会读是吧

和之前见过的方法不同的是:为Array新增的这个@@iterator属性,需要通过Symbol.iterator来访问到

语法array[Symbol.iterator]()

至于更详细的介绍可以参加阮一峰老师的ECMAScript 6 入门,书中对相关iteratorSymbol有比较深刻的理解,@@iterator用法及描述可以参见@@iterator

ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。

至于iterator挂在Symbol,是不是确保了命名的唯一性,不会出现冲突的现象

使用迭代器的next方法

let array = [1, 2, 3]
let arr = array[Symbol.iterator]()
console.log(arr.next());
console.log(arr.next());
console.log(arr.next());
console.log(arr.next());
/**
结果:
    { value: 1, done: false }
    { value: 2, done: false }
    { value: 3, done: false }
    { value: undefined, done: true }
 */

可以看到,通过不断的调用next方法,就能依次得到数组中的值,所有值迭代完后,value属性变为undefined,done属性变为true,表示跌打完毕,别再调了,地主家没余粮了

既然可以逐个迭代,那可不可以直接一步到位,那肯定是可以的

let array = [1, 2, 3]
let arr = array[Symbol.iterator]()
for (let key of arr) {
  console.log(key);
}
/*
结果:
    1
    2
    3
*/

二、使用from方法

描述回顾:

根据已有的数组创建一个新数组

举例一: 复制一个数组

let array = [[1, 2, 3], 4, 5]
let arrayCopy = Array.from(array)
console.log(arrayCopy);   //复制后的数组
array[0][0] = 10          //修改原数组中内置数组的值
console.log(arrayCopy);
/**
结果:
    [ [ 1, 2, 3 ], 4, 5 ]
    [ [ 10, 2, 3 ], 4, 5 ]
 */

可以看到用from的方法可以复制一个数组,但采用的方法是浅拷贝,遇到内部的引用数据类型复制的是地址值,所以什么时候能用,什么使用不能用不用多说了吧

举例二: 复制一个数组,并添加一个条件->判断每一项是奇数还是偶数,并返回判断结果,奇数为false,偶数为true

let array = [1, 2, 3, 4, 5]
let arrayCopy = Array.from(array, x => x % 2 === 0)
console.log(arrayCopy);
/**
 * 结果:[ false, true, false, true, false ]
 */

三、使用Array.of方法

描述回顾:

通过可变数量的参数创建一个新的 Array 实例,而不考虑参数的数量或类型。

let array = Array.of(1, 2, 3, 4)
console.log(array);
/**
 * 结果:[ 1, 2, 3, 4 ]
 */

乍一看,好像和常规方法创建数组没什么区别,确实如此吗?参见Array.of()方法介绍

四、使用fill方法

描述回顾:

用一个固定值填充一个数组中从起始索引到终止索引内的全部元素。不包括终止索引。

示例:

let array = [1, 2, 3, 4];
console.log(array);
console.log(array.fill(0, 2, 4));		//三个参数:value start end
/**
结果:
    [ 1, 2, 3, 4 ]
    [ 1, 2, 0, 0 ]
 */

参数说明:

value:用来填充数组元素的值。

start(可选):起始索引,默认值为 0。

end (可选): 终止索引,默认值为 arr.length。