一、变量
- let
代码块内有效,无变量提升、不可重复声明
{ let a = 2; }for循环非常实用let。
for (var i = 0; i < 10; i++) { setTimeout(function(){ console.log(i); }) }
// 这个 var 在全局内有效,而setTimeout 中的 i 指向的是全局的 i; // 输出十个 10
for (let j = 0; j < 10; j++) { setTimeout(function(){ console.log(j); }) }
// 变量 j 是用 let 声明的,当前的 j 只在本轮循环中有效,每次循环的 j 其实都是一个新的变量; javaScript引擎会记住前一个循环的值。 // 输出 0123456789 - const
const 声明一个只读变量,声明之后不允许改变。意味着,一旦声明必须初始化,否则会报错。
对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。
对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,
const
只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。
const foo = {}; // 为 foo 添加一个属性,可以成功 foo.prop = 123; foo.prop // 123 // 将 foo 指向另一个对象,就会报错 foo = {}; // TypeError: "foo" is read-only