JS中的一些遍历方法
1、遍历数组
以下遍历方法中for循环性能最好,而且优化版for循环性能最高。只有forEach不能跳出循环。
在循环数组时,如果在循环过程中对数组进行了增删改,那么在后面的每次循环中,进行操作的都是已经修改过后的数组。
let arr = ['a','b','c','d'];
for (let i = 0; i < arr.length; i++) {
const element = arr[i];
if(i ==0 || i ==1) {
arr.splice(i, 1);
}
}
console.log(arr); //此时输出 ["b", "d"] 而不是 ["c", "d"],即实际上删除了 a、c
1.1、for循环
该循环可以使用 break、continue 来跳出循环,若该循环放在函数体内则可以使用 return ,return 只能在函数体内使用。
var arr = [1,2,3]
for(var i=0; i<arr.length; i++) {
console.log(arr[i]) //1,2,3
}
//优化版for循环,对于较大的数组优化比较明显
for(var i=0,len = arr.length; i<len; i++) {
console.log(arr[i]) //1,2,3
}
注意,以上循环是先判断再执行,第一次执行也需判断
1.2、forEach循环
forEach循环每个元素是值。
该循环无法中途跳出循环,break、continue、return都无法使用。
var arr = [1,2,3]
arr.forEach(function(value, index, arr){
console.log(value, index, arr)
})
//value:必需,当前数组元素的值
//index:可选,当前元素的索引
//arr:可选,当前元素所属的数组对象
1.3、for...in循环
for...in循环每个元素是索引,该循环效率比较低。for...in 循环不太适用于遍历数组,主要是为遍历对象而设计的。
该循环可以使用 break、continue 来跳出循环,若该循环放在函数体内则也可以使用 return 。
//用于数组
var arr = [1,2,3,4]
for (var i in arr) {
console.log(arr[i]) //1,2,3,4
}
//用于对象
var obj = {'a':1, 'b':2, 'c':3}
for (var j in obj) {
console.log(obj[j]) //1,2,3
}
1.4、for...of循环 (es6新引入)
for...of循环每个元素是值。该循环不支持对象。
该循环可以使用 break、continue 来跳出循环,若该循环放在函数体内则也可以使用 return。
var arr = [1,2,3]
for (var value of arr) {
console.log(value)
}
for (var value of arr) {
if(value> 2)
break; //break跳出循环
console.log(value)
} //输出:1 2
1.5、map循环
map 循环可以遍历数组
map的回调函数中支持 return返回值,return 后面的值将返回作为新数组的元素,原数组不会改变。
array.map(function(val,index,arr){})
let arr = ['a','b','c'];
arr.map(function(val,index,arr){
console.log(val,index,arr); // ["a", "b", "c"]
})
let arr2 = arr.map(function(val,index,arr){
return 'new '+val;
})
console.log(arr2) //["new a", "new b", "new c"]
2、遍历对象
2.1、可枚举性的概念
对象的每个属性都有一个描述对象(Descriptor),用来控制该属性的行为。Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象。
let obj = { foo: 123 };
Object.getOwnPropertyDescriptor(obj, 'foo')
// {
// value: 123,
// writable: true,
// enumerable: true,
// configurable: true
// }
描述对象的enumerable属性,称为“可枚举性”,如果该属性为false,某些操作比如一些遍历操作会忽略当前属性。
目前,有四个操作会忽略enumerable为false的属性。
for...in
循环:只遍历对象自身的和继承的可枚举的属性。Object.keys()
:返回对象自身的所有可枚举的属性的键名。JSON.stringify()
:只串行化对象自身的可枚举的属性。Object.assign()
:忽略enumerable
为false
的属性,只拷贝对象自身的可枚举的属性。
2.2、for...in方法遍历
该遍历方法输出的是对象自身的属性以及原型链上可枚举的属性。不含Symbol属性。(包含所有可枚举的)(不含 Symbol 的)
var obj = {
'name': "wen",
'age': '12',
};
Object.prototype.country = 'china'; //在原型链上添加属性,默认的可枚举性是 true
console.log(obj);
for (var index in obj) {
console.log(index,obj[index])
}
2.2、利用Object.keys(obj)实现遍历
Object.keys返回一个数组,该数组由对象自身的所有可枚举属性的键名组成。(只包含自身可枚举的)(不含 Symbol 的,不含继承的)
var obj = {
'name': "wen",
'age': '12',
};
Object.keys(obj).forEach(function(item){
console.log(obj[item]);
})
2.3、Object.getOwnPropertyNames(obj)
Object.getOwnPropertyNames返回一个数组,该对象由对象自身所有的属性的键名组成。(包括自身所有的)(不含 Symbol 的,不含继承的)
2.4、Reflect.ownKeys(obj)
Reflect.ownKeys返回一个数组,包含对象自身的所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。(包含所有的除了继承)
3、跳出循环:break、continue
3.1、break(结束整个循环操作)
for(var i=1;i<=10;i++) {
if(i==8) {
break;
}
console.log(i) //1234567
}
但是要注意,break语句跳出的是自己所在的那一层 for 循环语法,如果有多个 for 循环嵌套,break 总是跳出自己所在的那一层 for 循环。
for (let i=1; i<=10; i++) {
for (let j=1; j<=10; j++) {
if (j >= i) {
break;
}
}
// break 只是跳到这里,外层的for循环还在继续
console.log('break');
}
3.2、continue(跳过本次循环,继续执行下一个循环)
for(var i=1;i<=10;i++) {
if(i==8) {
continue;
}
console.log(i) //1234567910
}
3.3、return
return语句只能出现在函数体内,出现在代码中的其他任何地方都会造成语法错误!return语句就是用于指定函数返回的值。
function a() {
for(let i=0; i<10; i++){
console.log(i);
if(i==3){
return 'aaa';
}
}
}
console.log(a());
//报错:Uncaught SyntaxError: Illegal return statement
for(var i=1;i<=10;i++) {
if(i==8) {
return;
}
console.log(i)
}
JS中的一些遍历方法的更多相关文章
- js中的数组遍历
js中的数组遍历是项目中经常用到的,在这里将几种方法做个对比. ! for循环:使用评率最高,也是最基本的一种遍历方式. let arr = ['a','b','c','d','e']; for (l ...
- node.js中的url.parse方法使用说明
node.js中的url.parse方法使用说明:https://blog.csdn.net/swimming_in_it_/article/details/77439975 版权声明:本文为博主原创 ...
- JS中的对象和方法简单剖析
众所周知,在js中对象就是精髓,不理解对象就是不理解js. 那么什么事js中的对象呢? 在js中,几乎一切皆对象: Boolean ,String,Number可以是对象(或者说原生数据被认作对象): ...
- JS 中的数组遍历方式效率比较
JS数组遍历,基本就是for,forin,foreach,forof,map等等一些方法,以下介绍几种本文分析用到的数组遍历方式以及进行性能分析对比 第一种:普通for循环 代码如下: ; j < ...
- 项目中一次排序规则的改动,注意到js中map的遍历的顺序
背景:项目需要对前端页面上某个插件的下拉选择项进行排序,需要按照配置的顺序显示. 首先调查后台,发现sql语句中已经添加order by.之后发现查询结果遍历后封装进HashMap,这里改为LinkH ...
- js中4种遍历语法比较
前言:本文主要比较for.for-in.forEach和for-of的异同以及优缺点. for for循环是最原始最易理解的循环遍历方式 for(var index = 0;index < ar ...
- phpcms抛出的二维数组转移到js,js中for....in遍历数组,用“.”连接来读出一维数组值
直切正题: 1.phpcms在模版中读出数组有很多中方法,如,{pc:content action="lists"}或{pc:get sql=""},经过{lo ...
- JS中 call() 与apply 方法
1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...
- JS中定义类的方法
JS中定义类的方式有很多种: 1.工厂方式 function Car(){ var ocar = new Object; ocar.color = "blue" ...
随机推荐
- statistic_action
方差variance 统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数.V 离差平方和(Sum of Squares of Deviations)是各项与平均项之差的平方的 ...
- 测开之路七十七:shell之if、case、for、while
选择语句(if语句) 大于:-gt判断目录是否存在:-d if [ 判断条件 ]; then statement1 Statement2elif [ 判断条件 ]; then statement1 S ...
- RichEdit 学习
procedure TForm1.AddText(RichEdit: TRichEdit; Str: string; TextColor: TColor = clBlack; FontName: st ...
- Maven入门学习 (一)
学习Java 的同学就一定会学习Maven, 那么Maven为什么会得到大量用户的使用呢?它是用来干什么的呢 ?接下来就来介绍 Q:Maven的作用? (1)Maven可以自动化构建项目,可以从清理. ...
- python3 -tensorflow-dataset 之map函数 lambda隐函数的应用
###隐函数lanbda及map函数的应用实例 ''' lambda 参数1,参数2,参数3,...:表达式 ''' f = lambda x,y :x+y print(f(1,2)) ###输出3 ...
- Node.js实战4:标准IO及console对像。
IO即输入输出. console用于Nodejs程序信息输出. Nodejs的IO操作,通过process.stdout.process.stdin来操作. 下面的例子,将简单展示这两个函数的用法.程 ...
- BZOJ 5450 轰炸 (强连通缩点+DAG最长路)
<题目链接> 题目大意: 有n座城市,城市之间建立了m条有向的地下通道.你需要发起若干轮轰炸,每轮可以轰炸任意多个城市.但每次轰炸的城市中,不能存在两个不同的城市i,j满足可以通过地道从城 ...
- Leetcode Lect2 Java 中的 Interface
什么是 Interface Java接口(Interface)是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以 ...
- Java 8实战之读书笔记五:超越Java 8
四.超越Java 8 第13章 函数式的思考 下面是这一章中你应该掌握的关键概念. 从长远看,减少共享的可变数据结构能帮助你降低维护和调试程序的代价. 函数式编程支持无副作用的 ...
- JavaScript中的反柯里化
转载自:https://www.cnblogs.com/zztt/p/4152147.html 柯里化 柯里化又称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函 ...