JavaScript 實用工具方法小全

1. 精確獲取小數位數

/*** 獲取數字的小數位數(支持科學計數法)* @param {number|string} num - 要檢查的數字,可以是數字或字符串形式* @returns {number} 返回小數部分的位數* * 實現原理:* 1. 處理科學計數法(如1.23e-5)* 2. 常規數字直接計算小數點后的位數* 3. 自動忽略末尾無意義的0(如12.340返回2位)* * 示例:* getDecimalPlaces(123.456) => 3* getDecimalPlaces(1.23e-5) => 7 (0.0000123)*/
function getDecimalPlaces(num) {// 轉換為字符串并處理科學計數法const numStr = String(num).toLowerCase();// 處理科學計數法(如1.23e-5)if (numStr.includes('e')) {const [base, exponent] = numStr.split('e');const baseDecimal = base.split('.')[1]?.length || 0;// 計算實際小數位數 = 基數小數位數 - 指數絕對值return Math.max(0, baseDecimal - parseInt(exponent));}// 常規數字處理const decimalIndex = numStr.indexOf('.');// 沒有小數點返回0,否則計算小數點后的字符數return decimalIndex === -1 ? 0 : numStr.length - decimalIndex - 1;
}

2. 深度對象比較(遞歸實現)

/*** 深度比較兩個對象或值是否完全相等(遞歸實現)* @param {*} obj1 - 第一個比較對象* @param {*} obj2 - 第二個比較對象* @returns {boolean} 如果相等返回true,否則false* * 功能特點:* 1. 支持基本類型比較(number, string, boolean等)* 2. 支持數組比較(包括嵌套數組)* 3. 支持對象比較(包括嵌套對象)* 4. 處理了循環引用的情況* * 示例:* deepEqual({a:1,b:{c:2}}, {a:1,b:{c:2}}) => true*/
function deepEqual(obj1, obj2) {// 快速路徑:如果是同一個對象或值相同if (obj1 === obj2) return true;// 處理null/undefined和基本類型if (obj1 == null || obj2 == null || typeof obj1 !== 'object' || typeof obj2 !== 'object') {return obj1 === obj2;}// 處理數組比較if (Array.isArray(obj1) && Array.isArray(obj2)) {// 數組長度不同直接返回falseif (obj1.length !== obj2.length) return false;// 遞歸比較每個元素for (let i = 0; i < obj1.length; i++) {if (!deepEqual(obj1[i], obj2[i])) return false;}return true;}// 獲取兩個對象的鍵const keys1 = Object.keys(obj1);const keys2 = Object.keys(obj2);// 鍵數量不同直接返回falseif (keys1.length !== keys2.length) return false;// 檢查所有鍵值是否相等for (const key of keys1) {// 檢查key是否存在和對應的值是否相等if (!keys2.includes(key) || !deepEqual(obj1[key], obj2[key])) {return false;}}return true;
}

3. 安全的深拷貝實現

/*** 深拷貝對象或數組(解決JSON.parse(JSON.stringify())的局限)* @param {*} obj - 要拷貝的對象* @returns {*} 返回深拷貝后的新對象* * 與JSON方法的區別:* 1. 保留Date對象(而不是變成字符串)* 2. 保留RegExp對象(而不是變成空對象)* 3. 處理循環引用(本示例未實現,實際項目需要額外處理)* * 示例:* const obj = {a:1, b: {c:2}};* const copy = deepClone(obj);*/
function deepClone(obj) {// 處理基本類型和null/undefinedif (obj === null || typeof obj !== 'object') {return obj;}// 處理Date對象if (obj instanceof Date) {return new Date(obj.getTime()); // 復制時間戳}// 處理數組if (Array.isArray(obj)) {return obj.map(item => deepClone(item)); // 遞歸拷貝每個元素}// 處理普通對象const cloned = {};for (const key in obj) {// 只拷貝對象自身的屬性(不拷貝原型鏈上的)if (obj.hasOwnProperty(key)) {cloned[key] = deepClone(obj[key]); // 遞歸拷貝每個屬性}}return cloned;
}

4. 防抖與節流函數對比

/*** 防抖函數(延遲執行)* @param {Function} fn - 要執行的函數* @param {number} delay - 延遲時間(毫秒)* @returns {Function} 返回包裝后的函數* * 應用場景:* 1. 搜索框輸入(停止輸入300ms后再搜索)* 2. 窗口resize事件(停止調整300ms后再計算布局)* * 原理:* 每次調用都清除之前的定時器,重新計時*/
function debounce(fn, delay = 300) {let timer = null;return function(...args) {clearTimeout(timer); // 清除之前的定時器timer = setTimeout(() => {fn.apply(this, args); // 延遲執行}, delay);};
}/*** 節流函數(固定間隔執行)* @param {Function} fn - 要執行的函數* @param {number} interval - 執行間隔(毫秒)* @returns {Function} 返回包裝后的函數* * 應用場景:* 1. 滾動事件(每100ms檢查一次位置)* 2. 鼠標移動事件(避免過于頻繁的觸發)* * 原理:* 記錄上次執行時間,只有超過間隔才執行*/
function throttle(fn, interval = 300) {let lastTime = 0; // 上次執行時間return function(...args) {const now = Date.now();if (now - lastTime >= interval) { // 檢查是否達到間隔fn.apply(this, args);lastTime = now; // 更新最后執行時間}};
}

5. 增強版類型檢測

/*** 精確判斷JavaScript數據類型* @param {*} value - 要檢測的值* @returns {string} 返回類型字符串* * 支持的類型:* 'null', 'undefined', 'boolean', 'number', 'string', * 'symbol', 'function', 'array', 'date', 'regexp', * 'error', 'map', 'set', 'weakmap', 'weakset', 'promise', 'object'*/
function getType(value) {// 優先處理null和undefinedif (value === null) return 'null';if (value === undefined) return 'undefined';// 處理基本類型const type = typeof value;if (type !== 'object') return type;// 使用Object.prototype.toString獲取精確類型const toString = Object.prototype.toString.call(value);// 類型映射表const typeMap = {'[object Array]': 'array','[object Date]': 'date','[object RegExp]': 'regexp','[object Error]': 'error','[object Map]': 'map','[object Set]': 'set','[object WeakMap]': 'weakmap','[object WeakSet]': 'weakset','[object Promise]': 'promise'};// 返回映射表中的類型或默認objectreturn typeMap[toString] || 'object';
}

6. 對象數組按屬性去重

/*** 對象數組根據指定屬性去重* @param {Array} arr - 對象數組* @param {string} key - 用作比較的屬性名* @returns {Array} 返回去重后的新數組* * 實現原理:* 使用Set記錄已經出現過的屬性值* 只保留每個屬性值第一次出現的對象* * 示例:* uniqueByKey([{id:1},{id:2},{id:1}], 'id') => [{id:1},{id:2}]*/
function uniqueByKey(arr, key) {const seen = new Set(); // 存儲已出現的key值return arr.filter(item => {const val = item[key]; // 獲取當前對象的key屬性值if (seen.has(val)) {return false; // 如果已經存在則過濾掉}seen.add(val); // 記錄新的key值return true; // 保留當前對象});
}

7. 高級數字格式化

/*** 數字格式化(千分位和小數位控制)* @param {number} num - 要格式化的數字* @param {number} decimals - 保留小數位數(默認2)* @returns {string} 格式化后的字符串* * 功能特點:* 1. 自動添加千分位逗號* 2. 精確控制小數位數* 3. 處理四舍五入* * 示例:* formatNumber(1234567.89123, 2) => "1,234,567.89"*/
function formatNumber(num, decimals = 2) {// 先轉換為指定位數的小數字符串const numStr = num.toFixed(decimals);// 拆分整數和小數部分const [integer, decimal] = numStr.split('.');// 添加千分位逗號const formattedInteger = integer.replace(/\B(?=(\d{3})+(?!\d))/g, ',');// 如果有小數部分則拼接,否則只返回整數return decimal ? `${formattedInteger}.${decimal}` : formattedInteger;
}

8. 安全的JSON解析

/*** 安全的JSON解析(帶錯誤處理)* @param {string} jsonStr - JSON字符串* @param {*} defaultValue - 解析失敗時返回的默認值* @returns {*} 解析后的對象或默認值* * 為什么要用:* 1. JSON.parse在解析錯誤字符串時會拋出異常* 2. 這個封裝確保始終返回有效結果* * 示例:* safeParse('{"a":1}') => {a:1}* safeParse('invalid', {}) => {}*/
function safeParse(jsonStr, defaultValue = null) {try {return JSON.parse(jsonStr);} catch (e) {console.error('JSON解析失敗:', e);return defaultValue;}
}

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

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

相關文章

【易錯題】C語言

今日遇到的易錯題 #include <stdio.h> int i;//全局變量默認初始化是0 int main() {i--;//-1if (i > sizeof(i)){printf(">\n");}else{printf("<\n");}return 0; }易錯點&#xff1a;sizeof的返回值類型實際為無符號整形&#xff0c;因此編…

第七十五章:AI的“思維操控師”:Prompt變動對潛在空間(Latent Space)的影響可視化——看懂AI的“微言大義”!

Prompt變動對潛在空間影響前言&#xff1a;AI的“思維操控師”——Prompt變動對潛在空間的影響可視化&#xff01;第一章&#xff1a;痛點直擊——Prompt“難伺候”&#xff1f;改一個字就“面目全非”&#xff01;第二章&#xff1a;AI的“思維圣地”&#xff1a;潛在空間&…

【計算機視覺與深度學習實戰】03基于Canny、Sobel和Laplacian算子的邊緣檢測系統設計與實現

第一章 引言 邊緣檢測作為計算機視覺和圖像處理領域的核心技術之一,在現代數字圖像分析中占據著舉足輕重的地位。邊緣是圖像中亮度變化劇烈的區域,通常對應著物體的輪廓、表面方向的不連續性、材質變化或照明條件的改變。準確而高效的邊緣檢測不僅是圖像分割、特征提取、模式…

【大語言模型 02】多頭注意力深度剖析:為什么需要多個頭

多頭注意力深度剖析&#xff1a;為什么需要多個頭 - 解密Transformer的核心升級 關鍵詞&#xff1a;多頭注意力、Multi-Head Attention、注意力頭、并行計算、特征學習、Transformer架構、深度學習 摘要&#xff1a;在掌握了Self-Attention基礎后&#xff0c;本文深入探討多頭注…

Python Condition對象wait方法使用與修復

在 Python 中&#xff0c;Condition 對象用于線程同步&#xff0c;其 wait() 方法用于釋放鎖并阻塞線程&#xff0c;直到被其他線程喚醒。使用不當可能導致死鎖、虛假喚醒或邏輯錯誤。以下是常見問題及修復方案&#xff1a;常見問題與修復方案1. 未檢查條件&#xff08;虛假喚醒…

嵌入式硬件——ARM

一、ARM體系結構程序編譯的過程&#xff1a;預處理&#xff08;.c-.i&#xff09;&#xff1a;宏替換&#xff0c;頭文件展開&#xff0c;去掉注釋&#xff0c;特殊符號的處理編譯&#xff08;.i-.s&#xff09;&#xff1a;C語言轉換成匯編語言匯編&#xff08;.s-.o&#xff…

Flutter 以模塊化方案 適配 HarmonyOS 的實現方法

Flutter 以模塊化方案 適配 HarmonyOS 的實現方法 Flutter的SDK&#xff1a; https://gitcode.com/openharmony-tpc/flutter_flutter 分支Tag&#xff1a;3.27.5-ohos-0.1.0-beta DevecoStudio&#xff1a;DevEco Studio 5.1.1 Release HarmonyOS版本&#xff1a;API18 本文使…

Redis入門與背景詳解:構建高并發、高可用系統的關鍵基石

本文前言認識Redis單機架構淺談分布式系統分布式是什么數據庫分離和負載均衡引入緩存數據庫分庫分表引入微服務念補充小結Redis特性介紹持久化支持集群高可用快Redis的應用場景總結前言 在當今這個數據驅動的時代&#xff0c;應用的性能和可擴展性已成為衡量其成功的關鍵指標。…

Mysql常見的優化方法

數據庫優化(底層基礎優化) 數據庫層面的優化是性能“基礎"&#xff0c; 主要包含架構設計、存儲引擎、表結構、索引策略、配置參數等方面考慮。目標是減少資源(CPU、IO和內存)消耗。 架構設計 讀寫分離&#xff1a;將"讀操作"和"寫操作"分離到不同的數…

利用Claude Code打造多語言網站內容翻譯工具:出海應用開發全流程實戰教程

一、工具選型與準備Claude Code 簡介 Claude Code 是 Anthropic 公司推出的 AI 編程助手&#xff0c;可以輔助開發者生成代碼、優化代碼結構、進行代碼解釋等&#xff0c;支持多種主流編程語言。開發環境準備 Claude Code 賬號或 API 接入權限Node.js 或 Python 環境&#xff0…

集成運算放大器(反向比例,同相比例)

基礎知識&#xff1a;反相比例運算原理&#xff1a;示波器顯示&#xff1a;結論&#xff1a;放大倍數為-R2/R1。R3的大小約等于R1與R2的并聯電阻。由于放大器的最大輸出電壓取決于供電電壓&#xff0c;所以如果R2為7k時&#xff0c;會導致失真。同向比例原理&#xff1a;示波器…

【HBase】HBaseJMX 接口監控信息實現釘釘告警

目錄 一、JMX 簡介 二、JMX監控信息釘釘告警實現 一、JMX 簡介 官網&#xff1a;Apache HBase ? Reference Guide JMX &#xff08;Java管理擴展&#xff09;提供了內置的工具&#xff0c;使您能夠監視和管理Java VM。要啟用遠程系統的監視和管理&#xff0c;需要在啟動Java…

SQL 語言規范與基礎操作指南

SQL 語言規范與基礎操作指南 SQL 作為數據庫操作的核心語言&#xff0c;遵循規范的語法和書寫習慣不僅能提高代碼可讀性&#xff0c;還能減少錯誤。本文整理了 SQL 的基礎規則、書寫規范及常用操作&#xff0c;適合初學者快速上手。 一、SQL 基本規則 1. 書寫格式 SQL 語句可寫…

產業園IBMS智能化集成系統功能有哪些?

產業園 IBMS&#xff08;建筑集成管理系統&#xff09;智能化集成系統是針對產業園 “多業態、多系統、多租戶” 特點設計的全局管理平臺&#xff0c;通過整合樓宇自控、安防、消防、能源、停車、租戶服務等子系統&#xff0c;實現 “集中監控、協同聯動、數據驅動、靈活服務”…

線性代數之兩個宇宙文明關于距離的對話

矢量的客觀性和主觀性宇宙中飄過來一個自由矢量&#xff0c;全世界的人都可以看到&#xff0c;大家都在想&#xff0c;怎么描述它呢&#xff0c;總不能指著它說“那個矢量”吧。數學家很聰明&#xff0c;于是建立了一個坐標系&#xff0c;這個矢量投影到坐標系下&#xff0c;就…

Camx-Tuning參數加載流程分析

調用時序圖 一、效果參數在開機時加載 CreateTuningDataManager邏輯分析 1.從xxx_module.xml獲取sensor名稱和效果參數名稱&#xff0c; 比如效果參數名稱為&#xff1a;xtc_tsp_sc520cs那么效果庫的完整名稱就是&#xff1a;com.qti.tuned.xtc_tsp_sc520cs.bin 2.優先從/data/…

《P4180 [BJWC2010] 嚴格次小生成樹》

題目描述小 C 最近學了很多最小生成樹的算法&#xff0c;Prim 算法、Kruskal 算法、消圈算法等等。正當小 C 洋洋得意之時&#xff0c;小 P 又來潑小 C 冷水了。小 P 說&#xff0c;讓小 C 求出一個無向圖的次小生成樹&#xff0c;而且這個次小生成樹還得是嚴格次小的&#xff…

Transformer淺說

rag系列文章目錄 文章目錄rag系列文章目錄前言一、簡介二、注意力機制三、架構優勢四、模型加速總結前言 近兩年大模型爆火&#xff0c;大模型的背后是transformer架構&#xff0c;transformer成為家喻戶曉的詞&#xff0c;人人都知道它&#xff0c;但是想要詳細講清楚&#x…

后臺管理系統-3-vue3之左側菜單欄和頭部導航欄的靜態搭建

文章目錄1 CommonAside組件(靜態搭建)1.1 Menu菜單1.2 準備菜單數據1.3 循環渲染菜單1.3.1 el-menu結構1.3.2 動態渲染圖標1.4 樣式設計1.5 整體代碼(CommonAside.vue)2 CommonHeader組件(靜態搭建)2.1 準備圖片URL數據2.2 頁面布局2.3 樣式設計2.4 整體代碼(CommonHeader.vue)…

VS Code配置MinGW64編譯非線性優化庫NLopt

VS Code用MinGW64編譯C代碼安裝MSYS2軟件并配置非線性優化庫NLopt和測試引用庫代碼的完整具體步驟。 1. 安裝MSYS2 下載安裝程序&#xff1a; 訪問 MSYS2官網下載 msys2-x86_64-xxxx.exe 并運行 完成安裝&#xff1a; 默認安裝路徑&#xff1a;C:\msys64安裝完成后&#xff0c…