20個高級JavaScript技巧,助你成為更牛的開發(fā)者
欢迎来到高级JavaScript的世界!无论你是希望磨练技能的经验丰富的开发者,还是渴望更深入地探索JavaScript奥秘的爱好者,这个博客旨在激发和教育你。让我们一起看看20个高级JavaScript技巧,这些技巧不仅能提升你的编程技能,还能让你在发现新颖且令人兴奋的代码优化方式时露出微笑。
1. 解构赋值解构是一个强大的功能,允许你从数组或对象中解构出的值和属性,并将其分配给不同的变量。这可以使你的代码更易读和更简洁。
const [第一个, 第二个] = [10, 20];
const { 名字, 年龄 } = { 名字: 'Alice', 年龄: 30 };
切换到全屏模式 退出全屏
2. 默认设置使用默认参数允许你为函数参数设置默认值,从而使你的函数更加灵活和易于使用。
function greet(name = 'Guest') {
console.log(`控制台输出:你好,${name}!`);
}
greet(); // 输出:你好,客人!
全屏,退出全屏
3. 模板字面量 (Template Literals)模板字面量提供了一种在字符串中嵌入表达式的功能,使字符串插值变得简单。
const name = 'Bob';
// 输出问候信息
console.log(`你好,${name}!`);
全屏,退出全屏
4. 箭头函数(箭函数)箭函数提供了一种简洁的语法来编写函数表达式,并且会自动将 this
关键字的值绑定到当前作用域,使得代码更加简洁和易于理解。
const add = (a, b) => a + b; // 这是一个简单的加法函数
全屏 退出全屏
5. 展开和解构操作符你可以使用扩展运算符(...
)将像数组这样的可迭代对象展开为单独的元素,而收集运算符则可以将多个元素聚集到一个数组中。
// 原始英文代码,未翻译
const numbers = [1, 2, 3];
const newNumbers = [...numbers, 4, 5];
function sum(...args) {
return args.reduce((acc, val) => acc + val, 0);
}
全屏 退出全屏
6. 承诺与异步/await异步承诺和 async/await
语法让编写和理解异步代码更容易。
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
} catch (error) {
console.error('请求数据时出错:', error);
}
}
点击全屏 按退出全屏
7. 可选链可选链操作符(?.
)允许你安全地访问深层嵌套的对象或属性,而无需显式地检查每一层是否存在。
/* 这里我们定义了一个用户对象,包含名字和城市信息。*/
const user = { name: 'Alice', address: { city: 'Wonderland' } };
/* 使用可选链操作符获取用户的城市信息。*/
const city = user?.address?.city;
进入全屏。退出全屏。
8. 空值协同空值合并操作符(??
)在遇到 null
或 undefined
时,它提供一个默认值。
const value = null ?? '默认值'; // 如果 null 为假值,则取 '默认值'
console.log(value); // 控制台输出: 默认值
全屏模式 退出全屏
9. 动态加载动态加载模块允许你按需加载模块,这样可以提高性能。
导入模块 './module.js',然后执行模块中的 doSomething
方法。
全屏 退出全屏
10. 代理类代理允许你为基础操作(例如属性查询、赋值)创建带有自定义行为的对象。
const handler = {
get: (obj, prop) => {
if (prop in obj) {
return obj[prop];
} else {
return '找不到这个属性';
}
}
};
const proxy = new Proxy({ name: 'Alice' }, handler);
console.log(proxy.name); // 打印: Alice
console.log(proxy.age); // 打印: 找不到这个属性
点全屏。退出。
11. 记忆化通过缓存函数的结果来优化耗时的函数调用是一项技术,这被称为 memoization。
// 返回一个缓存函数的结果以避免\n// 重复计算
function memoize(fn) {
const cache = {};
return function (...args) {
// 将参数序列化为字符串
const key = JSON.stringify(args);
// 如果缓存中有这个键
if (cache[key]) {
return cache[key];
}
// 否则计算结果
else {
const result = fn(...args);
cache[key] = result;
return result;
}
};
}
切换到全屏,退出全屏
12. 柯里化(Currying)柯里化是一种函数式编程技术,即将一个具有多个参数的函数转变成一系列只有一个参数的函数。
// 柯里化函数,将一个函数转换为一个接受较少参数的新函数。
function curry(fn) {
// 柯里化函数,递归实现柯里化。
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
} else {
return function (...args2) {
return curried.apply(this, args.concat(args2));
};
}
};
}
全屏 退出全屏
13. 高级函数高阶函数是这样的函数,可以接收其他函数作为参数并返回其他函数作为结果。
function higherOrder(fn) {
return function (...args) {
console.log('调用函数前');
const result = fn(...args);
console.log('调用函数后');
return result;
};
}
进入全屏 退出全屏
14. 事件代理事件代理是一种通过在父级元素上添加单一事件监听器来高效处理事件的技术。
document.querySelector('#parent').addEventListener('click', function (event) {
if (event.target.tagName === 'BUTTON') {
console.log('点击了按钮:', event.target.textContent);
}
});
全屏模式;退出全屏
15. 去抖和限流防抖和节流技术是控制函数调用的频率的技术,这种技术在优化性能表现方面很有用,例如在处理滚动事件或输入变化的场景时。
function debounce(fn, delay) {
let timeout;
// 减少快速连续触发时的函数调用次数:延迟执行传入的函数,直到上一次调用后的延迟时间过去。
return function (...args) {
clearTimeout(timeout);
timeout = setTimeout(() => fn(...args), delay);
};
}
function throttle(fn, limit) {
let inThrottle;
// 控制函数执行的频率,防止过于频繁的调用:限制传入函数的执行频率,确保在给定的时间间隔内最多执行一次。
return function (...args) {
if (!inThrottle) {
fn(...args);
inThrottle = true;
setTimeout(() => (inThrottle = false), limit);
}
};
}
全屏模式(按 esc 退出)
16. React 中的自定义 HooksReact 中的自定义钩子(custom hooks)允许你封装并重用跨越组件的有状态逻辑,以便在不同的组件中重复使用。
函数 useLocalStorage(key, initialValue) {
const [storedValue, setStoredValue] = React.useState(() => {
const item = window.localStorage.getItem(key);
return item ? JSON.parse(item) : initialValue;
});
const setValue = value => {
setStoredValue(value);
window.localStorage.setItem(key, JSON.stringify(value));
};
// `useLocalStorage` 函数用于将值存储在本地存储中,并返回一个包含当前存储值和设置新值函数的数组。
return [storedValue, setValue];
}
进入全屏模式, 退出全屏模式
第17. Web工Web Worker 让你可以在后台线程中运行脚本,从而保持用户界面的响应。
const worker = new Worker('worker.js');
worker.postMessage('Hello, Worker!');
worker.onmessage = function (event) {
console.log('工人发来了消息:', event.data);
};
全屏模式;退出全屏
18. Service WorkerService Worker 可以帮助你创建有效的离线体验,并提升应用性能。
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/service-worker.js').then(function (registration) {
console.log('Service Worker 已注册,作用域是:', registration.scope);
});
}
点击全屏模式按钮可以进入全屏模式,点击退出按钮可以退出全屏模式
19. 相交观察器 API交集观察者API提供了一种异步监控目标元素与祖先元素或视口交集变化的方法。
const observer = new IntersectionObserver(entries => {
entries.forEach(entry => {
if (entry.isIntersecting) {
console.log('元素出现在视口中:', entry.target);
}
});
});
observer.observe(document.querySelector('#target'));
你可以点击进入全屏,也可以点击退出全屏
20. 自定义元素和影子DOM自定义元素和 Shadow DOM 允许你创建出具有封装样式和封装行为的可重用组件。
class MyElement extends HTMLElement {
constructor() {
super();
const shadow = this.attachShadow({ mode: 'open' });
// 创建并定义一个自定义元素的阴影DOM
shadow.innerHTML = `<style>:host { color: blue; }</style><p>你好,世界!</p>`;
}
}
// 注册自定义元素
customElements.define('my-element', MyElement);
全屏 退出全屏
结尾探索这些高级的 JavaScript 技巧可以显著提升你的编程技能,并让编程过程更加有趣。无论你是在优化性能、提高代码可读性,还是增强用户体验,这些技术都提供了丰富的可能性。祝你在编程中找到乐趣,愿你在 JavaScript 的世界里发现新知,享受乐趣!🎉💻
……此处省略……
关注我在GitHub上。
如果你觉得这篇博客有帮助,并想了解更多更高级的 JavaScript 技巧和窍门,可以在 GitHub 上关注我。
在GitHub上关注sovannaro:链接: https://github.com/sovannaro
如果你觉得我的内容有用并喜欢它,你可以买我一杯咖啡来支持我!你的支持让我继续分享有价值的知识。☕❤️ buymeacoffee.com/sovannaro
共同學(xué)習(xí),寫下你的評論
評論加載中...
作者其他優(yōu)質(zhì)文章