您好,登录后才能下订单哦!
# 非常实用的JavaScript一行代码有哪些
JavaScript作为现代Web开发的基石语言,其简洁高效的特性一直备受开发者推崇。本文将深入探讨50个极具实用价值的JavaScript单行代码解决方案,涵盖数据处理、DOM操作、日期处理、随机生成等核心领域,每个示例都附带详细说明和实际应用场景。
## 一、数据处理与转换
### 1. 数组去重
```javascript
const uniqueArr = [...new Set(arr)];
利用Set数据结构的唯一性特性,配合扩展运算符快速实现数组去重。时间复杂度O(n),比传统双重循环方案更高效。
const deepCopy = JSON.parse(JSON.stringify(obj));
通过JSON序列化反序列化实现简单深拷贝,但需注意会丢失函数、undefined等特殊类型。
const flatArr = arr.flat(Infinity);
ES2019新增的flat方法配合Infinity参数可递归展开任意深度嵌套数组。
const filtered = Object.fromEntries(Object.entries(obj).filter(([key]) => ['id','name'].includes(key)));
通过Object.entries转换后过滤,再转回对象,适合处理API响应数据。
const union = [...new Set([...arr1, ...arr2])];
集合运算的并集实现,保持元素唯一性的同时合并多个数组。
const randomInt = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
包含边界的均匀分布随机整数生成器,适用于抽奖、验证码等场景。
const formatNum = num => num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
使用正则表达式实现金融数字显示格式,支持任意位数数字。
const celsiusToFahrenheit = celsius => celsius * 9/5 + 32;
简单的单位转换公式,注意运算优先级。
const average = arr => arr.reduce((a, b) => a + b) / arr.length;
reduce求和后除法,比循环更简洁,但需注意空数组情况。
const fib = n => Array(n).fill().reduce((acc,_,i) => acc.concat(i>1 ? acc[i-1]+acc[i-2] : i), []);
利用reduce和数组初始化技巧生成指定位数的数列。
const formatDate = date => date.toISOString().split('T')[0];
使用ISO标准格式快速获取日期部分,时区需注意。
const dayDiff = (date1, date2) => Math.ceil(Math.abs(date1 - date2) / (1000 * 60 * 60 * 24));
毫秒数换算为天数,适合计算倒计时、有效期等场景。
const timestamp = +new Date();
一元加号快速转换Date对象为毫秒时间戳。
const isLeapYear = year => (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
完整的闰年判断逻辑,考虑世纪年特殊情况。
const lastDay = (y,m) => new Date(y, m, 0).getDate();
利用Date构造函数自动计算下个月第0天的特性。
const capitalize = str => str.charAt(0).toUpperCase() + str.slice(1);
字符串不可变性的典型处理方式。
const randomStr = () => Math.random().toString(36).slice(2);
基于随机数的base36编码,适合生成临时ID。
const escapeHTML = str => str.replace(/[&<>'"]/g, tag => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[tag]));
防止XSS攻击的基本处理,重要安全措施。
const reverseStr = str => [...str].reverse().join('');
扩展运算符正确处理Unicode字符。
const rainbowText = str => [...str].map((c,i) => `<span style="color:hsl(${i*30},100%,50%)">${c}</span>`).join('');
HSL色彩模型循环生成渐变色效果。
const scrollToTop = () => window.scrollTo({top: 0, behavior: 'smooth'});
现代浏览器支持的平滑滚动API。
const copyText = text => navigator.clipboard.writeText(text);
异步Clipboard API,需注意权限限制。
const getParam = name => new URLSearchParams(window.location.search).get(name);
URLSearchParams内置解析器替代正则方案。
const isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;
CSS媒体查询的JavaScript接口。
const toggleFullscreen = () => document[!document.fullscreenElement ? 'documentElement' : 'exitFullscreen']().requestFullscreen();
全屏API的综合应用,注意浏览器前缀。
const curry = fn => (...args) => args.length >= fn.length ? fn(...args) : (...more) => curry(fn)(...args, ...more);
经典柯里化实现,支持多参数分步传递。
const pipe = (...fns) => x => fns.reduce((v, f) => f(v), x);
函数式编程的核心工具,实现数据处理流水线。
const memoize = fn => ((cache={}) => (...args) => cache[args] ??= fn(...args))();
利用闭包和空值合并运算符实现高性能缓存。
const debounce = (fn, delay) => { let timer; return (...args) => (clearTimeout(timer), timer = setTimeout(() => fn(...args), delay); };
事件频繁触发时的性能优化方案。
const throttle = (fn, wait) => { let last; return (...args) => (!last || Date.now() - last >= wait) && (fn(...args), last = Date.now()); };
控制函数执行频率的另一种方式。
const isEmpty = obj => !obj || (Object.keys(obj).length === 0 && obj.constructor === Object);
严谨的空对象判断,包括原型链检查。
const isArray = obj => Array.isArray(obj);
比instanceof更可靠的数组检测方法。
const toChineseNum = num => [...'零一二三四五六七八九'][num];
简单数字映射,复杂版本需要处理位数。
const type = obj => Object.prototype.toString.call(obj).slice(8,-1).toLowerCase();
最准确的类型判断方法,区分所有内置类型。
const safeParse = json => { try { return JSON.parse(json); } catch { return null; } };
带错误处理的JSON解析,避免代码崩溃。
const uuid = () => crypto.randomUUID?.() || 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => (c === 'x' ? (Math.random()*16|0).toString(16) : '89ab'[Math.random()*4|0]));
优先使用现代API,降级方案保证兼容性。
const wait = ms => new Promise(resolve => setTimeout(resolve, ms));
异步编程中的延时控制基础工具。
const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
UA检测虽然不完美但仍有实用价值。
const getSelection = () => window.getSelection().toString();
浏览器文本选择API的简单封装。
const genPassword = (len=8) => [...Array(len)].map(() => (~~(Math.random()*36)).toString(36)).join('');
包含数字和字母的随机密码生成器。
const getProp = (obj, path) => path.split('.').reduce((o,k) => o?.[k], obj);
可选链操作符实现安全的多级属性访问。
const config = userConfig ?? defaultConfig;
比||更精准的默认值设置方式,只对null/undefined生效。
const billion = 1_000_000_000;
提升大数字可读性的语法糖。
const groupBy = (arr, key) => arr.reduce((acc, obj) => ((acc[obj[key]] ??= []).push(obj), acc), {});
使用reduce实现类似SQL的GROUP BY操作。
user.role ||= 'guest';
简洁的条件属性赋值语法。
const singleton = (fn => { let instance; return (...args) => (instance ??= new fn(...args)); })();
闭包实现的设计模式经典案例。
const aspect = (fn, {before, after}) => (...args) => (before?.(args), fn(...args), after?.(args));
函数装饰器的简单实现。
const lazy = fn => { let result; return () => (result ??= fn()); };
延迟计算直到第一次访问的优化模式。
const chain = obj => new Proxy(obj, { get: (t,k) => k in t ? typeof t[k] === 'function' ? (...args) => (t[k](...args), chain(t)) : t[k] : undefined });
Proxy实现的方法链语法糖。
const createMachine = config => (state, action) => config[state]?.[action] ?? state;
极简有限状态机实现。
这些精炼的一行代码解决方案体现了JavaScript语言的灵活性和表现力。掌握这些技巧可以: 1. 大幅减少样板代码 2. 提高开发效率 3. 深入理解语言特性 4. 编写更优雅的代码
建议读者在实际项目中逐步应用这些模式,并根据具体需求进行调整优化。记住,代码的简洁性应以可读性和可维护性为前提。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。