若是文章中有出现纰漏、错误之处,还请看到的小伙伴多多指教,先行谢过前端
在ES5
阶段,JavaScript
使用 var
和 function
来声明变量, ES6
中又添加了let
、const
、import
、 Class
这几种声明变量的方式。那么,他们各自都有什么样的特色呢?git
下面,就让咱们一块儿去探究一下吧es6
如下↓github
变量就是存储信息的容器。
ECMAScript
的变量是松散类型的,所谓松散类型就是能够用来保存任何类型的数据
一直以来,咱们都是使用var关键字来声明变量web
var a = 1; var b; console.log(a) // 1 console.log(b) // undefined console.log(c) // undefined var b = 2; var c = 3; console.log(b) // 2 console.log(c) // 3 function f() { var c = 4; console.log(c) // 4 c = 5; console.log(c) // 5 } f(); console.log(c) // 3 function fun() { c = 6 } fun(); console.log(c) // 6
从上面的结果咱们不难看出,使用var声明的变量具备如下特色:面试
undefined
在ES5中,除了使用var声明变量,咱们也可使用 function
关键字声明变量浏览器
f(); function f() {console.log(1)} var f; console.log(f) // function f
特色:函数
function
声明的是函数对象,也存在声明提高因为 ES5
中使用 var
声明变量存在着一些很让人迷惑的特性(好比变量提高,重复定义等),ES6
中新增 let
命令,用来声明变量。它的用法相似于 var
,可是所声明的变量,只在 let
命令所在的代码块内有效学习
{ var a = 1; let b = 2; } console.log(a) // 1 console.log(b) // Uncaught ReferenceError: b is not defined console.log(c) // Uncaught ReferenceError: c is not defined let c = 3 let a = 4 console.log(a) // Identifier 'a' has already been declared
经过以上的代码,咱们很容易发现使用 let
声明变量的特色:this
因为 let
声明变量的这些特色,因此 for
循环的计数器,就很合适使用 let
命令
for(let i = 0; i < 10; i++) { // } console.log(i) // Uncaught ReferenceError: c is not defined // 若是使用var声明,则在这里输出的就是10
let
实际上为JavaScript
新增了块级做用域
const
也是 ES6
新增的声明变量的方式,const
声明一个只读的常量。一旦声明,常量的值就不能改变
const API; console.log(API) // SyntaxError: Missing initializer in const declaration console.log(MAX); // Uncaught ReferenceError: MAX is not defined const MAX = 1; const MAX = 2; console.log(MAX); // Identifier 'MAX' has already been declared const PI = 3.1415; console.log(PI) // 3.1415 PI = 3; // TypeError: Assignment to constant variable. const f = {} f.name = 'HELLO' // 正常执行 f = {name: 'World'} // 报错
因此,使用 const
声明的变量具备如下特色:
const
一旦声明变量,就必须当即初始化,不能留到之后赋值const
实际上保证的,并非变量的值不得改动,而是变量指向的那个内存地址不得改动
若是真的想将对象冻结,应该使用
Object.freeze
方法
ES6
新增的模块的概念。
模块功能主要由两个命令构成:export
和import
。export
命令用于规定模块的对外接口,import
命令用于输入其余模块提供的功能
因此在必定程度上来讲,import
也具备声明变量的功能。只是在使用 import
的时候,具备一些限制
export { first, last } import { first, last } from './xxx' first = {} // Syntax Error : 'a' is read-only; first.name = 'Hello' // 成功执行,可是不建议这样使用 export default function(){} // a.js import xxx from 'a.js' import { New as $ } from './xxx'
特色:
import
命令接受一对大括号,大括号里面的变量名,必须与被导入模块对外接口的名称相同import
命令输入的变量都是只读的,由于它的本质是输入接口export default
命令,为模块指定默认输出的时候,import
命令能够为该匿名函数指定任意名字import
命令具备提高效果,会提高到整个模块的头部,首先执行import
命令要使用 as
关键字,将输入的变量重命名本质上,export default
就是输出一个叫作default
的变量或方法,而后系统容许你为它取任意名字
ES6
引入了类的概念,有了 class
这个关键字,做为对象的模板。经过 class
关键字,能够定义类
class Point { constructor(x, y) { this.x = x; this.y = y; } toString() { return '(' + this.x + ', ' + this.y + ')'; } }
ES6
的class
能够看做只是一个语法糖,它的绝大部分功能,ES5
均可以作到,类的实质仍是函数对象,类中的方法和对象其实都是挂在对应的函数对象的prototype
属性下
因此就能够改写成下面这种ES5的方式
function Point(x, y) { this.x = x; this.y = y; } Point.prototype.toString = function() { return '(' + this.x + ', ' + this.y + ')'; }
特色:
constructor
函数,若是没有显式定义,一个空的 constructor
方法会被默认添加。固然全部函数对象都必须有个主体ES5
经过构造函数生成对象彻底同样,也是使用 new
命令class B {} let b = new B();
Class
也可使用表达式的形式定义Class
其实就是一个 function
,可是有一点不一样,Class
不存在变量提高,也就是说 Class
声明定义必须在使用以前在浏览器环境指的是window
对象,在Node
指的是global
对象。ES5
之中,顶层对象的属性与全局变量是等价的
var
命令和function
命令声明的全局变量,依旧是顶层对象的属性;另外一方面规定,let
命令、const
命令、class
命令声明的全局变量,不属于顶层对象的属性。也就是说,从ES6
开始,全局变量将逐步与顶层对象的属性脱钩
var a = 1; window.a // 1 let b = 2; window.b // undefined
在 JavaScript
中还存在着隐式声明。
a = 1; console.log(a) // 1
当没有声明,直接给变量赋值时,会隐式地给变量声明,此时这个变量做为全局变量存在。这个时候就不存在声明提早的问题了
其实只要咱们理解并掌握了这几种声明变量的方式,记住它们的特色,那么在实际使用的过程中就很容易可以找到最合适的方式去定义
天天学习分享,不按期更新
最后,推荐一波前端学习历程,这段时间总结的一些面试相关,分享给有须要的小伙伴,欢迎 star
关注 传送门