开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情 昨天学习ECMAScript 6 和数组的新功能中的for...of的循环迭代,以及一些拓展,今天继续往后学习
一、使用@@iterator对象
首先的得会读是吧
和之前见过的方法不同的是:为Array新增的这个@@iterator属性,需要通过Symbol.iterator来访问到
语法:array[Symbol.iterator]()
至于更详细的介绍可以参加阮一峰老师的ECMAScript 6 入门,书中对相关iterator和Symbol有比较深刻的理解,@@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。