JavaScript有很多好用但容易被忽略的功能。合理使用这些功能,不仅能减少代码量,还能提高程序运行效率。下面介绍10个值得尝试的JavaScript特性。
处理重复数据时,Set比传统方法快很多。Set自动保证值的唯一性,查找速度也很快。
数组去重可以这样写:
const duplicateIds = [101, 102, 102, 103, 103, 103];
const uniqueIds = [...new Set(duplicateIds)];
console.log(uniqueIds); // [101, 102, 103]防止重复添加事件监听器:
const listenedEvents = new Set();
function safeAddEvent(eventName, handler) {
if (!listenedEvents.has(eventName)) {
window.addEventListener(eventName, handler);
listenedEvents.add(eventName);
}
}
// 多次调用也只会绑定一次
safeAddEvent("scroll", () => console.log("页面滚动"));
safeAddEvent("scroll", () => console.log("页面滚动"));这对方法让对象操作变得简单。
过滤对象中的空值:
const userInfo = {
name: "张三",
age: 28,
avatar: "",
phone: "13800138000"
};
const filteredUser = Object.fromEntries(
Object.entries(userInfo).filter(([key, value]) => value !== "")
);
console.log(filteredUser); // {name: "张三", age: 28, phone: "13800138000"}解析URL参数:
const searchStr = "name=张三&age=28&gender=男";
const paramObj = Object.fromEntries(new URLSearchParams(searchStr));
console.log(paramObj); // {name: "张三", age: "28", gender: "男"}传统的||操作符会把0、空字符串等有效值当成false,??只对null和undefined起作用。
设置默认值:
const userInputCount = 0;
// 错误写法:会把0替换成10
const wrongCount = userInputCount || 10;
// 正确写法:保留0
const correctCount = userInputCount ?? 10;
console.log(wrongCount, correctCount); // 10, 0给对象设置默认属性:
const requestConfig = { timeout: 5000 };
// 只有当retries为null或undefined时才设置默认值
requestConfig.retries ??= 3;
console.log(requestConfig); // {timeout: 5000, retries: 3}不需要引入额外的库,浏览器原生支持多语言格式化。
货币格式化:
const price = 1234.56;
// 人民币格式
const cnyPrice = new Intl.NumberFormat("zh-CN", {
style: "currency",
currency: "CNY"
}).format(price);
// 美元格式
const usdPrice = new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD"
}).format(price);
console.log(cnyPrice, usdPrice); // ¥1,234.56 $1,234.56日期本地化:
const now = new Date();
// 中文日期格式
const cnDate = new Intl.DateTimeFormat("zh-CN", {
year: "numeric",
month: "long",
day: "numeric",
hour: "2-digit",
minute: "2-digit",
second: "2-digit"
}).format(now);
console.log(cnDate); // 2024年11月3日 15:40:22传统的滚动检测会影响页面性能,这个API可以异步监听元素是否进入视口。
图片懒加载:
<img >="real-image.jpg" src="placeholder.jpg" class="lazy-img">const lazyObserver = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
lazyObserver.unobserve(img);
}
});
});
document.querySelectorAll(".lazy-img").forEach((img) => {
lazyObserver.observe(img);
});Promise.all在有一个请求失败时就会全部失败,allSettled会等待所有请求完成。
批量请求处理:
const requestList = [
fetch("/api/user/101"),
fetch("/api/orders/101"),
fetch("/api/messages/101")
];
Promise.allSettled(requestList).then((results) => {
const successData = results
.filter(res => res.status === "fulfilled")
.map(res => res.value);
const failedRequests = results
.filter(res => res.status === "rejected")
.map(res => res.reason);
console.log("成功的数据:", successData);
console.log("失败的请求:", failedRequests);
});不需要手动遍历父元素,直接用选择器查找最近的匹配祖先元素。
点击列表项找到列表容器:
document.querySelectorAll(".user-item").forEach((item) => {
item.addEventListener("click", (e) => {
const list = e.target.closest(".user-list");
list.classList.toggle("active");
});
});解析和操作URL不再需要复杂的正则表达式。
解析当前页面URL:
const currentUrl = new URL(window.location.href);
console.log(currentUrl.searchParams.get("name")); // 获取参数
console.log(currentUrl.hostname); // 域名构建新的URL:
const url = new URL("https://fly63.com/list");
url.searchParams.append("page", 2);
url.searchParams.set("size", 10);
console.log(url.href); // https://fly63.com/list?page=2&size=10支持break和continue,可以遍历多种数据类型。
在数组中查找特定元素:
const productList = [
{ id: 1, name: "手机", price: 5999 },
{ id: 2, name: "电脑", price: 9999 },
{ id: 3, name: "平板", price: 3999 }
];
for (const product of productList) {
if (product.price > 8000) {
console.log("找到高价产品:", product);
break; // 找到后停止循环
}
}在模块顶层直接使用await,导入时会自动等待异步操作完成。
异步加载配置:
// config.js
const response = await fetch("/api/config");
export const appConfig = await response.json();
// 其他文件导入时会自动等待配置加载完成
import { appConfig } from "./config.js";按需加载模块:
document.getElementById("show-chart-btn").addEventListener("click", async () => {
const { renderChart } = await import("./chart-module.js");
renderChart("#chart-container");
});这些JavaScript功能在现代浏览器中都有很好的支持。它们可以帮助我们:
在实际项目中,根据具体需求选择合适的特性,能够显著提升开发效率和代码质量。建议从Set、??操作符等简单功能开始尝试,逐步在项目中应用更多实用特性。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!
一个系统可以维持5年,10年,甚至20年以上,但是代码和设计模式的生命周期非常短,当对一个解决方案使用不同的方法进行迭代的时候,通常只能维持数月,数日,甚至几分钟的时间
良好的编程习惯涉及到很多方面,但在软件行业内,大多数的公司或组织都不会把良好的编程习惯列为主要关注点。 例如,具有可读性和可维护性的代码比编写好的测试代码或使用正确的工具更有意义,前者的意义在于可以让代码更易于理解和修改。
减少嵌套会让代码可读性更好,同时也能更容易的找出bug,开发人员可以更快的迭代,程序也会越来越稳定。简化代码,让编程更轻松!
Google为了那些还不熟悉代码规范的人发布了一个JS代码规范。其中列出了编写简洁易懂的代码所应该做的最佳实践。代码规范并不是一种编写正确JavaScript代码的规则,而是为了保持源代码编写模式一致的一种选择。
程序员似乎忘记了软件的真正目的,那就是解决现实问题。您编写的代码的目的是为了创造价值并使现有世界变得更美好,而不是满足您对自我世界应该是什么的以自我为中心的观点。有人说:如果你拥有的只是一把锤子,那么一切看起来都像钉子一样
TinyMCE是一个轻量级的基于浏览器的所见即所得编辑器,由JavaScript写成。它对IE6+和Firefox1.5+都有着非常良好的支持。功能方强大,并且功能配置灵活简单。另一特点是加载速度非常快的。
函数式编程对应的是命令式编程, 函数式编程的核心当然是对函数的运用. 而高阶函数(Higher-order)是实现函数式编程的基本要素。高阶函数可以将其他函数作为参数或者返回结果。所以JS天生就支持函数式编程
朋友发表了一条说说:入职新公司,从重构代码到放弃”,我就问他怎么了?他说,刚进一家新公司,接手代码太烂,领导让我先熟悉业务逻辑,然后去修复之前项目中遗留的bug,实在不行就重构
页面实现关键词高亮显示:在项目期间遇到一个需求,就是搜索关键词时需要高亮显示,主要通过正则匹配来实现页面关键词高亮显示。在搜索结果中高亮显示关键词:有一组关键词数组,在数组中筛选出符合关键字的内容并将关键字高亮
软件工程学什么? 学计算机,写程序,做软件,当程序员。听说学计算机很辛苦? 是的,IT行业加班现象严重。在计算机世界里,技术日新月异,自学能力是程序员最重要的能力之一。选了这个专业,就要时刻保持好奇心和技术嗅觉,不能只满足于完成课内作业。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!