ES6 都用 3 年了,2024 新特性你敢不看?

一、近三年 ES6 常用知识点

1. 块级作用域(letconst

解释

在 ES6 之前,JavaScript 只有全局作用域和函数作用域,使用 var 声明变量容易引发变量提升和作用域混乱问题。

letconst 引入了块级作用域,块级作用域是指由 {} 包裹的代码块,在这个代码块内声明的变量只能在该代码块内访问。let 用于声明可变的变量,const 用于声明常量,一旦声明必须赋值且不能重新赋值(如果是引用类型,其内部属性可以修改)。

代码案例 1

javascript 复制代码
// let 块级作用域示例
{
    let localVar = 'I am zhifou';
    console.log(localVar); // 输出: I am zhifou
}
// console.log(localVar); // 报错,localVar 未定义

代码案例 2

javascript 复制代码
// const 常量声明示例
const PI = 3.14;
// PI = 3.14159; // 报错,不能重新赋值
const person = { name: '知否技术' };
person.name = '迪丽热巴'; // 可以修改引用类型内部属性
console.log(person.name); // 输出: 迪丽热巴

2. 箭头函数

解释

箭头函数是 ES6 提供的一种更简洁的函数定义方式。它没有自己的 thisargumentssupernew.target,其 this 值继承自外层函数。语法上,当只有一个参数时可以省略括号,当函数体只有一条语句时可以省略花括号和 return 关键字。

代码案例 1

javascript 复制代码
// 基本箭头函数示例
const add = (a, b) => a + b;
console.log(add(2, 3)); // 输出: 5

代码案例 2

javascript 复制代码
// 箭头函数与 this 示例
const obj = {
    name: '知否君',
    sayHello: function() {
        setTimeout(() => {
            console.log(`Hello, ${this.name}`); // 这里的 this 指向 obj
        }, 1000);
    }
};
obj.sayHello(); // 输出: Hello, 知否君

3. 模板字符串

解释

模板字符串使用反引号来包裹字符串,它可以嵌入表达式,通过 ${} 语法将变量或表达式的值插入到字符串中。还支持多行字符串,保留换行和缩进。

代码案例 1

javascript 复制代码
// 嵌入表达式示例
const name = 'zhifou';
const message = `Hello, ${name}!`;
console.log(message); // 输出: Hello, zhifou!

代码案例 2

javascript 复制代码
// 多行字符串示例
const multiLine = `
    This is a
    multi - line
    string.
`;
console.log(multiLine);

4. 解构赋值

解释

解构赋值允许从数组或对象中提取值并赋值给变量,使代码更加简洁。对于数组,按照元素的顺序进行赋值;对于对象,根据属性名进行赋值。

代码案例 1

javascript 复制代码
// 数组解构示例
const numbers = [1, 2, 3];
const [first, second, third] = numbers;
console.log(first, second, third); // 输出: 1 2 3

代码案例 2

javascript 复制代码
// 对象解构示例
const person = {
    firstName: '科比',
    lastName: '布莱恩特',
    age: 20
};
const { firstName, lastName, age } = person;
console.log(firstName, lastName, age); // 输出: 科比 布莱恩特 20

5. 默认参数

解释

在函数定义时,可以为参数设置默认值。当调用函数时,如果没有传递该参数或者传递的值为 undefined,则使用默认值。

代码案例 1

javascript 复制代码
// 函数默认参数示例
function greet(name = '迪丽热巴') {
    return `Hello, ${name}!`;
}
console.log(greet()); // 输出: Hello, 迪丽热巴!
console.log(greet('知否君')); // 输出: Hello, 知否君!

代码案例 2

javascript 复制代码
// 多个默认参数示例
function calculate(a = 1, b = 2) {
    return a + b;
}
console.log(calculate()); // 输出: 3
console.log(calculate(3, 4)); // 输出: 7

6. 扩展运算符

解释

扩展运算符(...)可以将数组或对象展开。在数组中,可用于合并数组、复制数组等;在对象中,可用于合并对象、复制对象等。

代码案例 1

javascript 复制代码
// 数组扩展运算符示例
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const combined = [...arr1, ...arr2];
console.log(combined); // 输出: [1, 2, 3, 4, 5, 6]

代码案例 2

javascript 复制代码
// 对象扩展运算符示例
const obj1 = { a: 1, b: 2 };
const obj2 = { c: 3, d: 4 };
const merged = { ...obj1, ...obj2 };
console.log(merged); // 输出: { a: 1, b: 2, c: 3, d: 4 }

7. 类和继承

解释

ES6 引入了 class 关键字来创建类,使 JavaScript 具有了更像传统面向对象语言的类语法。constructor 方法用于初始化对象,extends 关键字用于实现类的继承,子类可以继承父类的属性和方法,还可以重写父类的方法。

代码案例 1

javascript 复制代码
// 类的基本使用示例
class Animal {
    constructor(name) {
        this.name = name;
    }
    speak() {
        console.log(`${this.name} makes a noise.`);
    }
}
const dog = new Animal('Dog');
dog.speak(); // 输出: Dog makes a noise.

代码案例 2

javascript 复制代码
// 类的继承示例
class Cat extends Animal {
    speak() {
        console.log(`${this.name} meows.`);
    }
}
const cat = new Cat('Cat');
cat.speak(); // 输出: Cat meows.

8. Promise

解释

Promise 是一种处理异步操作的对象,用于解决回调地狱问题。它有三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败)。可以通过 then 方法处理成功的结果,通过 catch 方法处理失败的结果。

代码案例 1

javascript 复制代码
// Promise 基本使用示例
function fetchData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('Data fetched');
        }, 1000);
    });
}
fetchData()
  .then(data => console.log(data))
  .catch(error => console.error(error));

代码案例 2

javascript 复制代码
// Promise 链式调用示例
function asyncTask1() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve('Task 1 completed');
        }, 1000);
    });
}
function asyncTask2() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve('Task 2 completed');
        }, 1000);
    });
}
asyncTask1()
  .then(result1 => {
        console.log(result1);
        return asyncTask2();
    })
  .then(result2 => console.log(result2))
  .catch(error => console.error(error));

二、2024 年新特性

1. 私有属性和方法的增强

解释

在 ES2024 中,私有属性和方法的使用更加灵活和严格。私有属性和方法以 # 开头,只能在类的内部访问,外部无法直接访问,增强了类的封装性。

代码案例 1

javascript 复制代码
class SecretClass {
    #privateProperty = 'Secret';
    #privateMethod() {
        return this.#privateProperty;
    }
    publicMethod() {
        return this.#privateMethod();
    }
}
const secret = new SecretClass();
console.log(secret.publicMethod()); // 输出: Secret
// console.log(secret.#privateProperty); // 报错,外部无法访问私有属性

代码案例 2

javascript 复制代码
class Calculator {
    #value = 0;
    #add(num) {
        this.#value += num;
    }
    increment() {
        this.#add(1);
        return this.#value;
    }
}
const calc = new Calculator();
console.log(calc.increment()); // 输出: 1

2. 数组和对象的扩展方法

解释

  • 数组的 toSortedtoReversedtoSpliced :这些方法会返回一个新的数组,而不会修改原数组,类似于 sortreversesplice 方法,但保持原数组不变。
  • 对象的 with 方法:用于创建一个新对象,继承原对象的属性,并可以修改指定的属性。

代码案例 1

javascript 复制代码
// 数组 toSorted 方法示例
const originalArray = [3, 1, 2];
const sortedArray = originalArray.toSorted();
console.log(sortedArray); // 输出: [1, 2, 3]
console.log(originalArray); // 输出: [3, 1, 2]

代码案例 2

javascript 复制代码
// 对象 with 方法示例
const originalObject = { a: 1, b: 2 };
const newObject = originalObject.with({ b: 3 });
console.log(newObject); // 输出: { a: 1, b: 3 }
console.log(originalObject); // 输出: { a: 1, b: 2 }

3. 异步生成器和 for - await - of 循环的增强

解释

异步生成器是一种特殊的生成器,它可以产生异步值。for - await - of 循环用于遍历异步可迭代对象,简化了异步迭代的操作。

代码案例 1

javascript 复制代码
async function* asyncGenerator() {
    let i = 0;
    while (i < 3) {
        await new Promise(resolve => setTimeout(resolve, 1000));
        yield i++;
    }
}
(async () => {
    for await (const value of asyncGenerator()) {
        console.log(value);
    }
})();

代码案例 2

javascript 复制代码
class AsyncIterable {
    async *[Symbol.asyncIterator]() {
        let i = 0;
        while (i < 2) {
            await new Promise(resolve => setTimeout(resolve, 500));
            yield i++;
        }
    }
}
(async () => {
    const asyncIterable = new AsyncIterable();
    for await (const value of asyncIterable) {
        console.log(value);
    }
})();

通过上述内容,你可以全面了解近三年 ES6 常用知识点以及 2024 年的新特性,这些特性在现代 JavaScript 开发中起着重要作用。

相关推荐
恋猫de小郭24 分钟前
Android 确定废弃「屏幕方向锁定」等 API ,如何让 App 适配大屏和 PC/XR 等场景
android·前端·flutter
API_technology2 小时前
淘宝API+爬虫混合方案:合规采集历史价格与评价数据
前端·数据库·爬虫·数据挖掘
时间会给答案scidag2 小时前
maven高级
java·服务器·前端
前端小趴菜056 小时前
JavaScript 读取电脑复制的内容
前端·javascript
OK_boom6 小时前
React状态管理器的应用
前端·javascript·react.js
再学一点就睡7 小时前
一文搞懂跨域问题:原理、解决方案与实战避坑指南
前端·javascript
六个点7 小时前
面试中常见的手写题汇总
前端·javascript·面试
Json_8 小时前
Vue computed Option 计算选项
前端·vue.js·深度学习
西陵8 小时前
一文带你吃透前端网站嵌入设计
前端·javascript·架构
给钱,谢谢!8 小时前
记录vite引入sass预编译报错error during build: [vite:css] [sass] Undefined variable.问题
前端·css·sass·vite