ES6(ECMAScript 2015)
在定义常量,变量,和对象以及函数与上一版本的ES5(ECMAScript 2009)
有何改革
简介ES5/ES6
—— 首先我们来了解一下 ES5
与 ES6
是何物:es5与es6是JavaScript的两个不同的版本,es5
(发布于2009年)是对JavaScript的改进,这个版本增加了一些新的方法(如:数组方法,JSON支持)和特性(如严格模式,getter/setter),使代码的安全性更高。es6
(发布于2015年)这个版本有着一个很大的提升,加了许多新特性,包括:1.let 和 const的变量声明。2.箭头函数。3.类的模块化。4.解构赋值,模板字符串。5.Promises(用于处理异步操作)。这些新特性使得JavaScript更加现代化,简洁和易于维护。
常量定义
- 在
ES5
中没有专门的语言用来定义常量,通常是通过约定(变量名全部大写)来表示某个变量是当作常量来使用,但是这种方式没有真正的限制常量的定义。 - 在
ES6
中引入了const
关键字来限制常量的定义,常量一旦被赋值,就不可再被重新赋值。 如果是基本数据类型(如:数字类型,字符串类型,布尔类型)这些是不可以再次赋值的, 但是如果是复杂数据类型(如:数组类型,对象类型),虽然不能够重新赋值给该常量,但是可以去修改其内部的属性值。 以下是举例说明:
const Π = 3.1415926;
Π = 3.15; //此时报错,显示 Assignment to constant variabl.
const object1 ={
hobbies: "唱歌";
}
object1.hobbies = "跳舞"; //可以修改对象内部属性的值.
变量定义
- 在
ES5
中:使用var
关键字来定义变量。但是在调用这个变量前,首先要确认这个变量定义在当前作用域的顶部,要不然会报错。 以下是举例说明:
console.log(PI)
const PI = 3.14159; //报错,Cannot access 'PI' before initialization
- 在
ES6
中:使用Let
关键字来定义块级作用域变量,且Let
不存在变量提升,它定义的变量只能作用于当前块级作用域,(如if语句,for语句的花括号包裹区域)内访问,这使得代码逻辑更加清晰明朗,减少变量名之间的发生冲突的可能。 以下是举例说明:
{
let a = 1;
console.log(a); //输出2
}
console.log(a); //报错 a is not defined.
对象定义
- 在
ES5
中通常通过对象字面量或者构造函数的方式来定义一个对象。 例如:
// 对象字面量方式
var object = {
name = "obj";
age = 18;
};
// 构造函数方式
var object1 = new Object();
object1.name = "obj";
object1.age = 18;
- 而在
ES6
中 对象字面量增强,在定义对象时更加简洁,有属性值缩写和方法定义的缩写。 例如:
// 属性值缩写
let x = 1, y = 2;
let point = {x, y};
//等价于{x:x, y: y};
// 方法定义缩写
const object = {
name = "function";
sayHello(){
console.log("Hello "+ name);
}
// 这里定义的方法等价于 sayHello: function(){}
}
- 另外,ES6还新增了 class 语法糖,让面向对象编程中的对象定义更接近传统的类定义方式,在底层其实也是基于原型链实现的,但写法上更易理解。例如:
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(this.name + " makes a sound.");
}
}
let cat = new Animal("Cat");
dog.speak();
变量作用域
- 作用域分为->[全局作用域, 局部作用域]->局部作用域[函数作用域(function(){.....},var支持), 块级作用域(var 不支持,const let 支持)]
总结
ES5
和ES6
是JavaScript的两个重要版本,它们在语法和特性上有着显著的差异,极大地提升了代码的可读性和维护性。ES6(ECMAScript 2015)带来了许多新的功能,使得JavaScript变得更加现代化、灵活和强大,下面是几个关键变化:
-
常量定义:
ES5
没有专门的常量定义方式,通常通过命名约定来模拟常量。ES6
引入了const
,使得常量的定义更加严格,基本数据类型不能重新赋值,复杂数据类型的内部结构仍然可以被修改。
-
变量定义:
- 在
ES5
中,变量是通过var
定义的,但它存在变量提升和作用域不清晰的问题。 ES6
引入了let
,提供了块级作用域,并避免了变量提升,使得代码更加简洁、清晰。
- 在
-
对象定义:
- 在
ES5
中,对象定义通常通过字面量或构造函数来实现。 ES6
增强了对象字面量的语法,支持属性值和方法的简写形式,写法更加简洁,易于维护。
- 在
-
类与面向对象:
- 虽然
ES5
支持通过构造函数和原型链来实现面向对象编程,但语法繁琐且难以理解。 ES6
引入了class
关键字,简化了面向对象编程的写法,使其更加接近传统的类定义形式,尽管底层依然是基于原型链。
- 虽然
-
作用域:
ES5
中的var
仅支持函数作用域,容易造成变量冲突。ES6
的let
和const
引入了块级作用域,减少了作用域问题,提升了代码的可读性和健壮性。
这些改进使得ES6
不仅在语法上更符合现代编程的需求,而且通过新特性提升了开发效率和代码的可维护性。总的来说,ES6
的推出标志着JavaScript语言的一次重大革新,极大地推动了Web开发的进步。