你还不知道 常用 ES6 语法糖?!

203 阅读3分钟

引言

ES6,也称为 ECMAScript 2015,是 JavaScript 的一个重要版本,引入了许多新的特性和语法糖,极大地提升了开发者的生产力和代码的可读性。本文将详细介绍 ES6 的一些核心特性,并通过具体的示例来展示它们的实际应用。

块级作用域:let 和 const

1.var 的问题

在 ES5 中,使用 var 关键字声明的变量具有函数作用域或全局作用域。这意味着在全局作用域中声明的变量在整个程序中都是可见的。这种作用域机制有时会导致意外的行为,尤其是在嵌套的循环和条件语句中。例如:

for (var i = 0; i < 10; i++) {
    setTimeout(function() {
        console.log(i); // 输出 10 次 10
    }, 100);
}

在上述代码中,`由于 i 是在函数作用域内声明的,所有的回调函数都会访问到同一个 i 变量,因此输出结果是 10 次 10`。

2.let 和 const 的引入

ES6 引入了 letconst 关键字,用于声明块级作用域的变量。块级作用域意味着变量只在声明它的代码块内可见,这大大减少了变量污染和意外行为的发生。

for (let i = 0; i < 10; i++) {
    setTimeout(function() {
        console.log(i); // 输出 0 到 9
    }, 100);
}

在上述代码中,i 是在每次循环迭代中重新声明的,因此每个回调函数访问的是不同的 i 变量,输出结果是从 0 到 9。

3.let 和 const 的区别
  • let:声明的变量可以被重新赋值。

  • const:声明的变量一旦赋值就不能再被改变,但可以修改其属性(如果是对象或数组)。

    const person = { name: 'Alice' }; person.name = 'Bob'; // 合法 person = { name: 'Charlie' }; // 报错

4.三种的变量提升

letconst 声明的变量不会被提升到块级作用域的顶部,而 var 声明的变量会被提升到函数或全局作用域的顶部。

console.log(x); // undefined
var x = 10;

console.log(y); // ReferenceError: y is not defined
let y = 20;

箭头函数

箭头函数是 ES6 中引入的一种新的函数定义方式,它提供了更简洁的语法,并且在处理 **this** 绑定时有显著的优势

简洁的语法:箭头函数的语法比传统的函数表达式更简洁
// 传统函数表达式
var add = function(a, b) {
    return a + b;
};

// 箭头函数
const add = (a, b) => a + b;
this 绑定

箭头函数中的 this 绑定的是定义时所在的作用域,而不是调用时的作用域。这对于事件处理和回调函数非常有用。

function Person() {
    this.age = 0;

    setInterval(() => {
        this.age++; // this 正确绑定到 Person 实例
    }, 1000);
}

const p = new Person();

解构赋值

解构赋值允许你从数组或对象中提取数据,并将其赋值给变量。这使得代码更加简洁和易读。

数组解构
const [a, b, c] = [1, 2, 3];
console.log(a); // 1
console.log(b); // 2
console.log(c); // 3
对象解构
const person = { name: 'Alice', age: 30 };
const { name, age } = person;
console.log(name); // Alice
console.log(age); // 30

默认参数

ES6 允许在函数定义中为参数提供默认值,这使得函数调用更加灵活。

function greet(name = 'Guest') {
    console.log(`Hello, ${name}!`);
}

greet(); // Hello, Guest!
greet('Alice'); // Hello, Alice!

模板字符串

模板字符串允许你在字符串中嵌入表达式,使用反引号(`)包裹字符串,并使用 ${} 插入表达式。

const name = 'Alice';
const age = 30;
const message = `Hello, my name is ${name} and I am ${age} years old.`;
console.log(message); // Hello, my name is Alice and I am 30 years old.

类和继承

ES6 引入了类的概念,使得面向对象编程更加直观和简洁。

类的定义
new一个新对象,传入两个参数。传递的参数沿着原型链调用构造函数Person,
并且绑定到this进行新对象的初始化

class Person {
    constructor(name, age) {//construtor初始化
        this.name = name;
        this.age = age;
    }

    greet() {//方法
        console.log(`Hello, my name is ${this.name}.`);
    }
}

const alice = new Person('Alice', 30);
alice.greet(); // Hello, my name is Alice.

alice 对象的结构如下:

{
    name: 'Alice',
    age: 30,
    [[Prototype]]: {
        // 从 Person.prototype 继承的方法和属性
    }
}
继承
class Student extends Person {
    constructor(name, age, grade) {
        super(name, age);//类似java里面的继承父类(超类)

        this.grade = grade;
    }

    study() {
        console.log(`${this.name} is studying in grade ${this.grade}.`);
    }
}

const bob = new Student('Bob', 15, 10);
bob.greet(); // Hello, my name is Bob.
bob.study(); // Bob is studying in grade 10.

Promise

Promise 是 ES6 引入的一种处理异步操作的方式,它提供了一种更优雅的方式来处理回调地狱。

创建 Promise

Promise 对象通过 new Promise 构造函数创建,构造函数接受一个函数作为参数,这个函数通常被称为 executor 函数。Executor 函数有两个参数:resolvereject,参数分别表示已完成,已失败的状态

const promise = new Promise((resolve, reject) => {
    // 异步操作
    setTimeout(() => {//定时器
        resolve('Success!');
    }, 1000);
});
promise.then(
    (result) => {
        console.log(result); // 输出: Operation successful
    },
    (error) => {
        console.error(error); // 如果失败,输出: Operation failed
    }
);
链式调用

支持多个异步操作串联

fetch('https://api.example.com/data')
    .then(response => response.json())
    .then(data => {
        console.log(data);
    })
    .catch(error => {
        console.error(error);
    });

模块化

ES6 引入了模块系统,使得代码组织更加清晰和模块化。

导出模块
// math.js
export function add(a, b) {
    return a + b;
}

export function subtract(a, b) {
    return a - b;
}
导入模块
// main.js
import { add, subtract } from './math.js';

console.log(add(1, 2)); // 3
console.log(subtract(3, 1)); // 2

总结

ES6 是 JavaScript 发展的一个重要里程碑,它引入了许多新的特性和语法糖,使得开发者能够编写更加简洁、高效和易于维护的代码。本文介绍了 ES6 的一些核心特性**,包括块级作用域、箭头函数、解构赋值、默认参数、模板字符串、类和继承、Promise 和模块化**。