又来更新学习笔记了~目录let解决了var存在的问题特点1.具有块级作用域2.全局变量不能通过window(全局对象)访问3.不能重复声明变量4.变量不会提升为const的特点1.所有let属性都有2.只能定义常量,不能修改3.声明时必须初始化为什么const定义对象,它的属性是可以改变的,但是常量不能?最佳实践ES6-ES10学习布局let解决var的问题let的出现是为了解决一些var的问题同名变量不在同一个作用域内,互不影响//下面两个i,虽然名字一样,但是不在一个范围内,所以互不影响for(leti=0;i<3;i++){leti='foo'console.log(i)//foo}解决循环嵌套计数器命名相同混淆问题constarr=[1,2,3,4]for(leti=0;我<3;i++){for(leti=0;i<4;i++){console.log(arr[i])}}//123412341234解决异步变量被改变的问题在计数器循环中(求解原理:闭包)for(vari=0;i<3;i++){setTimeout(()=>{console.log(i)},0)}//输出三个3特征1。块级作用域{leta=1console.log(a)}console.log(a)//a未定义2.全局变量不能通过window(全局对象)访问varb=3letc=4console.log(b,c)//3,4console.log(window.b,window.c)//3,undefined3.不能重复声明变量varb=3letc=4console.log(b,c)//3,4varb=4console.log(b)//4letc=5//标识符'c'已经被声明dchasbeendeclaredconsole.log(c)4.不会进行变量提升functiontest(){console.log(a)leta=1}test()//Cannotaccess'a'beforeinitializationcannotbecalledbefore初始化const的特点1.所有let属性都有2.只能定义常量,不能修改cosnta=2a=3//赋值给常量变量类型错误3.必须初始化consta//constdeclarationdeclaration时缺少初始化器就是缺少初始化a=2,为什么const定义了一个属性可以改变的对象,而常量却不能呢?const其实保证的不是变量的值不能改变,而是变量指向的内存地址不能改变。对于简单类型的数据(数字、字符串、布尔值),值存放在变量指向的内存地址,所以相当于常量但是对于复合类型的数据(主要是对象和数组),变量指向的内存地址只保存一个指针,const只能保证指针指向的内存地址是固定的。至于它指向的内存地址存放的数据结构是不是可变的,就完全没法控制了。所以在将对象声明为常量时要小心。最好的做法是不用var,主要用const,遇到变量用let学习布局
