今天来总结一下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. 剑指Offer-和为S的连续正数序列

    题目: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他就 ...

  2. python 编码 自动加双斜杠问题

    小编最近在进行utf-8转码的时候,遇到一个问题: 当其他编码中含有斜杆,如: 当取出该字符串时,会自动把斜杆转换成双斜杠 导致转码报错: 这时候可以在转码的时候加上,即可转换成功了 .decode( ...

  3. Hive 外部表的练习(多表关联查询,以及分组,子查询)

    Hive 外部表的练习 hive创建库和表操作 hive加载数据,4种发放 1.数据放在Linux创建表结构 进行加载 2.先定义表结构.将一个查询select语句结果插入到表中 3.数据先放在hdf ...

  4. .net core 连接mysql

    Package引入: mysql.data MySql.Data.EntityFrameworkCore Pomelo.EntityFrameworkCore.MySql 2. 在package ma ...

  5. 笔记《JavaScript 权威指南》(第6版) 分条知识点概要1—词法结构

    [词法结构]字符集.注释.直接量.标识符和保留字.可选的分号 [字符集] JavaScript程序是用Unicode字符集编写的. Unicode是ASCII和Latin-1的超集,支持地球上几乎所有 ...

  6. TP5.0 Redis(单例模式)(原)

    看到好多面试都问设计模式,我就简单的了解了一下,顺便把之前封装好的Reis做了一次修改. 单例模式(Singleton Pattern 单件模式或单元素模式) 单例模式确保某个类只有一个实例,而且自行 ...

  7. .NET Core和Swagger 生成 Api 文档转

    阅读目录 1.引用 2.打开startup.cs文件 3.设置XML注释 4.运行结果 5.主要问题的解决办法 6.可以自定义UI 前言 最近写了好多Web api, 老大说太乱了,要整理一下,使用S ...

  8. mycat环境搭建

    最近工作中突然让搞mycat,特意私下在家先搞一套练个手: 1.先下载一个CentOS7 mini版本就可以(本人机器性能有限): 2.使用VMware创建虚拟机,过程百度下一大堆,这里不做详细介绍. ...

  9. vsftpd详细配置

    vsftpd配置文件详解 1.默认配置: 1>允许匿名用户和本地用户登陆. anonymous_enable=YES local_enable=YES 2>匿名用户使用的登陆名为ftp或a ...

  10. learning makefile foreach