ECMAScript6之let与const关键字

时间:2023-11-10 09:11:38

let关键字

let关键字和var关键字一样,都是用来声明变量的,但是和var不同的是,let关键字声明的变量仅在自己的块级作用域范围内发挥作用。

我们来比较下面两段代码

var arr = new Array();
for(var i = 0; i < 10; i++){
arr[i] = function(){
console.log(i);
}
}
arr[0]();//10

上面一个程序中,我们本意是定义一个数组,每个数组的元素是一个函数,可以打印出数组的下标,但是无论调用数组中的哪一个函数,输出的都是10。

var arr = new Array();
for(let i = 0; i < 10; i++){
arr[i] = function(){
console.log(i);
}
}
arr[0]();//0

这个程序和上面一个程序的唯一的不同,就是在声明变量i时我们使用了let关键字而不是var关键字,然而我们得到了想要的结果。这是由于let关键字只能在自己的块级作用域中发挥作用,出了它的块级作用域就不再发挥作用了。(块级作用域,简单的来说就是用{}大括号包含的部分)

除了只能在块级作用域发挥作用外,let关键字还有另外的特点,第二点就是不存在变量提升,而var关键字存在变量提升。

function foo(){
console.log(a);
var a;
}
foo();

上面这个程序中,会打印出undefined,而使用let关键字,则会报错。

function foo(){
console.log(a);
let a;
}
foo();

这是由于var关键字的变量提升,变量提升可以理解为解释器在作用域内先寻找var关键字,将用var声明的变量先存储在内存中,然后再一步一步的执行代码。第一个实例相当于将var a;这一行代码放到console.log()这一行的上面。而let关键字不存在变量提升,因此在程序执行到console.log()时,在内存找不到a的地址,因此会报错。

除此之外,使用let关键字时要注意两个要点:

  1. 同一个块级作用域内不能重复声明同一个变量
var a = 0;
let a = 0;

上面这段程序会报错,同样,用两个let关键字声明同一个变量也是不允许的。

let a = 0;
let a = 0;

2.函数中不能用let关键字重新声明函数的参数。

function foo(a){
let a = 0;
console.log(a);
}

像这样是不允许的。

const关键字

const关键字时用来声明一个常量的,即不能修改的值。

const a = 0;
a = 1;

上面这种做法是错误的,它试图给常量a赋一个新值。

此外,const常量还有其他几个特点:

1.const关键字声明的常量不能修改

2.const关键字和let关键字一样,只能在自己的块级作用域内发挥作用

3.和let一样,不存在变量提升,而且和let不同的是,const关键字声明时必须赋值

4.和let一样,不能重复的声明同一个变量。

有了const关键字,我们还可以创建一个常量对象

const car = { "type" : "van" };
car.price = 30000;
car.type = "tractor";

我们会发现,这段程序不会报错,但是我们确实修改了car这个常量。这是因为,javascript中是使用传址赋值的方式,所谓的传址赋值,就是在赋值过程中,变量存储的实际上是数据的地址,即对数据的引用,而不是原始的数据或者数据的拷贝。我们在声明car变量时,分配了地址,增添或者修改car的属性不会改变它所在的地址,因此不会报错。而如果像下面这样

const car = {type:"van"};
car.type = "tractor";
car.price = 30000;
car = {};

这个程序试图给car赋一个新值{},则会报错。