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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…