var
在ES5阶段中,使用var具有以下特点:
(1)没有块的概念,可以跨块访问,不能夸函数访问;
(2)存在变量提升,赋值不提升 (undefined)
 let
在ES6阶段新增,新增出块的概念,新增块级作用域,具有以下特点:
(1)let声明的变量只在它所在的代码块有效;
(2)let不会出现变量提升,需先声明后使用,否则会报错;
(3)暂存性死区,在代码块内,使用let使用变量之前,该变量都是不可用的;
(4)不允许重复声明
const
用于声明一个只读的常量,具有以下特点:
(1)一旦声明就必须立即初始化;
(2)一旦声明,常量值就不能改变(指的是内存地址不能改变,但指向的数据结构不受控制;通过 Object.freeze() 方法,使对象的原始属性不可变, 但仍然可以更改嵌套对象);
(3)块作用域内有效;
(4)不存在变量提升;
(5)存在暂时性死区;
 function
用于定义一个函数,具有以下特点:
(1)函数声明后 需要调用的时候 才能执行;
(2)对支持ES5和ES6的浏览器环境在块作用域内有一定区别,所以应避免在块级作用域内声明函数。
 class
ES6引入了class关键字,用来定义类。该写法相比于对象原型的 方式具有以下特点:
(1)相比于对象原型的方式写法更清晰;
(2)更像面向对象编程的语法(方便)
```JavaScript
    class Calculate {
    constructor(x, y) {
      this.x = x;
      this.y = y;
    }
 
    add() {
      return this.x + this.y;
    }
  }
```
 import
用于加载模块,然后输出变量,具有以下特点:
(1)import 命令接受一对大括号,其里面的变量名必须与被导入的模块对外接口的名称相同;
(2)用 as 关键字可将输入的变量名重命名;
(3)import 命令输入的变量都是只读的;
(4)import 命令具有提升效果,会提升到整个模块的头部,首先执行(因为import命令实在编译阶段执行的,在代码运行之前);
(5)import  是静态执行,不能使用表达式和变量;
(6)import 会执行所加载的模块