js数组迭代方法,迭代对象必须实现哪些方法
这篇文章给大家带来了一些关于javascript的知识,包括类数组和iterable对象的实现原理,包括把对象本身构造成迭代器,String的迭代器等等。下面就来看看吧,希望对你有帮助。
【相关推荐:javascript视频教程,web前端】
可迭代对象(Iterable object)
数组是一种特殊的对象,在元素的顺序访问和存储上不同于普通对象。另一个重要的区别是数组可以被迭代,也就是说,所有元素都可以通过使用.的声明。
我们可以简单地做一个小实验:
设arr=[1,2,3,4,5]for(let val of arr){
Console.log(val)}代码执行结果:
上面的代码简单地使用了数组的迭代特性。当我们访问数组的元素时,我们不必使用元素的下标。
如果我们使用for,会发生什么.普通对象的语句。
让obj={
姓名:小明,
年龄:12,}for(let para of obj){ //代码会报错。
Console.log(para)}执行效果如下:
这证明了普通对象和数组之间还是有迭代间隙的。我们称迭代函数为可迭代对象的对象。
Symbol.iterator
如果我们想让一个对象迭代,我们必须给对象添加一个名为Symbol.iterator(一个专门让对象迭代的内置符号)的方法。
该方法包括:
当对象循环访问的.循环中,调用Symbol.iterator方法,该方法必须返回迭代器(使用next()方法的对象)。获取迭代器后,对于.of会不断调用迭代器的next()方法来获取下一个元素。next()方法返回的内容必须符合格式:{done:Boolean,value:any}。当done:true时,循环结束,否则value是下一个值。实现迭代对象:
让obj={
出发地:1,
to:5,} obj[symbol . iterator]=function(){
//返回迭代器
返回{
当前:this.from
最后:this.to,
下一个(){
if(this.currentthis.last){
return {done:false,value:this.current }
}否则{
Return {done:true}//迭代结束
}
}
}}for(let para of obj){
Console.log(para)}代码执行效果:
注意,虽然上面的对象可以迭代,但是迭代中使用的材料不是对象,而是Symbol.iterator返回的迭代器(也是对象)
把对象本身构造成迭代器
以上代码构造了一个内置函数Symbol.iterator(),该函数返回一个iterator对象。我们还可以用另一种方式实现迭代器:让对象本身成为迭代器:
让obj={
出发地:1,
到:5,
[Symbol.iterator](){
this.current=this.from
还这个;//返回对象本身
},
Next(){//向对象添加下一个方法
如果(this.currentthis.to){
return {done:false,value:this.current }
}否则{
返回{done:true}
}
}}for(let para of obj){
Console.log(para)}代码执行效果同上图所示。
我们可以总结可迭代对象的概念:
所谓iterable对象就是一个名为Symbol.iterator的普通对象,返回一个迭代器。
或者,带有Symbol.iterator和next方法的对象也是迭代对象。
String也是可迭代的
数组和字符串都可以迭代。我们可以很容易地使用.语句循环访问数组中的字符元素:
let str=123for(let c of str){
Console.log(c)}这也适用于代理对(UTF-16扩展字符):
让str= . for(字符串的字母c){
console.log(c)}的执行效果如下:
String的迭代器
不仅适用于.of语句可以使用迭代器,但我们也可以显式调用迭代器:
let str= 12345 let itr=str[symbol . iterator]()while(true){
let result=itr.next()
if(result.done)中断;
Console.log(result.value)}代码执行效果:
上面的代码执行遍历字符串字符的操作。是不是觉得可迭代对象没那么神秘了!
类数组对象和可迭代对象
类数组和迭代在遍历函数上非常相似,都可以方便地拥有内部元素,但两者还是有明显的区别:
迭代对象:实现Symbol.iterator的对象;类数组类数组对象:带有数值索引和长度属性;字符串是一个可以迭代的对象,即使它是一个类数组。
迭代和类数组对象通常不是数组。如果我们想把一个迭代或类数组对象变成数组,我们需要使用Array.from方法。
Array.from
使用Array.from将字符串转换为数组:
str= 123 let arr=array . from(str)console . log(arr)代码执行效果如下:
将自定义类数组对象转换为数组:
让obj={
0:0,
1:1,
2:2,
length:3 } let arr=array . from(obj)console . log(arr)代码执行结果:
Array.from的完整语法:
在生成数组之前,将对每个iterable或class数组元素调用array.from (obj [,mapFunc,thisArg]) mapfunc方法。如果mapfunc是一个成员方法,可以使用thisarg来提供这个指针。
例如:
str= 12345 let arr=array . from(str,ITM=ITM) console.log (arr)代码执行结果:
这里,通过映射函数,将本应生成的字符数组转换为数字数组。
总结
可以使用的对象.的语法称为可迭代对象迭代对象。Symbol.iterator方法是在普通对象的基础上实现Symbol.iterator方法并返回迭代器的对象;迭代器包含next方法,返回下一个元素的值;下一个方法的返回值需要满足格式{done:Boolean,value:nextVal}。done:true时,Array.from可以在迭代结束时将类数组和iterable对象变成数组;
【相关推荐:javascript视频教程,web前端】以上是JavaScript类数组和iterable对象实现原理的详细内容。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。