变量声明包括let var const
在这之前,需要提一点:
如果一个变量没有声明直接被使用,那该变量自动会变为全局变量。
i = 10; // i现在是全局变量
该缺陷是因为 在js设计之初,为了方便初学者而不要求强制申明变量导致的,
后面推出的strict模式修补了这一问题
在js代码第一行写上: 'use strict'
它的作用是在声明了之后,会严格检测该文件内的变量是否通过var申明,若无则报错
它们的区别如下:
对其中的概念解释如下:
1、作用域
作用域既是该值能够生效,能够被访问的区域范围。
var 为全局作用域,let和const是局部作用域(仅在函数体内可用)
if(true) {
var a = 1;
let b = 2;
const c = 3;
}
console.log(a); // a打印值为1
console.log(b); // b打印值为 undefined
console.log(c); // c打印值为 undefined
2、变量声明
var 和 let可以仅声明不赋值,但是const必须赋值,否则会报错
var a = 1 //正确
let b = 1 //正确
const c = 1 //正确
var d //正确 d打印为undefined
let e //正确 e打印为undefined
const f //错误
3、是否可修改
var 和let声明的变量可随意修改,const声明的变量 若为基础类型(undefined null string number boolean)则不可修改,若为引用数据类型(object array), 可以修改值, 不可修改引用对象。
var a = 1;
a =2;
console.log(a) // 2
let b = 1;
b = 2;
console.log(b) // 2
//c为基本数据类型不可修改
const c = 1;
c = 2; //报错
//d为引用数据类型
const d = [1,2,3];
d.push(4);//对引用数据类型进行值的修改可进行
console.log(d);// [1,2,3,4]
d[0] = 2; // [2,2,3,4]
d = [1,2,3,4,5] //对引用数据类型进行地址修改,报错
简单来讲 就是const定义的变量 不可以直接修改该变量,若为非基本数据类型,可以修改该变量的值
4、是否可重复声明
var 可重复声明 let和const不可重复声明
var a = 1;
var a = 2; //不报错,可重复声明
console.log(a); // 2
//let 和 const 情况相同
let a = 3;//报错,上面已经声明过a(var 声明的也不可以)
let b = 1;
let b =2; //报错,上面已经声明过b
5、变量 提升
var声明的变量会进行变量提升,但是赋值不提升;let和const声明的变量不会提升。
console.log(v1);
var v1 = 100;
function foo() {
console.log(v1);
var v1 = 200;
console.log(v1);
}
foo();
console.log(v1);
输出结果为 undefined undefined 200 100
为什么呢?
因为这里还有函数提升,
函数声明的优先级是要高于变量声明的 即 function foo() 的声明,在代码执行时会被提到最顶端
单纯的变量提升
function test () {
console.log(a); //undefined
var a = 123;
};
test();
// 它的实际执行顺序如下
function test () {
var a;
console.log(a);
a = 123;
}
test();
// 即对a的声明被提到了最顶部去执行