es是标准,js是实现 es6是JavaScript语言的下一代标准
let 声明的变量是区块变量。
*代码块内有效
let 只在 let 命令所在的代码块内有效,var 是在全局范围内有效
*不能重复声明
let 只能声明一次 var 可以声明多次
*不存在变量提升
let 不存在变量提升,var 会变量提升
for (var i = 0; i < 10; i++) {
setTimeout(function(){
console.log(i);
})
}
// 输出十个 10
//原因:setTimeout是一个宏任务,它在事件队列里排在了script标签这个宏任务的后面。
//浏览器会先执行第一个宏任务,也就是读取script标签中的代码,遇到setTimeout时,
//将其放进事件队列中等待执行,循环10次,也就是事件队列中放了10个setTimeout,
//这时第一个事件执行完毕,再执行下一个宏任务,也就是依次执行setTimeout,
//这时i已经变成了10,所以会打印出十个10;
for (let j = 0; j < 10; j++) {
setTimeout(function(){
console.log(j);
})
}
// 输出 0123456789
//原因:因为let i 的是区块变量,每个i只能存活到大括号结束,
//并不会把后面的for循环的 i 值赋给前面的setTimeout中的i;
//而var i 则是局部变量,这个 i 的生命周期不受for循环的大括号限制
const 声明一个只读的常量,一旦声明,常量的值就不能改变。
- const 其实保证的不是变量的值不变,而是保证变量指向的内存地址所保存的数据不允许改动,也就是指针是固定的,但是指向的内容无法控制。
就像是抽屉的钥匙,明确指向是哪个抽屉,但是抽屉里面可以放不同的东西。 - 使用 const 声明复杂类型对象时要慎重
对于简单类型(数值 number、字符串 string 、布尔值 boolean),指向的那个内存地址,因此 const 声明的简单类型变量等同于常量。
对于复杂类型(对象 object,数组 array,函数 function),变量指向的内存地址其实是保存了一个指向实际数据的指针