let()
let声明的变量只在所处于的块级有效
if (true) {
let a = 10;
}
console.log(a) // a is not defined
let不可以变量提升
console.log(a); // a is not defined
let a = 20;
暂时性死区
var tmp = 123;
if (true) {
console.log(tmp);//tmp is not defined
let tmp=20;
}
上面代码中正常情况来说
tmp
在if
循环中找不到tmp
会向上找,但是let会让if
这个循环产生暂时性死区,不会向上找
这里有一个面试题关于let的.
let面试题
const()
作用:声明常量,常量就是值(内存地址)不能变化的量。
和let一样有块级作用域
1,在声明变量的时候必须赋值
const a;// Missing initializer in const declaration
2,基本数据类型赋值不可以修改
const pi=3.14;
pi=2;//const在基础数据类型中不可以修改值
输出: Assignment to constant variable.
3,复杂数据类型修改值的方法
const ary = [100, 200];
ary[0] = 'a';
ary[1] = 'b';
console.log(ary); // ['a', 'b'];
ary = ['a', 'b']; // Assignment to constant variable.
ary[0] =
'a';
和ary[1] = 'b
’没有改变内存地址
ary = ['a', 'b']
改变了内存地址,
这是因为数组在栈里面存放了内存地址,在堆里面为值开辟了空间,我们在调用的时候是用栈里面的内存地址去堆里面找到这个值,这种方法是引用访问,而且堆里面这个值是可以改变的,但是堆里面的值改变了,这个值的内存地址是没有改变的.
ary[0]='a'
中ary[0]指向的是堆里面的值,将'a'
赋值给ary[0],只是改变了值,没有改变内存地址,所以可以修改.
而ary = ['a', 'b']
是重新在堆里面开辟了空间,有了空间,在栈里面内存地址也会改变.
let(),const(),var()的区别
- 使用 var 声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象。
- 使用 let 声明的变量,其作用域为该语句所在的代码块内,不存在变量提升。
- 使用 const 声明的是常量,在后面出现的代码中不能再修改该常量的值。