通常面试的时候 都会让说说 var let const 这3者的区别
今天我们来说说它的区别
以前我基本都是说都是用来声明对象的
只是const有些特殊 它声明的对象 值不能“更改”
当然 这里的"更改"指的是 string 和 number 类型
array 和 obj 除外
{
let a = "let definde a";
var b = "var definde b";
const c = "const dedinde c";
}
console.log(a); // a is not dedine
console.log(b); // var definde b
console.log(c); // c is not dedine
先看下上面的值输出
只有 var 定义的变量 能在外部获取到,let 和 const 出了{}作用域外, 就没办法获取到
let 和 const 只有在声明的作用域内才能读取到
很多时候,我们都会通过
if(typeof a === 'undefined'){
再进行逻辑处理
}
但是 以上这种情况只能是在用 var 声明变量的情况下不会出问题 因为 var 会出现变量提升
下面通过 var let const 来声明一个变量 然后在声明的上面打印它
console.log(a)
var a = 1;
console.log(a)
let a = 1;
console.log(a)
const a = 1;
分别得到的是
undefined
报错 :Cannot access 'a' before initialization
报错 :Cannot access 'a' before initialization
而在let 和 const 这两种情况下
在没有声明变量之前,是无法获取变量
typeof 判断 undefined 就失去了意义
所以 很多时候 要改变写写法规范了
try{
console.log(a);
}catch(e){
console.log("a 不存在",e)
}
const a = 1;
let a = 1;
接下来就是都两者都存在的情况下
var b = 2;
if(b){
b = 3;
console.log(b); //报错 :Cannot access 'a' before initialization
let b = 1;
console.log(b); //1
b = 3;
console.log(b);//3
}
只要在块级作用域内 声明的变量 那它所在的作用域内 不受外部声明相同变量的影响
它所在的作用域 在它声明之前都是 无法访问的
这种现象属于暂时性死区
这里 有个好玩的东西
在for 循环里, 我通过let 声明了变量 index
在循环里我 再通过 let 再次声明index
通常情况下
如果 在同一作用域内
var 声明变量
var a=1;
var a=2;
consloe.log(a); //2
但是用 let 同样的声明
consloe.log(a);//Identifier 'a' has already been declared
它会报个错误,提示你已经声明过了
但接下来 for循环却 打印了 3次 没出想上面的报错
for (let index = 0; index < 3; index++) {
let index = "index";
console.log(index);// index index index
}
这里 我们可以把 for 看成 父子 作用域 for(这里 声明的属于 父){ 这里声明的属于子 }
他们都作用于两个不同的作用域 ,所以不会报错