let const
es 6
Block Bindings(块绑定) let 声明
块声明(块级作用域)的两种形式
1 在一个函数内;
2 在一个大括号({})内
块声明与var
声明不同
1 var声明有变量声明提升的过程 块声明不存在变量声明提升
2 var 声明的变量可以再次声明 块声明不可以 报错
例子1 if(condition){ var a = 12; } 无论condition的值被解析为true 还是false 在循环体之外都可以可以访问到a这个变量 原因 js有一个预编译过程 也就是变量声明提升的过程 js会在执行代码之前把var声明的变量提升到当前作用域的顶端可以理解为 var a; //默认赋值为undefined if(condition){ a = 12; } if(condition){ console.log(a) //报错 let a = 12; } let声明的变量 没有变量声明提升这个过程 也就是说 在声明let a = 12之前 不能访问到a 报错 例子2 if(condition){ var count = 30; // Syntax error let count = 40; } 如果一个变量已经声明了 在let声明的范围之内再次声明会导致错误发生 例子3 var count = 30; if (condition) { let count = 40; } 这种结构的不会导致错误发生 几个问题 1 在let声明之前不能访问到 count 暂时性死区 2 在let声明之后 设置 count = 41; 不影响外围的count 相当于不同的同名变量 3 进入if语句中 因为定义了一个新的count变量 此count 非全局count
总结let
- let 定义的变量只存在当前作用域的函数代码块中
- 暂时性死区 在let声明之前不能访问到此变量 会发生错误
- let声明不能重新定义 会发生错误
- let 声明的全局对象 不挂载到window上 let a = 12; window.a = 2; window.a !== a
常量声明 const
const obj = { name: "lxk" } obj.age = 21; //不会报错 因为obj是一个指针 现在指针没有变 变得是指针指向的值 发生了改变 obj = { name: "lxk" } //报错 指针现在指向了一个新的内存区
- 同let声明一样 都存在块级作用域 不能重复声明 暂时性死区
- 赋值之后不可以修改 此常量的值
- 常量声明时 必须赋值
- for 循环中 创建了多个i的副本 好找到当前的i
let const 暂时性死区
例:
typeof name; ==>报错 暂时性死区
let name = ‘js’;
对比
typeof age; ‘undefined’ 访问了未定义的变量
const 声明一个常量
const MAX_LENTH ==> 语法错误
声明一个常量必须要赋值
const 声明的常量值 不可以再改变
如果是一个对象的话 可以修改属性
如果是一个数组的话 可以添加 删除项
理解为
Const 声明一个常量
基本类型 值不可改变
复杂类型 指针不可以改变
var 和 const let区别
var name = 12;
‘name’ in window ==> true
let age = 12; // const 同理
‘age’ in window ==> false
重点推荐: 默认使用const 只有确实需要改变变量的值的时候使用let