ES5 只有2种声明对象的方式 var function
ES6 有6种声明对象的方式 let 、const、 import、 class、 var、 function
新增let ,类似var ,但只能在定义let的那个代码块可以使用
let 在循环语句里使用,可以只在该循环中被使用;并且,在for循环中,定义循环语句使用let 所定义的变量 与在循环语句内部属于两个变量域.
for (let index = 0 ;index<3 ;index++){ //父级作用域let index="aaa" //子级作用域console.log(index)}
变量提升问题
使用var 定义的变量存在变量提升问题,即在定义前可以使用该变量,输出为undefined
而使用let 定义的变量,必须在定义之后才能使用 暂时性死区
console.log(a) //undefinedvar a=1console.log(a) //报错let a = 1
块级作用域
块级作用域中定义的函数类似于let ,只能在该作用域中使用
浏览器环境差异问题,不要在块级作用域中使用函数声明,改写成函数表达式
{ 不要使用该方式function a(){}}{ //使用函数表达式let a = function(){}}
const
声明只读的常量,声明了就无法更改
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动
const number =[]number.push('nihao')//不会报错number =['nihao'] //会报错
如果像保证对象、数组不可修改,可以采用冻结的方式
const foo = Object.freeze({});
顶层对象的属性
var、function 声明的全局变量,依旧是顶层对象的属性 ,而let、const、class声明的全局变量,不在是顶层对象的属性
var a =1window.a //1let b =1window.b //undefined
