前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >for 循环 和 Array 数组对象

for 循环 和 Array 数组对象

作者头像
Krry
修改2019-04-22 14:45:18
2.2K0
修改2019-04-22 14:45:18
举报
文章被收录于专栏:KrryblogKrryblog

博客地址:https://ainyi.com/12 

for 循环 和 Array 数组对象方法

 for for-in for-of forEach效率比较

- 四种循环,遍历长度为 1000000 的数组叠加,得到的时间差:

for 3

for-in 250

for-of 7

forEach 44

- 效率速度:for > for-of > forEach > for-in

- for循环本身比较稳定,是for循环的i是Number类型,开销较小

- for-of 循环的是val,且只能循环数组,不能循环对象

- forEach 不支持 return 和 break,一定会把所有数据遍历完毕

- for-in 需要穷举对象的所有属性,包括自定义的添加的属性也会遍历,for...in的key是String类型,有转换过程,开销比较大

代码语言:javascript
复制
 1 // 面试: for, forEach, for-in, for-of(es6)
 2 
 3 let arr = [1,2,3,4,5];
 4 arr.b = '100'; // 自定义私有属性
 5 
 6 
 7 
 8 // for循环 速度最快
 9 for (let i = 0; len = arr.length, i < len; i++) { // 编程式
10 console.log("for循环"+arr[i]);
11 }
12 
13 
14 
15 // forEach 不支持return和break,无论如何都会遍历完,
16 arr.forEach(function(item){
17 console.log("forEach循环"+item);
18 });
19 
20 
21 
22 // for-in 遍历的是 key 值,且 key 会变成字符串类型,包括数组的私有属性也会打印输出
23 for(let key in arr){
24 console.log("for in循环"+key);
25 console.log(typeof key);
26 }
27 
28 
29 
30 // for-of 遍历的是值 val,只能遍历数组 (不能遍历对象)
31 for(let val of arr){
32 console.log("for of循环"+val);
33 }
34 
35 
36 // Object.keys 将对象的 key 作为新的数组,这样 for-of 循环的就是原数组的 key 值
37 let obj = {school:'haida',age:20};
38 // 变成 ['school','age']
39 for(let val of Object.keys(obj)){
40 console.log(obj[val]);
41 }

 JavaScript Array 数组对象方法

- 不改变原数组:concat、every、filter、find、includes、indexOf、isArray、join、lastIndexOf、map、reduce、slice、some、toString、valueOf

- 改变原数组:pop、push、reverse、shift、sort、splice、unshift

 重点难点解析

- filter、map、find、includes、some、every、reduce、slice

- 数组变异:pop、shift、splice、unshift

代码语言:javascript
复制
  1 // filter 过滤:可用于删除数组元素
  2 // 不改变原数组,过滤后返回新数组
  3 // 回调函数的返回值:若 true:表示这一项放到新数组中
  4 let newArr = [1,2,3,4,5].filter(item => item>2 && item <5);
  5 //数组元素>2且<5的元素返回true,就会放到新数组
  6 console.log("新数组:"+newArr);
  7 
  8 
  9 
 10 
 11 // map 映射,将原有的数组映射成一个新数组 [1,2,3],用于更新数组元素
 12 // 不改变原数组,返回新数组
 13 // 回调函数中返回什么这一项就是什么
 14 // 若要拼接 <li>1</li><li>2</li><li>3</li>
 15 let arr2 = [1,2,3].map(item => `<li>${item}</li>`);
 16 // join方法用于把数组中的所有元素放入一个字符串。每个元素通过指定的分隔符进行分隔。
 17 // 这里使用''空字符分割
 18 console.log(arr2.join(''));
 19 
 20 
 21 // 若只要 name 的 val 值,不要 key 值
 22 let arrJson = [{'name':'krry'},{'name':'lily'},{'name':'xiaoyue'},{'name':'krry'}];
 23 let newArrJson = arrJson.map( val => val.name);
 24 console.log(`newArrJson:${newArrJson}`);
 25 
 26 
 27 
 28 
 29 // find:返回找到的那一项
 30 // 不改变原数组
 31 // 找到后停止循环,找不到返回的是 undefined
 32 let arrFind = [1,2,3,4,55,555];
 33 let result = arrFind.find((item,index) => {
 34 return item.toString().indexOf(5) > -1;// 找数组元素中有5的第一项
 35 });
 36 console.log(result); // 输出 55
 37 
 38 
 39 
 40 
 41 // includes 数组中是否包含某个元素,返回 true or false
 42 let arr3 = [1,2,3,4,55,555];
 43 console.log(arr3.includes(5));
 44 
 45 
 46 
 47 
 48 // some:如果有一个元素满足条件,则表达式返回 true, 剩余的元素不会再执行检测。
 49 // 如果没有满足条件的元素,则返回 false
 50 let arrSF = [1,2,3,4,555];
 51 let result = arrSF.some((item,index)=>{
 52 return item > 3;
 53 });
 54 console.log(result); // 输出true
 55 
 56 
 57 
 58 
 59 // every:如果有一个元素不满足,则表达式返回 false,剩余的元素不会再进行检测。
 60 // 如果所有元素都满足条件,则返回 true
 61 let arrSE = [1,2,3,4,555];
 62 let result = arrSE.every((item,index)=>{
 63 return item > 3;
 64 });
 65 console.log(result); // 输出 false
 66 
 67 
 68 
 69 
 70 // reduce 收敛函数, 4个参数 返回的是叠加后的结果
 71 // 不改变原数组
 72 // 回调函数返回的结果:
 73 // prev:数组的第一项,next是数组的第二项(下一项)
 74 // 当前 return 的值是下一次的 prev
 75 let sum = [1,2,3,4,5].reduce((prev,next,index,item)=>{
 76 // console.log(arguments);
 77 // 1 2
 78 // 3 3
 79 // 6 4
 80 // 10 5
 81 console.log(prev,next);
 82 return prev+next; // 返回值会作为下一次的 prev
 83 });
 84 console.log(sum);
 85 
 86 
 87 // reduce 可以默认指定第一轮的 prev,那么 next 将会是数组第一项(下一项)
 88 // 例子:算出总金额:
 89 let sum2 = [{price:30,count:2},{price:30,count:3},{price:30,count:4}];
 90 let allSum = sum2.reduce((prev,next)=>{
 91 // 0+60
 92 // 60+90
 93 // 150+120
 94 console.log(prev,next);
 95 return prev+next.price*next.count;
 96 },0); // 默认指定第一次的 prev 为 0
 97 console.log(allSum);
 98 
 99 
100 // 利用reduce把二维数组变成一维数组
101 let flat = [[1,2,3],[4,5,6],[7,8,9]].reduce((prev,next)=>{
102 return prev.concat(next); // 拼接数组
103 });
104 console.log(flat);
105 
106 
107 
108 
109 // slice 从已有的数组中返回选定的元素
110 // 不改变原数组
111 let fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
112 let citrus = fruits.slice(1,3);
113 console.log(citrus); // 输出 Orange,Lemon
114 
115 
116 
117 
118 // pop 用于删除数组的最后一个元素并返回删除的元素
119 // 改变原数组
120 let fur = ["Banana", "Orange", "Apple", "Mango"];
121 fur.pop();
122 console.log(fur); // 输出 Banana,Orange,Apple
123 
124 
125 
126 
127 // shift 用于把数组的第一个元素从其中删除,并返回第一个元素的值
128 // 改变原数组
129 let fts = ["Banana", "Orange", "Apple", "Mango"];
130 fts.shift();
131 console.log(fts);// 输出 Orange,Apple,Mango
132 
133 
134 
135 
136 // unshift 向数组的开头添加一个或更多元素,并返回新的长度
137 // 改变原数组
138 let fse = ["Banana", "Orange", "Apple", "Mango"];
139 fse.unshift("Lemon","Pineapple");
140 console.log(fse); // 输出 Lemon,Pineapple,Banana,Orange,Apple,Mango
141 
142 
143 
144 
145 // splice 用于插入、删除或替换数组的元素
146 // 改变原数组
147 let myArrs = ["Banana", "Orange", "Apple", "Mango"];
148 myArrs.splice(2,1); // 从数组下标为 2 开始删除,删除 1 个元素
149 console.log(myArrs); // 输出 Banana,Orange,Mango

 额外谈一下arguments

代码语言:javascript
复制
 1 // arguments 是一个对应于传递给函数的参数的类数组对象
 2 // 此对象包含传递给函数的每个参数的条目,第一个条目的索引从0开始。
 3 // 例如,如果一个函数传递了三个参数,你可以以如下方式引用他们:
 4 // arguments[0]
 5 // arguments[1]
 6 // arguments[2]
 7 let xx = sumAll(1, 123, 500, 115, 44, 88);
 8  
 9 function sumAll() {
10 let i, sum = 0;
11 for (i = 0; i < arguments.length; i++) {
12 sum += arguments[i];
13 }
14 console.log(sum); // 返回总和 871
15 }

 for 效率测试代码

代码语言:javascript
复制
 1 let arr = new Array();
 2 for(let i = 0, len = 1000000;i < len; i++){
 3 arr.push(i);
 4 }
 5  
 6 function foradd(my_arr){
 7 let sum = 0;
 8 for(let i = 0; i < my_arr.length; i++){
 9 sum += my_arr[i];
10 }
11 }
12  
13 function forinadd(my_arr){
14 let sum = 0;
15 for(let key in my_arr){
16 sum += my_arr[key];
17 }
18 }
19  
20 function forofadd(my_arr){
21 let sum = 0;
22 for(let val of my_arr){
23 sum += val;
24 }
25 }
26 
27 
28 function forEachadd(my_arr){
29 let sum = 0;
30 my_arr.forEach(val => {
31 sum += val;
32 });
33 }
34  
35 function timeTest(func,my_arr,str) {
36 var start_time = null;
37 var end_time = null;
38 start_time = new Date().getTime();
39 func(my_arr);
40 end_time = new Date().getTime();
41 console.log(str,(end_time - start_time).toString());
42 }
43  
44 timeTest(foradd,arr,'for');
45 timeTest(forinadd,arr,'for-in');
46 timeTest(forofadd,arr,'for-of');
47 timeTest(forEachadd,arr,'forEach');
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-06-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • for 循环 和 Array 数组对象方法
    •  for for-in for-of forEach效率比较
      • - 效率速度:for > for-of > forEach > for-in
      •  JavaScript Array 数组对象方法
        •  重点难点解析
          •  额外谈一下arguments
            •  for 效率测试代码
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档