📅  最后修改于: 2023-12-03 15:14:53.670000             🧑  作者: Mango
JavaScript 是一种具有动态特性和面向对象特性的脚本语言。它会在 Web 应用程序中体现出许多特性和方便,同时也逐渐成为了服务器端编程的语言。ES5 和 ES6(ES2015)是 JavaScript 的两个重要版本。下面将介绍它们之间的区别。
在 ES5 中,变量只能通过 var 关键字进行声明,var 声明的变量作用域为整个函数,不管它在哪被声明,都会被提升至函数顶部。
function test() {
console.log(a); // 输出 undefined
var a = 1;
console.log(a); // 输出 1
}
test();
而在 ES6 中,除了 var 外,还新增了 let 和 const 关键字,它们具有块级作用域(即只在 {} 内有效)。
function test() {
console.log(a); // 报错 ReferenceError: Cannot access 'a' before initialization
let a = 1;
console.log(a); // 输出 1
}
test();
let 和 const 的作用域规则与 var 不同,不会被提升,必须在声明后才能使用。同时,const 声明的为常量,一旦赋值便不能被修改。
在 ES6 中,新增了一种方便的语法叫做“变量解构赋值”,可以很方便地将数组或对象的属性取出并赋值给变量。
// 数组解构赋值
const [a, b, c] = [1, 2, 3];
console.log(a); // 输出 1
console.log(b); // 输出 2
console.log(c); // 输出 3
// 对象解构赋值
const obj = { x: 1, y: 2 };
const { x, y } = obj;
console.log(x); // 输出 1
console.log(y); // 输出 2
在 ES6 中,新增了一种箭头函数(Arrow Functions)的语法,可以极大地简化函数定义的写法。
// ES5 中的函数定义
var fn = function(a, b) {
return a + b;
};
// ES6 中的箭头函数
const fn = (a, b) => a + b;
除了语法简化外,箭头函数还具有以下特点:
在 ES6 中,新增了 rest 参数,可以将它用于获取函数传递的不定参数列表,它是一个数组。
function fn(a, b, ...c) {
console.log(a); // 输出 1
console.log(b); // 输出 2
console.log(c); // 输出 [3, 4, 5]
}
fn(1, 2, 3, 4, 5);
在 ES6 中,函数的参数列表支持默认值,当调用时省略了该参数时,就会使用默认值,否则使用传入的值。
// ES5 中实现默认值
function fn(a, b) {
a = typeof a !== 'undefined' ? a : 1;
b = typeof b !== 'undefined' ? b : 2;
}
// ES6 中实现默认值
function fn(a = 1, b = 2) {
console.log(a); // 输出 1
console.log(b); // 输出 2
}
fn(); // 不传递参数
在 ES6 中,新增了类的概念,可以直接使用 class 关键字定义类,它具有以下特点:
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
constructor(name) {
super(name);
}
speak() {
console.log(`${this.name} barks.`);
}
}
const d = new Dog('Mitzie');
d.speak(); // 输出 "Mitzie barks."
ES6 将模块作为了一级标准特性,引入了 import 和 export 关键字,可以很方便地将模块内部的代码导出给其他模块使用(也可以导入其他模块的代码)。
// 导出一个函数
export function test() {
console.log('Hello, world!');
}
// 导出一个变量
export const PI = 3.14;
// 导入某个模块
import { test, PI } from './test.js';
ES6 引入了很多新的语法和概念,包括 let、const、箭头函数、rest 参数、默认参数、类、模块等等,这些特性在开发中简化了代码的实现并提高了开发效率。当然,ES5 也是一个重要的版本,许多应用还需要兼容 ES5,因此对这两个版本的了解和掌握对于开发者们来说都是必要的。