var,let,const关键字
定义:给一个变量在内存当中开辟一个空间。
1.var关键字
- var声明的范围是函数作用域,let和const声明的范围是块作用域
- var 声明的变量会被提升到函数作用域的顶部,let 和 const 声明的变量不存在提升,且具有暂时性死区特征
- var 允许在同一个作用域中重复声明同一个变量,let 和 const 不允许
- 在全局作用域中使用 var 声明的变量会成为 window 对象的属性,let 和 const 声明的变量则不会
var的预解析
// 提前调用 预解析
console.log( int1 );
// // 提前调用 结果是报错
console.log( int2 );
// var 定义的变量
var int1 = 100 ;
let int2 = 200 ;
作用域
var没有块级作用域,而let声明的范围是块作用域(在{}里就代表一个块级作用域)
if (true) {
var message = "hello";
console.log(message); // hello
}
console.log(message); // hello
if (true) {
let message = "hello";
console.log(message); // hello
}
console.log(message); // 报错: message is not defined
let
- let定义的变量不能预解析,提前调用的结果是报错。
- let定义的变量不能重复,否则执行报错。
- let定义的变量如果在{}中只能在{}中调用。
- 在循环语句中var定义的循环变量和使用let定义的循环变量。执行原理和执行效果不同。
let,count不允许一个块作用域中出现冗余声明
if (true) {
// error: 无法重新声明块范围变量“a”
let a;
let a;
count
- const定义的变量不能预解析,提前调用的结果是报错。
- const定义的变量不能重复,否则执行报错。
- const 定义的变量存储的数据数值不能改变,也就是const定义的变量,不能重复赋值。
count定义的变量不能重复复制,一般用来定义常量
// const 定义的变量 不能重复赋值
// const c = 100 ;
// c = 200 ;
// 结果是报错
const arr = [1,2,3,4,5] ;
// 只是修改引用数据类型中,数据单元存储的数据
// 没有修改 arr变量中 存储的引用数据类型的内存地址
arr[0] = '北京' ;
console.log( arr );