for 循環 和 Array 數組對象

博客地址: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類型,有轉換過程,開銷比較大
 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
  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

 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 效率測試代碼

 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');

?

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

轉載于:https://www.cnblogs.com/ainyi/p/9203374.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397653.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397653.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397653.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IntelliJ IDEA---java的編譯工具【轉】

轉自&#xff1a;http://baike.baidu.com/link?urlsEpS0rItaB9BiO3i-qCdGSYiTIVPSJfBTjSXXngtN2hBhGl1j36CYQORKrbpqMHqjvu3MOfkgVzpMqr8To2l2q IDEA 全稱 IntelliJ IDEA&#xff0c;是java語言開發的集成環境&#xff0c;IntelliJ在業界被公認為最好的java開發工具之一&#…

OC中文件讀取類(NSFileHandle)介紹和常用使用方法

NSFileHandle 1.NSFileManager類主要對于文件的操作(刪除&#xff0c;修改&#xff0c;移動&#xff0c;賦值等等) //判斷是否有 tagetPath 文件路徑&#xff0c;沒有就創建NSFileManager *fileManage [NSFileManager defaultManager];BOOL success [fileManage createFileAt…

java filereader讀文件_Java FileReader讀文件

import java.io.*;class FileReaderDemo{public static void main(String[] args) throws IOException{//創建一個文件讀取流對象&#xff0c;和指定名稱的文件相關聯。//要保證該文件是已經存在的&#xff0c;如果不存在&#xff0c;會發生異常FileNotFoundExceptionFileReade…

struts2攔截器

struts攔截器 圖&#xff1a; 1、攔截器是什么&#xff1f; 分離關注&#xff1a; 完成一個功能&#xff0c;可以寫在一個類中&#xff0c;然后一個類中4個步驟&#xff0c;實現該類完成。 我們可以將4個步驟寫在4個類中&#xff0c;然后每一個類完成一部分功能&#xff0c;然后…

Springboot-Jpa多數據庫配置-2.0+版本

pom.xml增加: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId></dependency> 配置表同JdbcTemplate配置. 主數據源: ConfigurationEnableTransactionManagementEna…

Windows虛擬地址轉物理地址(原理+源碼實現,附簡單小工具)

By Lthis 上個月就想寫了&#xff0c;一直沒時間...網上大概搜了一下&#xff0c;原理與操作倒是一大堆&#xff0c;一直沒看到源碼實現&#xff0c;總得有人動手&#xff0c;這回輪到我了。東西寫得很爛&#xff0c;請大牛勿噴。一直覺得靠源碼的方式驅動學習是非常好的一種學…

python裝飾器的使用

借用裝飾器&#xff0c;我們可以批量的對老的函數進行改造或擴展老函數功能&#xff0c;比如需要對函數的接收參數進行過濾&#xff0c;Flash的url路由功能就是使用的這個方式 def dropoushu(): # 這一層函數可以去掉&#xff0c;如果去掉了&#xff0c;則使用checkjiou這種方…

7_文件上傳漏洞

文件上傳漏洞 當文件上傳時&#xff0c;若服務端腳本語言未對上傳的文件進行嚴格驗證和過濾&#xff0c;若惡意用戶上傳惡意的腳本文件時&#xff0c;就有可能控制整個網站甚至是服務器&#xff0c;這就是文件上傳漏洞。 權限 1.網站后臺權限&#xff1a;登陸了后臺&#xff0…

mysql數據庫如何實現分頁查詢_不同數據庫的分頁查詢實現方法總結

分頁查詢是數據庫查詢中經常用到的一項操作&#xff0c;對查詢出來的結果進行分頁查詢可以方便瀏覽。那么Oracle、SQL Server、MySQL是如何實現查詢的呢&#xff1f;本文我們就來介紹這一部分內容。首先我們先看一下SQL Server 數據庫中SQL語句查詢分頁數據的解決方案&#xff…

POJ - 3842 An Industrial Spy dfs(水)

題意:給你一串數字&#xff0c;最少一個&#xff0c;最多七個&#xff0c;問用這里面的數字能組成多少素數&#xff0c;不重復。 思路&#xff1a;之前還遍歷10000000的每一個素數&#xff0c;結果超時&#xff0c;后來發現直接dfs就可以了&#xff0c;只是標記一下做過的數。 …

飛機大戰小游戲1.0版本

小時候大家應該都玩過飛機大戰吧&#xff0c;這就是仿的一個飛機大戰&#xff0c;但是沒有寫的很全&#xff0c;只能玩一次&#xff0c;死掉之后需要刷新頁面玩第二次&#xff0c;話不說多&#xff0c;上代碼&#xff1a; 初始頁面&#xff1a; 整個的html代碼還是很少&#xf…

記一次Jquery獲取值的典型錯誤

直接上代碼&#xff1a; 代碼很簡單&#xff0c;通過Post的形式提交參數&#xff0c;但是發現提交的data總是空&#xff0c;昨晚有點納悶&#xff0c;今天一看才發現。。。 獲取值得時候的順序有問題&#xff0c;獲取值應該是在onclick事件中。 綜上&#xff1a;寫Jquery的時間…

android 調用java接口_android調用java的web service接口

android中通過webservice調用服務器端其實還是很簡單的&#xff0c;只要按部就班的按照下面步驟進行即可&#xff1a;(1)創建HttpTransportSE對象&#xff0c;該對象用于調用WebService操作代碼如下:HttpTransportSE ht new HttpTransportSE(SERVICE_URL);(2)創建SoapSerializ…

iOS: TableView如何刷新指定的cell 或section

/一個section刷新 NSIndexSet *indexSet[[NSIndexSet alloc]initWithIndex:2]; [tableview reloadSections:indexSet withRowAnimation:UITableViewRowAnimationAutomatic]; //一個cell刷新 NSIndexPath *indexPath[NSIndexPath indexPathForRow:3 inSection:0…

Skype For Business 2015實戰系列14:創建Office Web App服務器場

Skype For Business 2015實戰系列14&#xff1a;創建Office Web App服務器場前面的操作中我們已經成功的安裝了Office Web App Server&#xff0c;今天我們將創建Office Web App服務器場。具體步驟如下:配置證書&#xff1a;登陸到OWA服務器,打開服務器管理器&#xff0c;點擊“…

https://cwiki.apache.org/confluence/display/FLINK/FLIP-24+-+SQL+Client

https://cwiki.apache.org/confluence/display/FLINK/FLIP-24-SQLClient轉載于:https://www.cnblogs.com/WCFGROUP/p/9214589.html

java ee me se_java EE ME SE有什么關系

1. Java SE(Java Platform&#xff0c;Standard Edition)。Java SE 以前稱為 J2SE。它允許開發和部署在桌面、服務器、嵌入式環境和實時環境中使用的 Java 應用程序。Java SE 包含了支持 Java Web 服務開發的類&#xff0c;為 Java Platform&#xff0c;Enterprise Edition(Jav…

Android第三夜

Paint的設置方法 setAntiAlias&#xff1a;這是畫筆的鋸齒效 setColor setARGB setAlpha setTextSize setStyle setStrokeWidth getColor getAlpha Canvas繪制常見圖形的方法 1&#xff0c;繪制直線 左上角是0.0點 drawLine(float startX,float startY,float stopX,float stopY…

JavaScript websocket 實例

實例: 即時通訊聊天室demo可以打開兩個頁面互相發送消息查看。 websocket.js /* 判斷瀏覽器是否內置了websocket */if (WebSocket in window) {websocket new WebSocket(ws://180.76.144.202:19910/websocket);}websocket->onerror onerror;websocket->onopen onopen…

SQL Server 2008 基礎

SQL Server 2008 基礎SQL流程TDS是一種協議&#xff0c;一系列描述兩個計算機間如何傳輸數據的規則。象別的協議一樣&#xff0c;它定義了傳輸信息的類型和他們傳輸的順序。總之&#xff0c;協議描述了“線上的位”&#xff0c;即數據如何流動。表格數據流協議是建立在TCP/IP N…