ES6_Day-1-let-const
ES6引入新的变量声明方式: let、const
ES6一共6中变量命名方式:var,let、const、function、class、import
let命令:
不存在变量提升:
在声明之前引用会报错(ReferenceError)
暂时性死区:
let声明的变量作用域为块级作用域,在块级作用域中声明了变量,但在其声明之前无法调用。
var temp = 'nothing'; // 更加具体的声明优先级更高 if(true){ temp = 'OK' // 当在块级作用域中使用let或const声明变量后,不允许在声明之前进行赋值操作 let temp; console.log(temp)
//会报错,由于在更具体的块级作用域中对变量进行了声明,因此会覆盖 全局变量 temp,而let声明的变量在声明之前无法调用,产生死区 }
不允许重复声明:
let 不允许在同一作用域内重复声明同一变量。即以let 命令声明的变量,不再允许以其他任何方式进行声明。
if(true){ let temp = 'A' // let temp = 'B' // var temp = 'B' // const temp = 'B' temp = 'B' //此种方式能够对 let 声明的变量进行修改,并非重新定义 console.log(temp) } console.log(temp //用于验证第六行代码并非重新定义
块级作用域:{}
由于函数命名提升,因此ES5中不允许在块级作用域中进行函数的声明。(但是浏览器可能不会报错,允许在块级作用域中进行函数声明)
ES6中明确规定了块级作用域。函数可在块级作用域中进行声明,但是不能在块级作用域外部进行引用,类似在块级作用域中使用 var 命令进行函数变量声明。
const命令
const声明一个只读常量,一旦声明不再改变。即该变量只能且必须在声明时进行一次初始化。
块级作用域内有效
不存在变量提升,存在暂时性死区
不可重复声明
const方式的本质是保证变量所指向的地址不会改变。因此对于基本数据类型,相同的地址必然是相同的字面量,因此变量简单数据类型的值不会发生改变。而对于复杂数据类型不能够保证其内部属性的不变。
if(true){ const temp = ['A']; console.log(temp, ) temp.push('B') //修改引用类型的值并不会报错,且能够成功修改 console.log(temp) }
顶层对象属性
ES5中顶层对象的属性与 全局变量是等价的。
ES6规定,var与function命令声明的全局变量依旧是顶层对象的属性,而let、const、class声明的全局变量不属于顶层对象属性。
globalThis对象
用于解决多种环境下顶层对象不同带来的差异。