let、const和var的区别

2019-07-09  本文已影响0人  meow_possion

es6新增的变量声明方式let、const和之前的var都可以用来声明变量。那么这三者的区别是什么呢?

let

  1. let的作用域是块级作用域,es6之前的作用域只有全局作用域、函数作用域,没有块级作用域
  2. let声明的变量不会有声明提升,所以在let 声明的变量之前访问改变量会造成报错,也就是暂时性死区
console.log(b); //ReferenceError: b is not defined
let b = '1';
  1. 不能重复定义
let a = 1;
let a = 2;//Identifier 'a' has already been declared
  1. 存在暂时性死区
var a = 1;
if(1){
  console.log(a);//报错
  let a = 2;
}

①在一个块级作用域中,变量唯一存在,一旦在一个块级作用域中用let声明了一个变量,那么这个变量就属于这个块级作用域所有,不受外部变量的影响
②无论在块中的任何地方声明变量,在块中使用这个名字的变量都是这个变量,无论外部是否有其他同名变量。
③暂时性死区的本质就是,只要进入到当前作用域,那么在变量声明之前,该变量都是不可用的,只有声明变量之后才能使用
④暂时性死区的意义:规范代码,让我们把声明变量的工作放在作用域的前面,这样代码一目了然

const

const用来声明一个常量,且声明的常量是不允许修改的,只读属性。所以在声明的时候必须赋值,否则会报错。
const和let一样存在暂时性死区,没有变量提升,也不允许重复声明。
const定义之后再重复赋值也会报错。

const a = 1;
a = 2;//报错

假如const定义的变量是一个对象,那么可以给这个对象的变量赋值、增加属性、删除属性等操作都是可以的。
因为const是限制了定义的变量不再重新分配地址,也就是地址不变,但是指向的地址上存储的内容是可变的。
const定义了一个无法重新分配内存的变量。const仅仅阻止重新分配,而不是不可变的。
这一点跟Obejct.freeze()有很大的区别。
Object.freeze(obj)返回一个不可变的对象,这意味着不能删除、修改、添加对象的属性
但是Object.freeze很肤浅,假如参数对象的属性也是对象,那么Object.freeze对这个对象的对象属性就不起作用了,需要对obj进行递归遍历并用Object.freeze处理。

var

①var的作用域是函数作用域,在函数内利用var声明一个变量,则在函数内这个变量有效。
②变量声明提升

function(){
  console.log(a);//undefined
  var a = 1;
  console.log(a);//1
}
console.log(a);//报错
上一篇下一篇

猜你喜欢

热点阅读