var和let的区别

let和var的区别

  1 用let 会产生变量提升的问题

  2 let 声明函数存在暂时性死区问题

  3 let 不允许重复声明变量

  4 let存在于块级作用域{}中,var在块级作用域之外也能访问

  5 最外层用var 声明的变量是全局变量(window),用let不是

const的特性和let基本一致,但是const是用于声明常量的

  const声明的是常量即不可变量,但实际上,如果const声明的是一个对象,我们是可以改变对象内部的属性的。原因是,const实际上保证的不是变量的值不被改动,而是内存地址不被改动,对于基本数据类型而言,变量保存的地址就是栈地址,是不可以被改变的。但是对于引用类型来说(对象和数组),变量保存的地址是一个堆内存的指针,const只可以保证指针是固定的(堆内存地址),但是如果对象的值改变了是控制不了的,所以将一个引用类型用const声明常量是要注意的。

所以,如果要声明一个对象为常量,我为大家提供一个冷冻对象的方法,这里用到es6的Object.freeze(冷冻对象)方法:

 /**
     * 冻结对象(声明一个不可修改的对象)
     * @param {*} obj  需要冻结的对象
     * 返回值:被冻结的对象
     * jsHelper.freezeObj({num:1})
     */

    freezeObj(obj){
        Object.freeze(obj); //首层冻结
        Object.keys(obj).forEach((key,i)=>{ //深层递归冻结
            if(this.typeOf(obj[key]) === 'object'){
                this.freezeObj(obj[key])
            }
        })
        return obj;
    }

  //用法
  const obj = freezeObj({name:'panda'})
原文地址:https://www.cnblogs.com/panda-programmer/p/13040030.html