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

  1. let 定义的变量只存在当前作用域的函数代码块中
  2. 暂时性死区 在let声明之前不能访问到此变量 会发生错误
  3. let声明不能重新定义 会发生错误
  4. let 声明的全局对象 不挂载到window上 let a = 12; window.a = 2; window.a !== a

常量声明 const

            const obj = {
                name: "lxk"
            }
            obj.age = 21; 
            //不会报错 因为obj是一个指针 现在指针没有变 变得是指针指向的值 发生了改变
            obj = {
                name: "lxk"
            }
            //报错 指针现在指向了一个新的内存区
        
  1. 同let声明一样 都存在块级作用域 不能重复声明 暂时性死区
  2. 赋值之后不可以修改 此常量的值
  3. 常量声明时 必须赋值
  4. 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
原文地址:https://www.cnblogs.com/liuxiankun/p/8399066.html