1.变量和常量关键词
1.1 let 关键词
- 有块级作用域 (防止变量污染):一对大括号就是一个程序块,在大括号之中声明的变量,出了大括号就不能用了
for (let i = 1; i <= 5; i++) {
console.log(i); // 1 2 3 4 5
}
console.log(i); // 报错 i is not defined
- 没有变量提升 (保证程序的逻辑通畅)
console.log(a); //undefined
var a = 10;
console.log(b); //Cannot access 'b' before initialization
let b = 10;
- 不能重复声明变量 (保证变量唯一性)
let a = 20;
let a = "nihao";
console.log(a);//报错: Identifier 'a' has already been declared
- 暂时性死区(块级作用域内部声明的变量如果和外部声明的变量重名,不会冲突)
//虽然在一个页面中声明了两个同名的变量,但是处于不同的作用域内,所以不会产生报错
let a = 10;
{
let a = 'abc';
console.log(a); //正常输出abc
}
console.log(a); //正常输出10
1.2 let 块级作用域
<button>btn1</button>
<button>btn2</button>
<button>btn3</button>
<script>
var btns = document.querySelectorAll("button");
//使用var声明i, 则i是全局变量; 循环完成后 i 的值为 3
for (var i = 0; i < btns.length; i++) {
btns[i].onclick = function() {
console.log(i); //此时点击任意按钮,输出的内容都是3
};
}
//使用let声明的 i 是有块级作用域的,即每进行一次循环,都在内存中开辟一块独立的空间来保存当前 i 的值
for (let i = 0; i < btns.length; i++) {
btns[i].onclick = function() {
console.log(i);
};
}
</script>
1.3 const 常量
一旦赋值就不能改变的量就是常量, 常量也有块级作用域
特点:
- 也有块级作用域
//用块级作用域
{
const PI = 3.14;
console.log(PI);
}
console.log(PI); //报错: PI is not defined
- 必须要初始化值
//必须初始化
const PI; //报错: Missing initializer in const declaration
- 复杂数据类型可以更改内部值
const obj = {
name: 'zs',
age : 20,
say : function () {
console.log('ok');
}
}
// obj = {}; //报错
obj.name = 'ls';
obj.say = function () {
console.log('okok');
}
var、let 和 const的区别
- var和let都能声明变量,但是let更严谨一些,以后都推荐使用let来声明变量。
- let的特殊点: 不能提升变量(保证程序的逻辑通畅)、 有块级作用域(避免变量交叉污染)、不能重复声明保证变量的唯一性,块级作用域会暂时性死区
- const用来声明常量,常量是不能改变的量,常量也有块级作用域,初始化常量时必须赋值
- 能用const就用const (因为cosnt速度更快)