谈谈ES6的let和const

2019-11-20  本文已影响0人  明人不放按屁

在js中,变量只有两种,全局变量和局部变量,但是之前的版本并没有‘块级作用域‘这个说法,‘块级作用域’即所在的代码块 {} 内有效。例如:

{ 
    var x = 2; 
}
console.log(x) // 输出2

var x = 10;
{ 
    var x = 2;
}
console.log(x)  // 输出  2

但是ES6中增加了let关键字,使用let可以实现‘块级作用域’,例如:

{ 
    let x = 2;
}
console.log(x)  //报错, x is not defined

var x = 10;
{ 
    let x = 2;
}
console.log(x)// 输出 10

注意:在相同的作用域或块级作用域中,不能使用 let 关键字来重置 var 关键字声明的变量,也不能使用 const 关键字来重置 var 和 let关键字声明的变量
例如:

var x = 2;       // 合法
let x = 3;       // 不合法

{
    var x = 4;   // 合法
    let x = 5   // 不合法
}

//同样的
let x = 10;
{ 
    var x = 2;
}
console.log(x)// 输出 报错



var x = 2;         // 合法
const x = 2;       // 不合法
{
    let x = 2;     // 合法
    const x = 2;   // 不合法
}

另外,不仅仅在说明变量的时候var和let有区别,在循环作用域中,两者也有不同。在for循环中,var依然没有‘块级作用域’这个

//使用var
var i = 5;
for (var i = 0; i < 10; i++) {
    console.log(i);//0.1.2.3...9
}
console.log(i);//10

//使用let
let i = 5;
for (let i = 0; i < 10; i++) {
    console.log(i);//0.1.2.3...9
}
console.log(i);//5

在第一个实例中,使用了 var 关键字,它声明的变量是全局的,包括循环体内与循环体外。
在第二个实例中,使用 let 关键字, 它声明的变量作用域只在循环体内,循环体外的变量不受影响。

ES6除了增加变量关键字let以外,还增加了常量关键字const,用于声明一个或多个常量,声明时必须进行初始化,且初始化后值不可再修改:

const PI = 3.141592653589793;
PI = 3.14;      // 报错


var x = 10;
{ 
    const x = 2;
   console.log(x) //  2
}
console.log(x)//  10

但是const 定义的变量并非常量,并非不可变,使用 const 定义的对象或者数组,其实是可变的。例如:

// 创建常量对象
const car = {type:"Fiat", model:"500", color:"white"};

// 修改属性:
car.color = "red";
console.log(car.color)//red

但是我们不能对常量数组重新赋值:

const cars = ["Saab", "Volvo", "BMW"];
cars = ["Toyota", "Volvo", "Audi"];    // 错误
上一篇下一篇

猜你喜欢

热点阅读