引言:
本文涉及内容包括:
- forEach方法
- for-in方法
- for-of方法
- eval()方法
- map()方法
今天来总结一下,JS中我们常见的循环方式与迭代器,深入了解他们之间的区别,及适合的使用场景。
最早的数组遍历方式
var a = ["a", "b", "c"]; for(var index = 0;index < a.length;index++){ console.log(a[index]); }
for循环,我们最熟悉也是最常用的循环迭代方式,后来的许多迭代方法都是基于for循环封装的。
1 forEach
语法:[].forEach(function(value, index, array) { // ... });
forEach遍历数组,而不是遍历对象哦,而且在遍历的过程中不能被终止,必须每一个值遍历一遍后才能停下来. 也就是说:你不能使用break来退出循环, 不能使用return语句来返回到外层 jquery中forEach 注意其与jQuery的$.each类似,只不过参数正好是相反的! $.each([], function(index, value, array) { // ... });
2 for...in 适合进行普通对象的遍历 for-in循环遍历对象的key,即键值对的键名。 特性如下: 1. 方法遍历到的index(或key)类型为String,若无意间进行了字符串计算,会带来许多不便。 2. for-in循环会遍历对象的所有可枚举属性。什么意思呢?就是除了遍历数组元素之外,还会遍历:自定义属性,原型上的属性。 3. 一般不推荐遍历数组,因为for in遍历顺序是随机的,适合进行普通对象的遍历。
var myArry =[1,2,3,4]; myArry.desc ='four'; for(var value in myArry){ //循环key console.log(value) } //"0" //"1" //"2" //"3" //"desc"
注意这里添加上去的属性也被遍历出来了 for…in由于历史遗留问题,它遍历的实际上是对象的属性名称,一个Array数据也是一个对象,数组中的每个元素的索引被视为属性名称,所以我们可以看到使用for…in循环Array数组时,拿到的其实是每个元素的索引. PS:若要避免原型链上的属性也被遍历到,可采用hasOwnProperty()方法去过滤掉对象原型链上的属性。 for…of for-of循环适合遍历数组 循环遍历对象的值,即键值对的键值。
var myArry =[1,2,3,4]; myArry.desc ='four'; for(var value of myArry){ console.log(value) } //1 //2 //3 //4
特性如下:
- 这是最简洁、最直接的遍历数组元素的语法。
- 这个方法避开了for-in循环的所有缺陷,解决了forEach的不可中断问题。
- for…of为ES6新增方法。
- 不推荐for…of遍历普通对象,实在需要用for…of遍历,可搭配Object.keys()实现。
代码如下:
var student={ name:'wujunchuan', age:22, locate:{ country:'china', city:'xiamen', school:'XMUT' } } for(var key of Object.keys(student)){ //使用Object.keys()方法获取对象key的数组 console.log(key+": "+student[key]); }
for…of
for-of循环适合遍历数组
循环遍历对象的值,即键值对的键值。
var myArry =[1,2,3,4]; myArry.desc ='four'; for(var value of myArry){ console.log(value) } //1 //2 //3 //4
特性如下:
- 这是最简洁、最直接的遍历数组元素的语法。
- 这个方法避开了for-in循环的所有缺陷,解决了forEach的不可中断问题。
- for…of为ES6新增方法。
- 不推荐for…of遍历普通对象,实在需要用for…of遍历,可搭配Object.keys()实现。
代码如下:
var student={ name:'wujunchuan', age:22, locate:{ country:'china', city:'xiamen', school:'XMUT' } } for(var key of Object.keys(student)){ //使用Object.keys()方法获取对象key的数组 console.log(key+": "+student[key]); }
总结:
for…in与for…of
语法格式对比:
for (var key in arr){ console.log(arr[key]); } for (var value of arr){ console.log(value); }
-
推荐在循环对象属性的时候,使用
for...in
,在遍历数组的时候的时候使用for...of
。 -
for in
是遍历键名,for of是遍历键值。 -
注意,
for...of
是ES6新引入的特性。修复了ES5引入的for...in
的不足。
map()方法
map理解为“映射”的意思,基本用法同forEach,为ES5新增属性方法。
❤map()方法返回一个新数组,数组中的元素为原始数组元素调用函数处理的后值。
❤map()方法按照原始数组元素顺序依次处理元素。
注意:
map不会对空数组进行检测
map不会改变原始数组
处理函数必须有返回值,否则会映射成undefined。
map使用语法:
arr.map(function(currentValue,index,arr),thisValue)
参数:
1. 处理函数(必须),下属参数依次为:当前值value,序号index,原数组arr。
2. thisValue(可选)
❤另外,由于map方法为ES5新增方法,不支持IE9以下浏览器。如果需要兼容,可用原型扩展。
方法如下:
if (typeof Array.prototype.map != "function") { Array.prototype.map = function (fn, context) { var arr = []; if (typeof fn === "function") { for (var k = 0, length = this.length; k < length; k++) { arr.push(fn.call(context, this[k], k, this)); } } return arr; }; }
jquery中map方法用法同原生
且从 1.6 开始,该函数也支持遍历对象。它接受两个参数,分别是要处理的数组/对象和处理函数,其处理函数也接受键值和键名两个参数。
/**** jQuery $.map() ****/ // 筛选数组元素 var arrTmp = [1,2,3,4,5]; var bigNum = $.map(arrTmp,function(num){ if(num>2){ return num; } }); // bigNum -> [3,4,5] // 处理对象 var person = { jack:{age:9}, tom:{age:20}, bobo:{age:30} } var oldMan = $.map(person,function(value,key){ if(value.age>26){ return key; } }) // oldMan -> ["bobo"]
map定义和方法
map理解为“映射”的意思,基本用法同forEach,为ES5新增属性方法。
❤map()方法返回一个新数组,数组中的元素为原始数组元素调用函数处理的后值。
❤map()方法按照原始数组元素顺序依次处理元素。
注意:
map不会对空数组进行检测
map不会改变原始数组
处理函数必须有返回值,否则会映射成undefined。
map使用语法:
arr.map(function(currentValue,index,arr),thisValue)
1
参数:
1. 处理函数(必须),下属参数依次为:当前值value,序号index,原数组arr。
2. thisValue(可选)
❤另外,由于map方法为ES5新增方法,不支持IE9以下浏览器。如果需要兼容,可用原型扩展。
方法如下:
if (typeof Array.prototype.map != "function") { Array.prototype.map = function (fn, context) { var arr = []; if (typeof fn === "function") { for (var k = 0, length = this.length; k < length; k++) { arr.push(fn.call(context, this[k], k, this)); } } return arr; }; }
jquery中map方法用法同原生
且从 1.6 开始,该函数也支持遍历对象。它接受两个参数,分别是要处理的数组/对象和处理函数,其处理函数也接受键值和键名两个参数。
/**** jQuery $.map() ****/ // 筛选数组元素 var arrTmp = [1,2,3,4,5]; var bigNum = $.map(arrTmp,function(num){ if(num>2){ return num; } }); // bigNum -> [3,4,5] // 处理对象 var person = { jack:{age:9}, tom:{age:20}, bobo:{age:30} } var oldMan = $.map(person,function(value,key){ if(value.age>26){ return key; } }) // oldMan -> ["bobo"]
eval()方法
eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
注意:
strong text该方法只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该方法将不作任何改变地返回。
例子:
<script type="text/javascript"> eval("x=10;y=20;document.write(x*y)") document.write(eval("2+2")) var x=10 document.write(eval(x+17)) </script>
JavaScript中的迭代器与循环原创Little_ChenH 最后发布于2018-03-19 16:32:28 阅读数 1119 收藏展开引言:本文涉及内容包括:
forEach方法for-in方法for-of方法eval()方法map()方法今天来总结一下,JS中我们常见的循环方式与迭代器,深入了解他们之间的区别,及适合的使用场景。
最早的数组遍历方式var a = ["a", "b", "c"];for(var index = 0;index < a.length;index++){ console.log(a[index]);}1234for循环,我们最熟悉也是最常用的循环迭代方式,后来的许多迭代方法都是基于for循环封装的。
1 forEach语法:
[].forEach(function(value, index, array) { // ... });1forEach遍历数组,而不是遍历对象哦,而且在遍历的过程中不能被终止,必须每一个值遍历一遍后才能停下来.也就是说:你不能使用break来退出循环, 不能使用return语句来返回到外层
jquery中forEach注意其与jQuery的$.each类似,只不过参数正好是相反的!
$.each([], function(index, value, array) { // ... });12 for...in适合进行普通对象的遍历for-in循环遍历对象的key,即键值对的键名。
特性如下:1. 方法遍历到的index(或key)类型为String,若无意间进行了字符串计算,会带来许多不便。2. for-in循环会遍历对象的所有可枚举属性。什么意思呢?就是除了遍历数组元素之外,还会遍历:自定义属性,原型上的属性。3. 一般不推荐遍历数组,因为for in遍历顺序是随机的,适合进行普通对象的遍历。
var myArry =[1,2,3,4];myArry.desc ='four'; for(var value in myArry){ //循环key console.log(value)}//"0"//"1"//"2"//"3"//"desc" 注意这里添加上去的属性也被遍历出来了12345678910for…in由于历史遗留问题,它遍历的实际上是对象的属性名称,一个Array数据也是一个对象,数组中的每个元素的索引被视为属性名称,所以我们可以看到使用for…in循环Array数组时,拿到的其实是每个元素的索引.
PS:若要避免原型链上的属性也被遍历到,可采用hasOwnProperty()方法去过滤掉对象原型链上的属性。
for…offor-of循环适合遍历数组循环遍历对象的值,即键值对的键值。
var myArry =[1,2,3,4];myArry.desc ='four';for(var value of myArry){ console.log(value)}//1//2//3//4123456789特性如下:- 这是最简洁、最直接的遍历数组元素的语法。- 这个方法避开了for-in循环的所有缺陷,解决了forEach的不可中断问题。- for…of为ES6新增方法。- 不推荐for…of遍历普通对象,实在需要用for…of遍历,可搭配Object.keys()实现。代码如下:
var student={ name:'wujunchuan', age:22, locate:{ country:'china', city:'xiamen', school:'XMUT' }}for(var key of Object.keys(student)){ //使用Object.keys()方法获取对象key的数组 console.log(key+": "+student[key]);}12345678910111213for…offor-of循环适合遍历数组循环遍历对象的值,即键值对的键值。
var myArry =[1,2,3,4];myArry.desc ='four';for(var value of myArry){ console.log(value)}//1//2//3//4123456789特性如下:- 这是最简洁、最直接的遍历数组元素的语法。- 这个方法避开了for-in循环的所有缺陷,解决了forEach的不可中断问题。- for…of为ES6新增方法。- 不推荐for…of遍历普通对象,实在需要用for…of遍历,可搭配Object.keys()实现。代码如下:
var student={ name:'wujunchuan', age:22, locate:{ country:'china', city:'xiamen', school:'XMUT' }}for(var key of Object.keys(student)){ //使用Object.keys()方法获取对象key的数组 console.log(key+": "+student[key]);}12345678910111213总结:for…in与for…of语法格式对比:
for (var key in arr){ console.log(arr[key]);}
for (var value of arr){ console.log(value);}1234567推荐在循环对象属性的时候,使用for...in,在遍历数组的时候的时候使用for...of。
for in是遍历键名,for of是遍历键值。
注意,for...of是ES6新引入的特性。修复了ES5引入的for...in的不足。
map()方法map理解为“映射”的意思,基本用法同forEach,为ES5新增属性方法。
❤map()方法返回一个新数组,数组中的元素为原始数组元素调用函数处理的后值。❤map()方法按照原始数组元素顺序依次处理元素。
注意:map不会对空数组进行检测map不会改变原始数组处理函数必须有返回值,否则会映射成undefined。map使用语法:
arr.map(function(currentValue,index,arr),thisValue)1参数:1. 处理函数(必须),下属参数依次为:当前值value,序号index,原数组arr。2. thisValue(可选)
❤另外,由于map方法为ES5新增方法,不支持IE9以下浏览器。如果需要兼容,可用原型扩展。方法如下:
if (typeof Array.prototype.map != "function") { Array.prototype.map = function (fn, context) { var arr = []; if (typeof fn === "function") { for (var k = 0, length = this.length; k < length; k++) { arr.push(fn.call(context, this[k], k, this)); } } return arr; };}1234567891011jquery中map方法用法同原生且从 1.6 开始,该函数也支持遍历对象。它接受两个参数,分别是要处理的数组/对象和处理函数,其处理函数也接受键值和键名两个参数。
/**** jQuery $.map() ****/
// 筛选数组元素var arrTmp = [1,2,3,4,5];var bigNum = $.map(arrTmp,function(num){ if(num>2){ return num; }});// bigNum -> [3,4,5]
// 处理对象var person = { jack:{age:9}, tom:{age:20}, bobo:{age:30}}
var oldMan = $.map(person,function(value,key){
if(value.age>26){
return key; }})
// oldMan -> ["bobo"]123456789101112131415161718192021222324252627map定义和方法map理解为“映射”的意思,基本用法同forEach,为ES5新增属性方法。
❤map()方法返回一个新数组,数组中的元素为原始数组元素调用函数处理的后值。❤map()方法按照原始数组元素顺序依次处理元素。
注意:map不会对空数组进行检测map不会改变原始数组处理函数必须有返回值,否则会映射成undefined。map使用语法:
arr.map(function(currentValue,index,arr),thisValue)1参数:1. 处理函数(必须),下属参数依次为:当前值value,序号index,原数组arr。2. thisValue(可选)
❤另外,由于map方法为ES5新增方法,不支持IE9以下浏览器。如果需要兼容,可用原型扩展。方法如下:
if (typeof Array.prototype.map != "function") { Array.prototype.map = function (fn, context) { var arr = []; if (typeof fn === "function") { for (var k = 0, length = this.length; k < length; k++) { arr.push(fn.call(context, this[k], k, this)); } } return arr; };}1234567891011jquery中map方法用法同原生且从 1.6 开始,该函数也支持遍历对象。它接受两个参数,分别是要处理的数组/对象和处理函数,其处理函数也接受键值和键名两个参数。
/**** jQuery $.map() ****/
// 筛选数组元素var arrTmp = [1,2,3,4,5];var bigNum = $.map(arrTmp,function(num){ if(num>2){ return num; }});// bigNum -> [3,4,5]
// 处理对象var person = { jack:{age:9}, tom:{age:20}, bobo:{age:30}}
var oldMan = $.map(person,function(value,key){
if(value.age>26){
return key; }})
// oldMan -> ["bobo"]123456789101112131415161718192021222324252627eval()方法eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
注意:strong text该方法只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该方法将不作任何改变地返回。例子:
<script type="text/javascript">
eval("x=10;y=20;document.write(x*y)")
document.write(eval("2+2"))
var x=10document.write(eval(x+17))
</script>————————————————版权声明:本文为CSDN博主「Little_ChenH」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/Little_ChenH/article/details/79613562