let命令
1.let命令只在所在的代码快内有效
{
let a = 'hello world'
console.log(a) //hello world
}
console.log(a) //Uncaught ReferenceError: a is not defined
2.let 声明的变量不可重复定义
{
let a = 0;
let a = 'hello world'; //Uncaught SyntaxError: Identifier 'a' has already been declared重复定义变量
}
3.不存在变量提升,必须先声明后使用
console.log(aa); //Uncaught ReferenceError: aa is not defined
let aa = '11';
4.for循环中let和var的区别
for(var i=0; i<10; i++){
}
console.log(i); //10
for(let i=0; i<10; i++){ //此处let声明的i是父作用域
let i = 'abc'; //内部let声明的是子作用域,暂时性死区
console.log(i); //abc
}
console.log(i); // Uncaught ReferenceError: i is not defined
“暂时性死区” 只要块级作用域内存在let命令,它所声明的这个变量就不在受外部的影响,本质是只要进入当前作用域,所要使用的变量就已经存在,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
外层作用域无法读取内层作用域的变量
内层作用域可以定义外层作用域的同名变量
const命令
1.const声明一个只读的常量,一旦声明,就必须立即初始化,常量的值就不能改变。
const a = 'hello world';
console.log(a); // hello world
a = 123; //Uncaught TypeError: Assignment to constant variable.改变常量的值会报错
2.const作用域与let命令相同,只在声明所在的块级作用域内有效。
3.不可重复声明
本质: const实际上保证的并不是变量的值不的改动,而是变量指向的那个内存地址不得改动
- 简单类型的数据(数值,字符,布尔),值就是保存在变量指向的内存地址中。
- 复合类型的数据(数组,对象),变量指向的内存地址保存的知识一个指针。