文章目录
一、let命令
1. 基本用法
es6新增了let命令,是用来声明变量。用法与var类似,但是所声明的变量只在let命令所在的代码块内有效。
上图中,在代码块{}之中,分别用let和var声明了两个变量。然后再代码块之外调用这两个变量,let声明的变量报错,var声明的变量返回正确。表明,let声明的变量只在它所在的代码块有效。
for(let i = 0;i<10;i++){};
console.log(i); // ReferenceError: i is not defined
//上面代码中,let声明的i只在for循环体内有效,在循环体外使用会报错。
下面代码中分别用 let 和 var 去声明计数器 i,最后的输出结果是不同的。
var arr = [];
for (let i = 0; i < 10; i++) {
arr[i] = function () {
console.log(i);
};
}
arr[4](); // 4
var arr = [];
for (var i = 0; i < 10; i++) {
arr[i] = function () {
console.log(i);
};
}
arr[4](); // 10
变量 i 是用 var 命令声明的,在全局范围内有效,每次循环,全局的变量 i 都会发生变化。也就是说,数组arr中的每个成员里的 i 都指向了同一个 i(即为最后一轮的i
的值),也就是10。
变量i
是let
声明的,当前的i
只在本轮循环有效,所以每一次循环的i
其实都是一个新的变量,初始化本轮的变量i
时,就在上一轮循环的基础上进行计算。
另外,for
循环设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。
上面代码正确运行,输出了 5次abc
。这表明函数内部的变量i
与循环变量i
不在同一个作用域,有各自单独的作用域(同一个作用域不可使用 let
重复声明同一个变量)。
即let声明的变量存在块级作用域,只在当前作用域内有效。
2. 不允许重复声明
let
不允许在相同作用域内,重复声明同一个变量。var可以在相同作用域内重复声明。
{
let a = 10;
let a = 20;
}
//报错 Uncaught SyntaxError: Identifier 'a' has already been declared
{
var b = 10;
var b = 20;
} //不报错
3.不存在变量提升
变量提升是指变量可以在声明之前使用,值为undefined
。var声明的变量是存在变量提升的,在声明之前可以使用,不会报错。
{
console.log(str); //输出underfined
var str = 'var声明';
}
{
console.log(bar); // 报错ReferenceError
let bar = 'let声明';
}
上面代码中,变量str
用var
命令声明,会发生变量提升,即脚本开始运行时,变量str
已经存在了,但是没有值,所以会输出undefined
。变量bar
用let
命令声明,不会发生变量提升。这表示在声明它之前,变量bar
是不存在的,这时如果用到它,就会抛出一个错误。
即let声明的变量不存在变量提升,声明之后才可以使用,var存在变量 提升
二、const命令
1.基本用法
const
声明一个只读的常量。一旦声明,常量的值就不能改变。
const str = '123';
str = '456';
//TypeError: Assignment to constant variable.
const name;
//SyntaxError: Missing initializer in const declaration
如上面代码所示,改变常量的值会报错。 const
一旦声明变量,就必须立即初始化,不能留到以后赋值。只声明不赋值,就会报错。
即const用来声明一个常量,必须立即赋值。不可以改变它的值
如果const声明的是复合类型的数据(主要是对象和数组),变量指向的是所对应的内存地址 ,只能保证这个指针所对应得地址不变,至于它的内部元素是可变的。
const obj = {name:'小明'}
obj.age = 20;
obj = {name:'小小'}
// Uncaught TypeError: Assignment to constant variable.
obj;//{name:'小明',age:20}
即const声明复合型常量,指向的地址不改变,其内部属性是可以更改的。
2.块级作用域
const
的作用域与let
命令相同:只在声明所在的块级作用域内有效。
{
const value= '123';
}
value; //VM2767:1 Uncaught ReferenceError: value is not defined
即const声明的变量存在块级作用域,只在当前作用域内有效
3.不允许重复声明
const
与let
命令相同:同一作用域内不可以重复声明。
var message = 'hello';
const message = '1';
//SyntaxError: Identifier 'message' has already been declared
即const不允许在相同作用域内,重复声明同一个变量
4.不存在变量提升
const
与let
命令相同:变量不可以在声明之前使用,会报错。
{
console.log(name);
const name="孝丽";
//Uncaught ReferenceError: Cannot access 'name' before initialization
}
即const声明的变量不存在变量提升,声明之后才可以使用。
总结
let、const 和var有什么区别?
- let和var都是用来声明变量的。const是用来声明常量的。
- const声明时必须赋值,后面不可以改变它的值。声明的是复合型变量可以改变其内部子元素的值。
- let和const声明的变量存在块级作用域,只在当前作用域内有效。var不存在块级作用域。
let和const
不允许在相同作用域内,重复声明同一个变量。var可以在相同作用域内重复声明。- let和const声明的变量不存在变量提升,声明之后才可以使用,否则会报错。var存在变量 提升,声明之前可以使用值为undefined。