var、let和const的区别

100 阅读2分钟

这三个关键字的作用是什么?

用来声明在哪个作用域变量

所以,什么是作用域?

  • 作用域就是一个独立的地盘,使变量不会暴露出去。
  • JS 有三个作用域,分别是 全局作用域、函数作用域、块级作用域
  • ES6 前只有前面两个作用域,块级作用域是 ES6 出的。
  • 它的出现是解决在使用 if 或 for 循环里的花括号里声明的变量会污染变量或泄露成员变量这些问题。

var

  1. 它是 ES6 前声明变量的关键字,具有全局作用域和函数作用域,意味着能跨块访问,不能跨函数访问
  2. 可以不用初始化值
var a;
console.log(a);  //undefined
  1. 存在变量提升
console.log(a);  //undefined
var a = 10;
  1. 同一作用域中允许重复声明
var a = 10;
var a = 20;
//或者
var a = 10; var a = 20;
  1. 没有暂时性死区(可以在没有先声明的情况下,提前使用该变量)
a = 10;
var a = 20;
  1. 全局作用域用 var 声明的变量会挂载到全局对象下
//全局对象(浏览器打开就是window,node打开就是global)
var a = 10;
console.log(a);  //10
console.log(window.a);  //10

let

  1. 有块级作用域,意味着不能跨块访问
  2. 可以不用初始化值
let a;
console.log(a);  //undefined
  1. 不存在变量提升
console.log(a);  //ReferenceError: Cannot access 'a' before initialization
let a = 10;
  1. 同一作用域中不允许重复声明,但可以重新赋值
var a = 10;
let a = 20; //SyntaxError: Identifier 'a' has already been declared
//或者
let a = 10; let a = 20; //SyntaxError: Identifier 'a' has already been declared
  1. 有暂时性死区(必须要先声明前,才可以使用该变量)
{
  console.log(a);  //ReferenceError: Cannot access 'a' before initialization
  let a = 20;
}
  1. let 声明的变量不会挂载到全局对象下,会挂载到 Script

var 和 let 的共同点

就一个,可以不用初始化值,其它的就是相反的,毕竟是后来才出的,是为了解决一些以前所解决不了的问题。

const

与 let 几乎一样,就两个不同点

  1. 必须初始化值
const a; // SyntaxError: Missing initializer in const declaration 
//下面是正确的
const a = 10;
  1. 赋值后对于普通类型不能更改变量,但是对于引用类型可以为其添加属性
{
  // 普通类型
  const a = 10; 
	a = 20; // TypeError: Assignment to constant variable
 // 引用类型
  const b = {}
  b.a = 10;
}