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) //undefined
var a=1
console.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 =1
window.a //1
let b =1
window.b //undefined