变量的三种声明方式
var a = 1;
let a = 1; //变量声明
const a = 1; //常量声明
a = 1;
区别:
var是过时的,不好用的方式let是新的,更合理的方式const是声明时必须赋值,且不能再改的方式- 最后的这种方式是错误的,不要这样声明
变量声明在指定值的同时,也指定了类型,但是值和类型都可以随意变化。
let a = 1;
a = 'hello';
var 声明
- 没有块级作用域
- 可以重复声明
- 有变量提升
- 全局声明的 var 变量,会变成 window 属性
let 声明
1. 遵循块级作用域,即使用范围不能超出 {}
{
let a = 10;
var b = 1; // var 声明的变量没有块级作用域
}
a; // ReferenceError: a is not defined.
b; // 1
2. 在同一个函数或块作用域中不能重复声明
function fn() {
let a = 1
let a = 2 //SyntaxError thrown.
}
3. 可以赋值,也可以不赋值
4. 必须先声明再使用,否则报错
{
console.log(b)
let b = 1
} //ReferenceError
5. 全局声明的 let 变量,不会变成 window 的属性
let abc = 'abc';
window.abc; //undefined
var abc = 'abc'; // var 声明的全局变量会变成 window 的属性
window.abc; //"abc"
6. for 循环配合 let 有奇效
for (var i = 0; i < 5; i++) {
setTimeout(() => { console.log(i) }, 0)
} //输出5个5
上面代码中,结果会输出5个5,由于 setTimeout 是异步执行的,所以 for 循环执行结束后(此时 i = 5)再执行 setTimeout,且执行五次。
把 var 改为 let 能让上面的例子打印出0,1,2,3,4。
for (let i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i)
}, 0)
}
上面代码中,变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量。
const 声明
- 规则和
let几乎一致 - 只有一条不一样:声明时就要赋值,赋值后不能改
const i = 100;
i = 101; //TypeError: Assignment to constant variable.
name 和 'name' 的区别
name 是变量,值可变,可能是'name',也可能是'hello'。
let name = 1
name = 2 //2
name = 'hello' //"hello"
'name' 是字符串常量,常量就是不变量,'name' 只能是 'name', 不能是其他值。
相关学习链接
推荐阅读:《我用了两个月的时间才理解 let》