JS包裝類:循環中為什么建議用變量存儲str.length進行循環判斷?

前言

Javascript通常我們在遍歷一個字符串的時候通常使用的方式是

var str ="abcdefg";
for(let i=0;i<str.length;i++){}

但在最近的學習中,有人建議我最好應該是下面這樣執行。

var str ="abcdefg";
for(let i=0,len= str.length;i<len;i++){}

我有點疑惑,這用一個變量存儲字符串的長度不是多此一舉嗎?為什么還建議我使用以下代碼呢?抱著懷疑的態度我決定進行效率測試。下面是測試代碼。

function test1() {let time1 = Date.now();for (let i = 0; i < str.length; i++) { }let time2 = Date.now();return time2 - time1;
}
function test2() {let time1 = Date.now();for (let i = 0,len = str.length; i < len; i++) { }let time2 = Date.now();return time2 - time1;
}
console.log(test1());
console.log(test2());

當測試集長度為10000長度以下基本沒有區別,但是當長度來到十萬級別百萬的時候,時間消耗確實是有差距的,但都是毫秒級差距。但是雖然效率相差不大,但是到底是什么原因導致的時間上的差距呢?這里就得要先介紹一下JS的基本類了。

JS的原始(基本)數據類型

  • 字符串(String) :任何文本信息,用單引號 ' ' 或雙引號 " " 包圍。
  • 數字(Number) :整數或浮點數,包括 Infinity 和 NaN。
  • 布爾值(Boolean) :只有兩個值,truefalse
  • 未定義(Undefined) :表示變量已被聲明但沒有賦值,或被直接初始化為 undefined
  • Null:表示一個特意設置為空的對象引用,只有一個值 null
  • Symbol(ES6起):一種唯一且不可變的數據類型,常用于對象的鍵,以避免鍵名沖突。
  • Bigint (ECMAScript 2020 (ES2020)):能夠安全地存儲極大或極小的整數值

原始數據類型(也稱作基本數據類型或者primitive data types)在JavaScript中是不具備自己的方法和屬性的。

問題來了,字符串String是原始數據類型,為什么卻擁有.length屬性呢?而且不只是.length屬性,字符串類型還擁有賊多的方法。。。相信已經有小伙伴疑惑了?這不是自相矛盾嗎?

但是事實確是兩者都是正確的,原始數據類型確實是沒有屬性和方法,JS在對原始數據進行屬性和方法的相關操作的時候會進行包裝,下面引出我們真正的豬腳—包裝類

包裝類

原始值(字符串、數字、布爾值和Symbol等)在JavaScript中通常不具備屬性和方法。然而,包裝類(String、Number、Boolean、Symbol對象)的引入,讓這些基本類型在特定情境下也能穿上“對象”的外衣,短暫擁有方法和屬性。

相信大家都使用過類型強轉類似String(),Number()等,這種就是將一個基本類型,先將一個基本類型包裝成一個對象,在返回一個原始數據類型后進行銷毀。如下面這行代碼:

var str ="1231213123123";
console.log(str.length);

這兩行代碼JS將會這樣執行:

  1. 臨時創建一個String對象,該對象包裝了原始的字符串值
  2. 然后通過這個對象獲取長度
  3. 之后這個臨時對象會被銷毀

難道每次使用方法和屬性都要進行對象的創建與銷毀嗎?答案是:是的,每次使用都要進行創建與銷毀。

這下知道為什么在循環中最好先使用一個變量存儲字符串的長度,而不是每次循環都直接使用字符串.length屬性進行判斷了吧。因為每次循環都會進行包裝類的創建和銷毀,雖然在數據集小的情況下效率影響不大但好歹是有點影響不是.![在這里插入圖片描述](https://img-blog.csdnimg.cn/direct/7c2c195c128d46278823bd2f7c5a326c.jpeg#pic_center)

結語

總而言之,JavaScript通過對象、包裝類以及對未定義屬性的處理,展現了其設計哲學的深度與廣度。它既是一門靈活多變的語言,也是開發者手中的利器,允許我們在編碼的旅途中,以最少的約束,創造無限可能。理解這些機制,不僅能夠提升我們的編碼技巧,更能在深層次上領悟JavaScript的設計美學,讓我們的代碼更加優雅、高效。在這條探索之路上,讓我們繼續前行,揭開更多JavaScript的神秘面紗。

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

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

相關文章

DP讀書:《ModelArts人工智能應用開發指南》(一)人工智能技術、應用平臺

怎么用ModelArts人工智能應用 訓練底座訓練案例 盤古礦山模型Main config.py 訓練底座 訓練案例 盤古礦山模型 Main 下面是快速助手 https://support.huaweicloud.com/qs-modelarts/modelarts_06_0006.html 準備開發環境 在ModelArts控制臺的“ 開發環境 > Notebook”頁面…

【C#學習筆記】屬性和字段

文章目錄 前言屬性和字段的區別字段訪問修飾符和關鍵字定義變量類型的定義變量命名變量的賦值 屬性 不同的使用情況 前言 最近在工作的過程中常常會覺得自己在程序設計方面的能力還是有欠缺。例如一直對于變量的聲明感到不足&#xff0c;在工作中為了圖方便總是直接public定義…

聲音突破:so 索

小孩兒看完武俠劇&#xff0c;就決定從二樓往地面上跳&#xff0c;年輕的老媽看到了&#xff0c;就在那里罵&#xff0c;喝斥不準逞能&#xff0c;不許亂來&#xff0c;不許跳。但小孩子不聽話&#xff0c;心里全是影視劇的畫面&#xff0c;那叫一個俠之能也&#xff0c;于是飛…

llvm 常用命令備忘

執行 IR 上的指令合并優化 pass $ opt –S –instcombine testfile.ll –o output1.ll 執行無效參數優化 pass $ opt –S –deadargelim testfile.ll –o output2.ll C 語言生成 IR 文件 $ clang -emit-llvm -S multiply.c -o multiply.ll C 語言生成 IR 文件 $ clang -cc1 -…

面向長文本處理的鍵值緩存壓縮技術:智能壓縮,無損性能,免微調

隨著輸入長度的增加&#xff0c;大型語言模型&#xff08;LLMs&#xff09;中的鍵值&#xff08;KV&#xff09;緩存需要存儲更多的上下文信息以維持性能&#xff0c;這導致內存消耗和計算時間急劇上升。KV緩存的增長對內存和時間效率的挑戰主要表現在兩個方面&#xff1a;一是…

使用JavaScript實現網頁通知功能

如何使用js來實現網頁通知功能。即使在用戶瀏覽其他頁面時&#xff0c;也能向他們推送通知信息。 廢話不多說直接上代碼 function showAutoNotification() {if ("Notification" in window) {Notification.requestPermission().then(function(permission) {if (permis…

元宇宙數字藏品交易所,未來發展的大趨勢

隨著科技的飛速進步&#xff0c;元宇宙以其獨特的魅力為數字世界繪制了一幅前所未有的宏偉藍圖。在這一宏大的背景下&#xff0c;數字藏品交易所作為連接虛擬與現實的橋梁&#xff0c;正以其卓越的優勢&#xff0c;引領著數字藏品市場邁向新的高度。 首先&#xff0c;元宇宙為…

Vue 的服務端渲染(SSR)有哪些鉤子可以用

在 Vue 的服務端渲染&#xff08;SSR&#xff09;過程中&#xff0c;并不會執行完整的生命周期鉤子&#xff0c;只有一部分鉤子會在服務器端執行。以下是 Vue SSR 中支持的生命周期鉤子&#xff1a; beforeCreate&#xff1a;在實例初始化之后&#xff0c;數據觀測 (data obser…

【ARM Cache 與 MMU 系列文章 7.8 – ARMv8/v9 MMU Table 表分配原理及其代碼實現 2】

文章目錄 MMU Table 表分配原理及其代碼實現MMU Table 分配代碼實現MMU Table 表分配原理及其代碼實現 在做映射的時候所映射的地址范圍最大只能是某一級 level table 中 entry 所能支持的最大范圍,如果超過這個范圍需要在對應 level table 中新增一個entry,這里還是以映射虛…

【相關概念】經濟金融中的Momentum

張張張三豐de思考與總結&#xff1a; 最近做的期貨價格泡沫中&#xff0c;一直在說&#xff0c;momentum&#xff0c;momentum&#xff0c;momentum&#xff0c;那么究竟什么是momentum呢&#xff1f; 目前&#xff0c;在有關期貨價格泡沫的研究文獻中&#xff0c;一般都是研究…

本輪牛市新趨勢,跟隨The First捕捉牛市Alpha

與以往牛市“百花齊放”的繁榮景象相比&#xff0c;本輪牛市頗具獨特走勢&#xff0c;呈現出了資金集中度高、財富聚集效應小的特點&#xff0c;絕大部分加密資產甚至跑不贏BTC的漲幅幅度。而以往大放色彩的公鏈幣價值幣的走勢&#xff0c;甚至比不過牛尾才爆發的MEME幣。這使得…

Java項目之消息隊列(手寫java模擬實現mq)【三、MQ的核心類-消息類的存儲(用文件存儲消息)】? ★

Java項目之MQ 七. 消息存儲設計設計思路為什么要用文件存儲文件存儲結構queue_data.txt ?件格式:queue_stat.txt ?件格式: 創建 MessageFileManager 類定義一個內部類, 來表示該隊列的統計信息 Stat實現統計?件Stat讀寫&#xff08;文本文件的讀寫&#xff09;InputStream—…

python爬蟲入門教程(一)

上一篇文章講了爬蟲的工作原理&#xff0c;這篇文章以后就要重點開始講編程序了。 簡單爬蟲的的兩個步驟&#xff1a; 使用HTTPRequest工具模擬HTTP請求&#xff0c;接收到返回的文本。用于請求的包有: requests、urllib等。 對接收的文本進行篩選,獲取想要的內容。用戶篩選文…

JavaScript-內存分配,關鍵字const

內存空間 內存分為棧和堆 棧&#xff1a;由操作系統自動釋放存放的變量值和函數值等。簡單數據類型存放在棧中 棧會由低到高先入后出 堆&#xff1a;存儲引用類型 &#xff08;數組&#xff0c;對象&#xff09; 對象會先將數據存放在堆里面&#xff0c;堆的地址放在棧里面 關鍵…

【ArcGISProSDK】獲取要素中某字段最大值

public static async Task<double> GetMaxValueFromField(string vectorFilePath, string fieldName){double maxValue = 0;//矢量所在文件夾var filePath = System.IO.Path.GetDirectoryName(vectorFilePath);//矢量名稱var fileName = System.IO.Path.GetFileNameWitho…

VMD-PSO-LSTM單維時序預測模型(單輸入單輸出)-附代碼

VMD-PSO-LSTM單維時序預測模型&#xff08;單輸入單輸出&#xff09; 1&#xff09;首先對原始單維數據進行VMD分解&#xff0c;分解為K個模態分量和1個殘差分量 2&#xff09;將各個模態分量輸入模型&#xff0c;建立模型進行預測 3&#xff09;將各個預測結果相加得到最終…

clickhouse(十五、存儲優化實踐)

文章目錄 背景問題定位優化方式排序鍵設計寫入順序壓縮算法 DoubleDeltaLowCardinality避免使用Nullable 總結 背景 clickhouse集群容量告警&#xff0c;項目中某些表占據大量的存儲空間&#xff0c;借此機會對ck的存儲優化進行實踐學習&#xff0c;并通過多種方式測試驗證優化…

設計模式相關更新中

詳見gitee: 更新中? ??????設計模式相關: 設計模式相關介紹 (gitee.com) 一.面向對象的設計原則 二.單例模式

React(五)useEffect、useRef、useImperativeHandle、useLayoutEffect

(一)useEffect useEffect – React 中文文檔 useEffect hook用于模擬以前的class組件的生命周期&#xff0c;但比原本的生命周期有著更強大的功能 1.類組件的生命周期 在類組件編程時&#xff0c;網絡請求&#xff0c;訂閱等操作都是在生命周期中完成 import React, { Com…

算法題day37日(補5.23日卡:貪心算法day4)

一、刷題&#xff1a; 1.leetcode題目 860. 檸檬水找零 - 力扣&#xff08;LeetCode&#xff09;&#xff08;easy&#xff09;&#xff1a; 我覺得我寫的代碼有點蠢 class Solution:def lemonadeChange(self, bills: List[int]) -> bool:dict_ {5:0,10:0}if bills[0] !…