今天来总结一下ES6里面let与const的用法

  先总体看一下ES6中的let都有哪些特性:

let 特性

  1. let声明的变量在js中不可以重复声明,防止变量的污染和覆盖
  2. let声明的变量不涉及变量的提升,可以有效防止闭包问题
  3. let声明的变量在块级作用域中有效
  4. let声明的变量存在暂时性死区
    声明的变量在为执行到声明语句时,变量将会暂存在暂时性死区中,当执行完声明 语句时,将会从暂时性死区中将变量取出

1. 同名变量不可以重复声明

var a = 100;
et b = 20; // 报错

2. let声明的变量不存在变量提升的问题

/**
* es6新出的变量定义方式声明的变量不再与全局对象相关联
* 即class , let , const , import 声明的变量不会把变量挂到全局对象上
**/
let num = 10;
console.log(window.num); //undefined
var num2 = 10;
console.log(window.num2); //10

  我们都知道,js在全局中声明变量,其实质是哪个就是将该变量挂载到window对象的属性上,因此,在访问全局变量时,与访问window对象的属性是一致的。js的设计者逐渐意识到设计存在问题,因此,逐渐开始全局对象与全局变量进行分离。在使用let或者const,甚至之后的class声明变量,都不再将全局变量挂载全局对象(window或者global上)
3. 在ES6中还引入了块级作用域的概念。

 使用let和const声明的变量只在申明语句所在的块级作用域有效。离开了块级作用域,变量的声明失效,因此也不存在变量的提升。

{
  var a = 100;
  let b = 200;
} console.log(a); // 100
console.log(b); // b is not defined

  使用let和const+块级作用域的声明方式可以在某种程度上代替立即执行函数的方式

 let vari = 123;
// 立即执行函数解决变量命名冲突问题
(function(){
  let vari = 456;
  console.log(vari); // 4561
}()) // 块级作用域解决变量重名问题
{
  let vari = 789
  console.log(vari); // 789
}
console.log(vari); // 123

  

  很显然,利用ES6的块级作用域解决命名冲突更加简洁明了。

4.暂时性死区。

{
  /**
  * 1. 在块级作用域内允许声明函数
  * 2. 函数声明类似于var声明,将变量声明提升到函数作用域或者全局作用域前面,但函数体不提升
  * 3. 函数声明提升到所在块级作用域的头部
  **/
  function f() { console.log('i am in outside!'); }
  (function () {
    // f(); //f is not a function ,说明函数的声明提升到了函数作用域的头部,在此处已有f变量的声明,其值为undefined
    // console.log(f);
    if (true) {
      // f = 10;
      console.log(f); //此处f的值为函数体,说明函数整体提升到了块级作用域的头部
      // f = 10;
      function f() { console.log('i am in inside!'); }
    }
  }());
}

  

  在块级作用域中允许申明函数,不过该声明方式与ES5的形式不同,在ES6的块级作用域中声明函数,会将函数的声明部分提升到块级作用域的头部,而函数提不提升。
  关于const的用法,其声明特性与let一致,只不过const声明的一般类型变量值是不可以修改的,对于引用数据类型来说是可以修改的。const声明的实质是const声明的对象的栈内存空间不能再改变,而引用变量所指向的堆内存空间是可以改变的。

{
  let obj = {
    name: 'zhang',
    age: 18,
    birthday: {
    year: 2018,
    month: 13,
    day: 32
    }
  };
  let myFreeze = (obj) => {
    for (let prop in obj) {
      // Object.freeze()方法能够是对象属性的值不可改,相当于加上了const声明
      Object.freeze(obj);
      // 若对象的属性依旧是引用类型,则递归处理
      if (typeof (obj[prop]) === 'object') {
      // console.log('referencing prop');
      myFreeze(obj[prop]);
    }
  }
  return obj;
}
var constObj = myFreeze(obj);
console.log(obj);
obj.birthday.year = 1998; //此处修改属性无效

  

  用上面的递归方式即可将一个对象转换为对象常量,即对象中所有的属性,不可更改。
  let与const的出现使得js的变量生命更加规范,因此,建议使用const和let的方式声明变量。

ES6 let&const的更多相关文章

  1. ES6之const命令

    一直以来以ecma为核心的js始终没有常量的概念,es6则弥补了这一个缺陷: const foo='foo'; foo='bar';//TypeError: Assignment to constan ...

  2. ES6 let const学习

    1.let命令:用法类似于var,但是所声明的变量,只在let命令所在的代码块有效. 例:var a = [ ]; for(var i=0;i<10;i++){ a[ i ] = functio ...

  3. ES6 let const 声明变量 块级作用域

    ES6 中除了使用 var 定义变量,还有let.const,定义变量. function getValue(condition){ console.log(typeof value2); // un ...

  4. ES6 let const 关键字

    ECMAScript 和 JavaScript的关系? 前者是后者的规格,后者是前者的实现. 符合ECMAScript 规格的还有 Flash 中的AcionScript 和 TypeScript. ...

  5. Es6 之 const关键字

    https://blog.csdn.net/jin_doudouer/article/details/80493649 es6中新增了一个const.就是用来定义一个常量的.以前其实一直没有把这个放在 ...

  6. ES6 let const关键字

    在es6中,引入了let和const关键字: 1.letES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. (1)在块级作用域里有效(比 ...

  7. ES6新增const常量、let变量

    JavaScript 严格模式(use strict) 严格模式下你不能使用未声明的变量. const c1 = 1; const c2 = {}; const c3 = []; 不能对c1的值进行再 ...

  8. [ES6] 22. Const

    'const' keyword is for creating a read only variable, something you can never change once created. ' ...

  9. ES6中const、let与var的对比详解

    对比 声明方式 变量提升 作用域 初始值 重复定义const 否   块级 需要 不允许let   否     块级 不需要 不允许var 是    函数级 不需要 允许 变量提升:const 和 l ...

随机推荐

  1. 菜鸡学C语言之真心话大冒险

    题目描述 Leslie非常喜欢真心话大冒险的游戏.这一次游戏的规则有些不同.每个人都有自己的真心话,一开始每个人也都只知道自己的真心话.每一轮每个人都告诉指定的一个人他所知道的所有真心话,那么Lesl ...

  2. ES9新内容概括

    本文主要介绍ES2018 新出的一些特性 1.异步迭代 允许 async/await 与 for-of 一起使用,以串行的方式运行异步操作,达到异步函数的迭代效果. async function pr ...

  3. wordpress百度熊掌号“搜索结果出图”改造代码

    <?php if(is_single()||is_page()){ echo '<script type="application/ld+json">{ &quo ...

  4. python之asyncio三种应用方法

    1.直接使用asyncio.run方法2.同步的效果,用await调用函数3.创建任务(asyncio.create_task),并发运行任务(await asyncio.gather) import ...

  5. 强化学习(八):Eligibility Trace

    Eligibility Traces Eligibility Traces是强化学习中很基本很重要的一个概念.几乎所有的TD算法可以结合eligibility traces获得更一般化的算法,并且通常 ...

  6. idea 本地tomcat启动控制台乱码问题

    问题:本地tomcat启动,控制台出现中文乱码: 解决办法: 安装了idea发现启动tomcat的时候控制台会有乱码问题,在tomcat配置中添加在VM options填写-Dfile.encodin ...

  7. (1)vue点击图片预览(可旋转、翻转、缩放、上下切换、键盘操作)

    今天做项目的时候,遇到了新需求,需要把点击图片放大的功能.学习了一下GitHub上的viewerjs插件 GitHub地址:https://github.com/fengyuanchen/viewer ...

  8. 常见排序算法JAVA实现

    1.冒泡排序,时间复杂度:最好:T(n) = O(n) ,情况:T(n) = O(n2) ,平均:T(n) = O(n2) public int[] bubbleSort(int[] nums) { ...

  9. 阅读github上的项目源码

    1.基础资料 函数手册,类库函数手册2.和程序相关的专业资料 高数,linux文件系统3.相关项目的文档资料4.留备份,构造可运行的环境,找开始的地方 main(),5.分层次阅读,写注解,编程思想, ...

  10. 使用HUI-admin过程中,返回上级页面并刷新

    非常简单的js self.location=document.referrer;