三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

JavaScript 高级特性完全指南:从 ES6 到 ES2025 的 10 个核心知识点!

JavaScript 高级特性完全指南:从 ES6 到 ES2025 的 10 个核心知识点!

大家好呀,我是 king。欢迎来到这篇 JavaScript 进阶指南。如果你是一名前端爱好者,或者正在尝试让自己的 JS 水平更进一步,那这篇文章可能会对你有帮助。我会从 ES6 一直聊到 ES2025,挑出 10 个实用又高级的特性,用大白话讲清楚。放心,没有那些奇怪的词汇,只有能直接上手的代码和经验。


1. 块级作用域:let 和 const 的实用之道

过去我们用 var 声明变量,它没有那么“守规矩”,经常会跑到外面去。而 let 和 const 解决了这个问题。

// var 的老问题
if (true) {var message = "你好";
}
console.log(message); // 居然能访问到,不太安全// let 和 const 更守规则
if (true) {let greeting = "你好呀";const PI = 3.14;
}
// console.log(greeting); // 报错,访问不到

小建议:默认用 const,只有明确需要重新赋值时才用 let。

2. 箭头函数:让 this 不再迷路

箭头函数除了写法简洁,最大的优点是它不会创建自己的 this,而是继承外层的 this。

// 普通函数有时 this 会指向奇怪的地方
const player = {name: "king",oldWay: function() {setTimeout(function() {console.log(this.name); // undefined 或报错}, 100);},arrowWay: function() {setTimeout(() => {console.log(this.name); // 正确输出 king}, 100);}
};
player.arrowWay();

记住:箭头函数没有自己的 this,也不适合做构造函数。

3. 解构赋值:快速取数据

无论是对象还是数组,解构都能让你少写很多代码。

const user = { id: 1, nickname: "king", score: 99 };
const { nickname, score } = user;
console.log(`${nickname} 得了 ${score} 分`);const colors = ["红", "绿", "蓝"];
const [first, second] = colors;
console.log(first); // 红

函数返回多个值时尤其好用:

function getConfig() {return { width: 100, height: 200, theme: "暗色" };
}
const { width, theme } = getConfig();

4. 展开运算符与剩余参数:合并与拆分

... 这个三个点,能展开数组或对象,也能收集剩余参数。

// 合并数组
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const combined = [...arr1, ...arr2];// 合并对象
const baseInfo = { name: "king", age: 18 };
const extraInfo = { city: "杭州", hobby: "写代码" };
const fullInfo = { ...baseInfo, ...extraInfo };// 剩余参数收集
function logAll(first, ...rest) {console.log("第一个:", first);console.log("其余:", rest);
}
logAll("a", "b", "c", "d");

5. Promise 与 async/await:告别回调嵌套

过去我们用回调函数处理异步,容易写出“回调地狱”。Promise 解决了这个问题,而 async/await 让代码更像同步写法。

function fetchUser() {return new Promise((resolve) => {setTimeout(() => resolve({ name: "king", level: 10 }), 500);});
}// 旧式 Promise 链
fetchUser().then(user => console.log(user)).catch(err => console.error(err));// 现代 async/await 写法
async function showUser() {try {const user = await fetchUser();console.log(`欢迎 ${user.name},等级 ${user.level}`);} catch (error) {console.log("出错了", error);}
}
showUser();

6. 可选链与空值合并:安全地访问深层属性

当你访问 obj.a.b.c 时,如果中间某一层是 undefined 或 null,程序就会报错。可选链 ?. 可以避免这个问题。

const config = {theme: { colors: { primary: "蓝色" } }
};console.log(config.theme?.colors?.primary); // 蓝色
console.log(config.other?.setting?.name);   // undefined,不报错// 空值合并 ?? :只有左侧为 null 或 undefined 时才用右侧
const userInput = null;
const finalValue = userInput ?? "默认值";
console.log(finalValue); // 默认值

注意:?? 和 || 不同,|| 会把 0 或 '' 也当成假值,而 ?? 不会。

7. 模块化:import 和 export 的清晰组织

模块化让代码更容易维护。你可以把不同功能拆到不同文件。

// 文件:utils.js
export function add(a, b) {return a + b;
}
export const version = "1.0.0";// 文件:main.js
import { add, version } from './utils.js';
console.log(add(3, 5)); // 8// 也可以默认导出
// 文件:logger.js
export default function log(msg) {console.log(`[日志] ${msg}`);
}
// 导入时
import myLogger from './logger.js';

8. 迭代器与生成器:按需产生数据

生成器函数 function* 可以在需要时一步步返回数据,而不是一次性算完所有结果。

function* idGenerator() {let id = 1;while (true) {yield id;id++;}
}const gen = idGenerator();
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // 3
// 可以一直取下去,不会一次性占用大量内存

这在处理大量数据或无限序列时很有用。

9. 新特性速览:ES2022 到 ES2025 的实用补充

  • 数组的 at 方法:支持负数索引  https://www.34game.com.cn   https://www.48game.com.cn  https://www.35game.com.cn   https://www.38game.com.cn

    const arr = [10, 20, 30];
    console.log(arr.at(-1)); // 30,不用再写 arr[arr.length - 1]
    • 顶层 await:在模块最外层直接使用 await,不用包在 async 函数里

      // 某个模块文件中
      const data = await fetch('https://api.example.com/data');
      export default data;
      • 对象成员简写与计算属性名(老特性但很常用)

        const key = "dynamicKey";
        const obj = {[key]: "动态值",x: 1,y: 2
        };

        10. 实战小技巧:把以上特性组合起来

        来看一个综合示例:模拟获取用户信息并展示。

        // 模拟 API
        async function fetchUserProfile(userId) {// 模拟网络请求return new Promise(resolve => {setTimeout(() => {resolve({id: userId,name: "king",tags: ["前端", "JS爱好者"],settings: { theme: "深色模式" }});}, 300);});
        }async function showUserProfile(userId) {try {const user = await fetchUserProfile(userId);const { name, tags, settings } = user;const theme = settings?.theme ?? "浅色模式";console.log(`用户:${name}`);console.log(`标签:${tags.join(", ")}`);console.log(`主题:${theme}`);} catch (err) {console.log("加载失败");}
        }showUserProfile(1001);

        问答环节

        问:我需要马上学完所有这些特性才能工作吗?

        答:不需要。你可以先掌握 let/const、箭头函数、解构、Promise/async/await 和可选链,这五个特性就能覆盖日常 80% 以上的场景。剩下的是锦上添花,遇到了再学也不晚。关键是理解每个特性解决的是什么痛点,而不是死记语法。

        问:老项目用的是 ES5 语法,我该怎么引入新特性?

        答:稳妥的做法是不要直接在老项目里大改。你可以:

        1. 新写的模块用新语法,通过构建工具(比如 webpack 或 Vite)转译成兼容代码。

        2. 逐步重构,优先替换回调嵌套和 var 声明的问题区域。 https://www.kkkmir.com  https://www.sofuba.com  https://www.haomir.com.cn  https://www.644game.com.cn https://www.887game.com.cn

        3. 和团队成员达成共识,约定好新代码允许使用的 ES 版本范围。
          现代浏览器对新特性的支持已经很好,但如果要兼容老版本浏览器,建议搭配 Babel 处理。


        我是 king,希望这份指南对你有帮助。JavaScript 一直在生长,但这些核心思想不会轻易过时。下次见~

         
← 返回列表