10分钟学完let、const和var的区别

595 阅读2分钟

前言

JavaScript中使用let、const和var三个关键字来声明变量,其中let和const是在ES6及之后的版本才开始使用。那么ES6中新增的这两个关键字的作用与var有什么不同呢?让我们来看下。

var和let

var和let有相似的用法,但是它们有着重要的区别

1. 变量提升和暂时性死区

使用var时,会将声明的变量自动提升到函数作用域的顶部

function test() {
    console.log(temp);
    var temp = 'temp';
}
test();//undefined
//上面的代码等价于
function test() {
    var temp;
    console.log(temp);
    temp = 'temp';
}
test();//undefined

在作用域内,let声明的变量不会被提升,在声明语句之前的范围称为暂时性死区,在暂时性死区中使用未声明的变量会报错

console.log(test);//ReferenceError
let test = 'test';

2. 块作用域

var声明的变量会成为包含它的函数的局部变量,但不具有块作用域

//内层变量可能会把外层变量覆盖掉
var test = 'test';

function f() {
    console.log(test);
    if (true) {
        var test = 'temp';
    }
}

f(); //undefined

//循环中计数的变量会变成全局变量
for (var i = 0; i < test.length; i++) {}
console.log(i); //4

let声明的变量具有块作用域

if (true) {
    let test = 'test';
}
console.log(test);//ReferenceError

3. 全局声明

var声明的全局变量可以通过全局对象访问

var test = 'test';
console.log(window.test);//test

let声明的变量就不可以

let test = 'test';
console.log(window.test);//undefined

4.重复声明

在同一作用域内使用var多次声明同名变量是合法的

var test;
var test;//不会报错

使用let则不行

let test;
let test;//报错

const

const声明一个只读的常量。因为不可以改变值,所以在声明的时候就要赋值。其他方面与let基本相同:声明的常量不会提升,也具有暂时性死区,具有块级作用域,不能重复声明。

复合类型

const声明的复合类型的值,是可以改变属性的。

const person = {};
person.name = 'test';

这是因为const限制的是所指向的内存地址保存的数据不能改动,原始类型的值直接保存在内存地址上,所以不能改变。但是对于复合类型来说,内存地址上保存的只是指向实际数据的指针,const只能限制它的指向,但是不能限制所指向数据修改属性。