从ES5到ES6:JavaScript的演进之旅

256 阅读5分钟

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 支持)]

总结

ES5ES6是JavaScript的两个重要版本,它们在语法和特性上有着显著的差异,极大地提升了代码的可读性和维护性。ES6(ECMAScript 2015)带来了许多新的功能,使得JavaScript变得更加现代化、灵活和强大,下面是几个关键变化:

  1. 常量定义

    • ES5没有专门的常量定义方式,通常通过命名约定来模拟常量。
    • ES6引入了const,使得常量的定义更加严格,基本数据类型不能重新赋值,复杂数据类型的内部结构仍然可以被修改。
  2. 变量定义

    • ES5中,变量是通过var定义的,但它存在变量提升和作用域不清晰的问题。
    • ES6引入了let,提供了块级作用域,并避免了变量提升,使得代码更加简洁、清晰。
  3. 对象定义

    • ES5中,对象定义通常通过字面量或构造函数来实现。
    • ES6增强了对象字面量的语法,支持属性值和方法的简写形式,写法更加简洁,易于维护。
  4. 类与面向对象

    • 虽然ES5支持通过构造函数和原型链来实现面向对象编程,但语法繁琐且难以理解。
    • ES6引入了class关键字,简化了面向对象编程的写法,使其更加接近传统的类定义形式,尽管底层依然是基于原型链。
  5. 作用域

    • ES5中的var仅支持函数作用域,容易造成变量冲突。
    • ES6letconst引入了块级作用域,减少了作用域问题,提升了代码的可读性和健壮性。

这些改进使得ES6不仅在语法上更符合现代编程的需求,而且通过新特性提升了开发效率和代码的可维护性。总的来说,ES6的推出标志着JavaScript语言的一次重大革新,极大地推动了Web开发的进步。