Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 久久精品国产99国产精2020丨,国产小视频在线免费观看,久操免费在线观看

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          JavaScript Loop教程–如何在JavaScript中遍歷數組

          文將為您提供對如何迭代JavaScript中的Array數據結構的扎實理解。無論您是剛剛開始學習JavaScript還是在這里學習復習,任何一種方式都將為您帶來價值。本文將引導您完成使用最廣泛的JavaScript概念之一。

          什么是數組?

          上面是一個用于存儲多個值的JavaScript數組。這是數組的最簡單形式之一。它在數組內部包含4個“元素”,所有字符串。如您所見,每個元素都用逗號分隔。此示例數組包含不同品牌的汽車,并且可以用cars變量引用。

          我們可以通過多種方法來迭代此數組。JavaScript具有令人難以置信的豐富功能,因此我們可以選擇最佳的方法來解決問題。

          這是解決JavaScript中數組迭代的方法:

          1、重點介紹5種遍歷數組的常用方法

          2、對每種迭代方法顯示一些見解

          3、提供一些代碼,您也可以使用它進行測試!

          傳統For循環

          什么是For循環?維基百科將For循環定義為:

          “在計算機科學中,for循環(或簡稱為for循環)是用于指定迭代的控制流 語句,該語句允許重復執行代碼。”for循環是一種重復執行代碼的方法。console.log(“hi”)您可以將其包裝在for循環中,而不必鍵入5次。在第一個示例中,我們將學習如何遍歷上面看到的cars數組,并打印出每個元素。迭代器或計數器將在第一個索引“ Tesla”處開始,并在最后一個“ Audi”處結束。它遍歷數組并一次打印一個元素。

          輸出:

          深入研究代碼,我們將三個選項傳遞給for循環

          1、迭代器變量- let i = 0;

          2、迭代器應在何處停止- i < card.length

          3、每個循環增加多少迭代器- i++

          此循環從開始于0,每個循環將變量增加一個,并在我們擊中數組中的最后一個元素時停止。傳統的for循環的主要好處是您擁有更多的控制權。可以訪問數組中的不同元素,或者以復雜的方式遍歷數組以解決復雜的問題。例如,使用傳統的for循環可以很容易地跳過數組中的所有其他元素。

          forEach方法

          什么是forEach方法?該forEach方法用于為數組的每個元素執行一個函數。如果數組的長度是“未知”或保證會改變,則此方法是一個不錯的選擇。此方法只能與數組,集合和映射一起使用。

          forEach循環的最大好處是即使數組的大小可能會增加,也能夠訪問每個項目。它是適用于許多用例的可擴展解決方案,比傳統的for循環更易于閱讀和理解,因為我們知道我們將對每個元素進行精確的迭代一次。

          While循環

          什么是While循環?維基百科將While循環定義為:“ while循環是一個控制流 語句,它允許根據給定的布爾條件重復執行代碼。在同時循環可以被認為是一個重復的if語句。”一while環是,如果一個條件是真還是假反復執行代碼來檢查的方式。因此,我們可以使用while循環,而不是使用帶有嵌套if語句的for循環。或者,如果我們無法找到數組的長度,則while循環是一個不錯的選擇。while循環通常由計數器控制。在下面的示例中,我們顯示了遍歷數組的基本while循環。關鍵是要控制正在創建的while循環。

          While循環示例(良好):

          輸出:

          while循環的if語句為i < 5,或大聲說“ i小于5”。i每次循環運行時,變量都會增加。簡單來說,這意味著i每次循環執行完整迭代時,都會將1加到變量中。在第一次迭代中,i它等于0,然后在控制臺上打印“ 0”。使用while循環的最大風險是編寫從未滿足的條件。在現實世界中,這種情況經常發生,有人編寫了while循環,卻忘記測試他們的循環,并且在代碼庫中引入了無限循環。當永不滿足條件時,將發生無限循環,并且該循環將永遠運行。這通常會導致更改中斷,然后導致整個軟件應用程序中斷并停止工作。警告:請勿運行此代碼。

          無限循環示例(錯誤):

          輸出:結果可能會有所不同。

          BONUS示例(map迭代)

          什么是map?維基百科將map定義為:“在許多編程語言中,map是將給定函數應用于函子的每個元素的高階函數的名稱,例如list,以相同順序返回結果列表。以功能形式考慮時,它通常被稱為“ 適用于所有人 ”。它是如何工作的?mapJavaScript中的函數將函數應用于數組內的每個元素。請花一點時間重新閱讀該句子。然后,該map函數返回一個新數組,并將該函數應用于該數組中的每個元素。

          map示例:

          輸出:

          我們已將該map函數應用于包含四個1的數組。然后,該函數將每個元素乘以2,即x * 2,并返回一個新數組。然后將新數組存儲在results變量中。

          通過查看我們的輸出,我們可以看到此方法成功完成。數組中的每個元素都已乘以2。在某些情況下,該方法可以替代循環,并且功能非常強大。

          結論

          您已經了解了五種遍歷JavaScript中數組的不同方法。這些是基本的構建塊,可幫助您成功完成JavaScript編程之旅。您還將接觸到高級概念map,該概念經常在大型軟件應用程序中使用。因此,您將如何在項目中使用數組?您覺得哪種迭代方法最令人興奮?

          謝謝閱讀!如果您喜歡我的文章,請關注我和/或給我發送消息!

          Spring Boot編程中,我們可以使用多種方式返回HTML頁面。下面是幾種常用的方法:

          1. 使用Thymeleaf模板引擎

          Thymeleaf是一款流行的模板引擎,Spring Boot默認集成了它。使用Thymeleaf可以方便地生成HTML頁面,并且支持模板繼承、條件判斷、循環等常見功能。在Controller中,我們可以將模型數據傳遞給Thymeleaf模板,然后渲染生成HTML頁面。

          @GetMapping("/hello")
          public String hello(Model model) {
              model.addAttribute("name", "world");
              return "hello";
          }
          

          上面的代碼中,我們將一個名為"hello"的Thymeleaf模板返回給客戶端,并且傳遞了一個名為"name"的模型屬性。在模板中,可以使用Thymeleaf的語法進行渲染。

          優點:

          • Thymeleaf易于學習和使用
          • 支持多種常見的功能,如模板繼承、條件判斷、循環等
          • Spring Boot默認集成,無需額外配置

          缺點:

          • 渲染速度比較慢
          • 對于復雜的頁面,需要寫很多模板代碼

          2. 使用Freemarker模板引擎

          Freemarker是另一款常見的模板引擎,它也支持模板繼承、條件判斷、循環等功能。在Spring Boot中,我們可以使用Freemarker作為模板引擎,生成HTML頁面。

          @GetMapping("/hello")
          public String hello(Model model) {
              model.addAttribute("name", "world");
              return "hello";
          }
          

          上面的代碼與Thymeleaf的使用方式類似。只需要將返回值改為模板的名稱即可。

          優點:

          • 渲染速度比Thymeleaf快
          • 支持多種常見的功能,如模板繼承、條件判斷、循環等

          缺點:

          • 比Thymeleaf難學習和使用
          • 需要額外的配置,比較麻煩

          3. 使用JSP

          JSP(JavaServer Pages)是一種常見的Java Web頁面技術,也可以在Spring Boot中使用。在使用JSP時,需要在pom.xml文件中添加對jsp-api和jstl的依賴,并且需要配置視圖解析器。

          @GetMapping("/hello")
          public String hello(Model model) {
              model.addAttribute("name", "world");
              return "hello";
          }
          

          上面的代碼中,返回值為"hello",這意味著Spring Boot將查找名為"hello.jsp"的JSP文件,并且將模型數據傳遞給它進行渲染。

          優點:

          • 對于熟悉JSP的開發人員來說比較容易使用

          缺點:

          • JSP技術相對較老,現在不太流行

          4. 使用前后端分離架構

          在前后端分離的架構中,前端和后端是獨立的,可以分別開發和部署。前端使用JavaScript等技術生成HTML頁面,后端則提供API接口,返回JSON等數據格式。前端通過調用后端提供的API接口獲取數據,并渲染生成HTML頁面。

          @GetMapping("/hello")
          public ResponseEntity<Map<String, Object>> hello() {
              Map<String, Object> data = new HashMap<>();
              data.put("name", "world");
              return ResponseEntity.ok(data);
          }
          

          上面的代碼中,我們返回一個Map對象,包含一個名為"name"的屬性。在前端中,可以通過調用"/hello"接口獲取數據,并渲染生成HTML頁面。

          優點:

          • 前后端分離,可以分別開發和部署,提高開發效率和部署效率
          • 前端可以使用各種現代化的JavaScript框架和工具,實現更好的用戶體驗

          缺點:

          • 前端和后端需要進行協作和溝通,需要一定的技術能力和項目管理能力
          • 對于一些簡單的頁面,使用前后端分離架構可能會增加一定的開發成本

          解決容易出現的問題:

          在使用Spring Boot返回HTML頁面時,可能會出現一些常見問題,下面是一些解決方法:

          • 頁面跳轉問題:如果頁面跳轉不正確,可以檢查視圖解析器的配置是否正確。
          • 靜態資源訪問問題:如果訪問靜態資源出現問題,可以檢查靜態資源的路徑是否正確。
          • 中文亂碼問題:如果返回的HTML頁面中出現中文亂碼,可以設置字符集為UTF-8,例如:
          @RequestMapping(value = "/hello", produces = "text/html;charset=UTF-8")
          
          • 模板引擎無法正常渲染問題:如果使用模板引擎無法正常渲染,可以檢查模板文件是否存在、模板語法是否正確等。

          選擇哪種方法返回HTML頁面取決于具體的需求和項目情況。在選擇方法時,需要考慮開發成本、渲染速度、易用性等因素,并且需要注意常見問題,避免出現不必要的錯誤。

          armonyOS 2提供了兩種應用開發語言:Java和JS。Java線程特性能夠讓多任務并行,充分利用硬件資源開發出高性能的應用。而JS卻是一個單線程語言,無法像Java一樣創建新的Thread,用JS語言開發是否會導致硬件資源無法充分利用的情況呢?

          本文給大家介紹“ACE JS的單線程異步機制”就是解決這個問題的。然而,說到 “單線程”與“異步”,大家可能會比較疑惑,因為單線程和異步在概念上是沖突的,單線程無法做到多任務并發,也就不會存在異步這種通信機制。

          確實,JS語言本身是無法實現異步的,但是ACE JS框架卻提供了多線程的宿主環境,通過消息通信機制讓JS語言有了異步的屬性,下面我們來詳細描述其原理。

          ACE開發框架

          使用JS開發HarmonyOS應用,使用的開發框架名為ACE(Ability Cross-Platform Environment),該框架適用于手機、平板、智慧屏、智慧表、車機等設備,具備“一次開發,多端部署”的能力。

          ACE框架包括應用層(Application)、前端框架層(Framework)、引擎層(Engine)和平臺適配層(Porting Layer),如下圖所示:

          ?● Application

          應用層表示開發者使用JS UI框架開發的FA應用,這里的FA應用特指JS FA應用。

          ● Framework

          前端框架層主要完成前端頁面解析,以及提供MVVM(Model-View-ViewModel)開發模式、頁面路由機制和自定義組件等能力。

          ● Engine

          引擎層主要提供動畫解析、DOM(Document Object Model)樹構建、布局計算、渲染命令構建與繪制、事件管理等能力。

          ● Porting Layer

          適配層主要完成對平臺層進行抽象,提供抽象接口,可以對接到系統平臺。比如:事件對接、渲染管線對接和系統生命周期對接等。

          ACE開發框架的線程模型

          ?

          ?

          每個HarmonyOS JS應用,都是通過上圖所示的ACE開發框架進行加載渲染的。ACE開發框架包含了JS線程、UI線程、GPU線程、IO線程,并且在ACE框架外還會存在一類后臺任務線程。

          其中GPU線程與IO線程主要是ACE框架初始化與頁面加載渲染的過程需要的,為ACE框架內部的專有線程,不會被應用直接操作到,應用不需要特別關注;UI線程、JS線程和后臺任務線程會與應用開發代碼相關,后面著重分析這三個線程的作用和關系。

          ● UI線程:負責應用界面的繪制刷新,與應用的進程號相同,又叫主線程。如果開發JS+JAVA的混合編程,JAVA PA(Particle Ability)的onStart/onConnect等Ability生命周期回調便是運行在主線程,若在這些生命周期回調上執行耗時操作則會導致JS UI的繪制刷新卡住。

          ● JS線程:應用的JS代碼會被JS引擎解析執行,并運行在JS線程上,而JS又是單線程語言,所以目前我們工程中看到的所有的JS代碼都會執行在這個進程下唯一的JS線程上。

          ● 后臺任務線程:這里是對ACE框架外部的后臺線程的一個統稱,并不單指一個線程,也并不唯一。后臺任務線程包含了Java PA線程、文件操作API、網絡訪問API內部實現等相關線程。

          下面我們結合測試代碼來看一下這3個線程之間的關系。

          JS線程與UI線程的關系

          為了驗證JS線程與UI線程的關系,我們準備了一個實驗性質的Demo,主要代碼以及運行過程的Log如下:

          首先我們在IDE建立一個Empty Ablity(JS)模板的HelloWorld工程,在生命周期、按鈕響應回調方法里增加Log以觀察線程情況。剛創建的app.js中Application生命周期默認已經有Log,無需額外添加。

          我們只需要在主界面index.js文件中onInit增加日志:

          console.info(<span class="hljs-string">'page.default onInit'</span>);復制

          然后在index.hml中增加一個button以及會一直進行動畫的progress組件:

          
          <button id='button1' onclick="onButtonClick">I'm a button</button>
          <progress type="circular"/>復制

          最后在index.js中增加按鈕點擊響應事件以及Log,并且嘗試sleep阻塞js線程:

          
          function sleep(delay) {
                  for (var t = Date.now(); Date.now() - t <= delay; );
          }
          onButtonClick() {
                  console.info('onButtonClick begin');
                  sleep(1000);
                  console.info('onButtonClick end');
          }復制

          將應用運行起來,點擊兩次按鈕,得到如下Log:

          ?

          ?

          從輸出的Log中,我們可以看到這個JS FA進程號為22592,也就是說UI線程是22592;生命周期回調以及按鈕響應均在24077線程,這個就是JS線程,所以JS線程與UI線程不是同一個線程。

          并且我們嘗試通過sleep方法阻塞JS線程,想觀察JS線程阻塞是否會影響到UI線程的刷新。最終得出的結論是無論JS線程sleep多長時間,UI界面上的progress組件動畫一直會不斷刷新,按鈕也會有按壓效果變化,所以我們可以推測JS線程與UI線程的相互調用應該是通過某種消息機制完成的,而不是阻塞式的調用。

          JS線程與后臺任務線程的關系

          ACE JS框架提供了JS FA(Feature Ability)調用Java PA(Particle Ability)的機制,該機制提供了一種通道來傳遞方法調用、處理數據返回以及訂閱事件上報。我們同樣制作一個Demo來驗證JS線程與Java PA線程的關系:

          在JS中,我們通過FeatureAbility.callAbility拉起并調用了名為一個類名為ServiceAbility的Java PA,并拿到返回結果:

          var action = {};
          action.bundleName = <span class="hljs-string">'com.blancwu.test'</span>;
          action.abilityName = <span class="hljs-string">'com.blancwu.test.ServiceAbility'</span>;
          action.messageCode = <span class="hljs-number">1001</span>;
          action.abilityType = <span class="hljs-number">0</span>;
          action.syncOption = <span class="hljs-number">0</span>;
          
          console.info(<span class="hljs-string">'FeatureAbility.callAbility begin'</span> + JSON.stringify(action));
          FeatureAbility.callAbility(action).then(function (value) {
              console.info(<span class="hljs-string">'FeatureAbility.callAbility async result '</span> + JSON.stringify(value));
          })
          console.info(<span class="hljs-string">'FeatureAbility.callAbility end'</span> + JSON.stringify(action));復制

          在ServiceAbility的onRemoteRequest中增加Log輸出,并sleep 1秒鐘,以便觀察線程情況與之間關系:

          
          @Override
          public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) throws RemoteException {
              HiLog.info(LABEL_LOG, "onRemoteRequest begin " + code);
              if (code == 1001) {
                  try {
                      Thread.sleep(1000);
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
                  Map<String, Object> result = new HashMap<String, Object>();
                  result.put("result", 1);
                  reply.writeString(ZSONObject.toZSONString(result));
              }
              HiLog.info(LABEL_LOG, "onRemoteRequest end " + code);
              return super.onRemoteRequest(code, data, reply, option);
          }復制

          以上代碼完成后,我們進行執行,得到的Log如下:

          ?

          ?

          我們觀察到本次運行主進程(UI線程)號為4133,JS代碼執行在JS線程5887,Java PA響應onRemoteRequest執行在另一個后臺任務線程5837。通過Log我們看到onRemoteRequst即使阻塞了后臺任務線程1s也不會影響JS線程的并行執行以及主線程(UI線程)上動畫的刷新,做到了JS線程與后臺任務線程異步地執行事務。

          JS線程的異步機制

          上面從代碼實驗角度觀察到了JS線程與其他線程的異步關系,那么JS線程是怎么處理來自其他多個線程的調用的呢?我們先來看一下傳統的瀏覽器環境下的機制:

          ?

          ?

          上圖中,JS線程中的函數調用會存在于棧(stack)中,棧中的函數可以調用瀏覽器環境提供的WebAPIs,包含了DOM、ajax、timeout等API,這些API會在瀏覽器環境提供的另外一個外部線程執行,執行完成后會在任務隊列(callback queue)中加入對應的回調事件(如onClick、onLoad、onDone)。當棧中的代碼執行完畢,即棧清空后,JS線程又會通過event loop取出任務隊列中的下一個任務進行執行,以此類推完成整個的程序執行。更具體的機制可以去看阮一峰老師介紹JS EventLoop的文章:

          ● JS EventLoop介紹

          http://www.ruanyifeng.com/blog/2014/10/event-loop.html

          HarmonyOS ACE開發框架同樣遵循上述最基本的EventLoop調度機制,并且提供了更多的機制和API,讓業務邏輯可以在外部線程執行,包含了上面提到的Java PA以及異步回調的系統能力API。其中,異步回調的系統能力API包含如文件系統操作和網絡操作等,具體大家可以按照我們實驗Demo的方法去嘗試一下。

          ● 參考

          https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-apis-file-storage-0000000000629445

          未來發展的展望

          目前ACE JS應用內實現多線程的最佳方式是通過混合編程調用Java PA方式,但未來純JS應用一定會越來越多,那么,只支持單線程的JS ACE框架的異步API能解決各種復雜場景的問題嗎?

          單線程的JS加上異步API能夠很好解決單個I/O阻塞的問題,但是如果遇到大量的I/O事件,比如批刪除大量文件,通過for循環發起了大量異步任務,也會降低執行效率,甚至阻塞其他異步任務的執行。并且如果要使用JS語言開發計算密集型的任務,也無法在唯一的JS線程上進行。

          這時就需要一個真正的JS多線程處理機制了,雖然目前HarmonyOS 2還未支持,但未來HarmonyOS會考慮規劃出與HTML5類似提供支持WebWorker機制,支持開發出多線程的JS代碼,提供給應用開發者更多的發揮空間。


          主站蜘蛛池模板: 亚洲av一综合av一区| 久久精品免费一区二区喷潮| 精品无码一区二区三区爱欲九九| 亚洲AV无一区二区三区久久| 欧洲精品一区二区三区| 国产一区二区不卡在线播放| 丰满爆乳无码一区二区三区| 3d动漫精品一区视频在线观看| 成人免费av一区二区三区| 国产在线观看一区二区三区四区| 无码av免费毛片一区二区| 色妞色视频一区二区三区四区 | 国产免费无码一区二区 | 亚洲AV无码一区二区二三区入口| 日韩AV在线不卡一区二区三区| 无码中文人妻在线一区二区三区 | 91在线视频一区| 国产福利精品一区二区| 国产一区二区三区高清在线观看| 一区二区三区在线免费| 国产在线第一区二区三区| 国产在线精品一区二区在线看| 国产精品福利一区| 视频在线观看一区二区三区| 日本v片免费一区二区三区 | 国产激情一区二区三区在线观看 | 国产自产对白一区| 精品国产乱码一区二区三区| 亚洲AV无码一区二区三区DV| 日韩av无码一区二区三区| 国产一区在线观看免费| 久久精品无码一区二区WWW| 国产精品自拍一区| 日韩最新视频一区二区三| 精品国产福利一区二区| 国产情侣一区二区| 国产精品一区二区久久精品无码| 台湾无码AV一区二区三区| 日本成人一区二区| 国产精品第一区揄拍| 杨幂AV污网站在线一区二区|