let和const

标签(空格分隔): es6


let命令

这个命令是用来申明变量的,但是和es5不同的是,用它来声明的变量是局部变量,存在于局部作用域(blocked scope):

    var a = 1;console.log(this.a);   ===>  1let a = 1;(局部变量,不会挂载在window或global下)console.log(this.a);   ===>  undefined

此外,在写es5的时候经常会遇到变量提升的情况,比如:

    if(true) {console.log(a);     ====>  undefinedvar a = 1;}if(true) {console.log(a);     ====>  报错let a = 1;}

即,如果使用let进行变量申明的话,一定要先申明再使用

const命令

声明一个immutable(不可改变)的变量,而使用let申明的变量是mutable。但是需要注意的地方是使用const申明的变量是这个变量的本身只可能有一个值,是immutable的,但是并不指着个值是immutable的。这个值还是可以改变的。例如:

    cosnt obj = {}; //使用const声明了一个immutable的变量obj = {}        //重新对这个变量赋值,那么就会报错了const obj = {};obj.name = 'XL';console.log(obj); //  {name: 'XL'}这个时候是正常的

temporal dead zone

通过letconst声明的变量都有一个temporal dead zone(TDZ):当进入这个TDZ时,如果语句没有执行到申明这个变量时,在此之前get或者set这个变量都是会报错的.但是通过var申明的变量没有TDZ

通过var申明的变量的生命循环

  • 当进入到var变量的作用域中时,便为这个变量分配了存储空间。同时这个变量立即被初始化,初始值为undefined.

  • 当语句执行到赋值语句时,这个变量改变其初始值。

通过let申明的变量的生命循环

  • 当进入let申明变量的作用域中时,为这个变量分配了存储空间。但是这个变量并未没初始化。

  • 对一个还未初始化的变量进行get/set操作将会引起ReferenceError

  • 当语句执行到赋值语句时,这个变量改变其初始值。

const声明的变量必须一开就要赋值,并且这个变量不能被赋予新的值。

    const a;a = 'XL';   ====> 报错

在循环中的表现: var VS let VS const

  • for

  • for-in

  • for-of

for循环当中

    const arr = [];for(var i = 0; i < 3; i++) {arr.push(() => i);}arr.map(x => x());  //[3, 3, 3]

通过使用var申明变量时,会为这个值进行一次赋值,每次循环时都会重新对这个变量进行赋值。因此最后输出时,返回的是相同的值

    const arr = [];for(let i = 0; i < 3; i++) {arr.push(() => i);}arr.map(x => x());  //[0, 1, 2]

使用let申明变量的时候。每次循环过程,都相当于在一个新的blocked scope里面声明一个变量,它们相互之间没有影响,因此最后返回的值也不相同。

for-of循环和for-in循环

    const arr = [];for(var i of [0, 1, 2]) {arr.push(() => i);}arr.map(x => x());  //[2, 2, 2]

使用var申明变量时和for循环一样。

    const arr = [];for(let i of [0, 1, 2]) {arr.push(() => i);}arr.map(x => x());  //[0, 1, 2]

使用let进行循环时和for循环一样。

使用const所达到的效果和let相同,不过通过const申明的变量是immutable的。

for-in的运行过程和三者的表现和在for-of循环过程中相似。

parameters

如果使用let去申明一个和形参名字相同的变量的时候,将会报错

    function func(arg) {let arg;        //static error: duplicate declaration of 'arg' }

但是如果使用var去申明的话,则不会报错,其达到的效果就是重新声明一个变量覆盖的掉了形式参数。

    function func(arg) {var arg;}

Coding style: const VS let VS var

  • 如果你要定义一个immutable varity原始值Forzen Objects)时,尽量使用const

  • 如果要定义一个初始值可能会发生变化的变量时,尽量使用let

  • 在全局环境下通过var来申明的变量是可以挂载到全局对象(window/global),但是你完全可以通过直接在window/global去定义这个变量/属性

参考:

exporing es6

es6--let和const相关推荐

  1. ES6 let和const 命令

    ES6 let 和 const 命令 1. 变量声明 2. 变量提升问题 3. 暂时性死区(TDZ) 4. 块级作用域 4.1 为什么需要块级作用域? 4.2 ES6的块级作用域 4.3 块级作用域和 ...

  2. ES6 - let、const与作用域

    一.let 1.1 学习let,首先我们来看一段代码: function test(){for(var i=0;i<3;i++){console.log(i) //1,2}console.log ...

  3. ES6 let与const基础用法笔记

    ES2015(ES6)新增了两个JS关键字:let和const.主要是用来变量的声明. 2.let 用法示例 { let score=100; alert(score); } let 特性 代码块内有 ...

  4. ES6 let和const命令(3)

    const 用来声明常量.一旦声明,就不能改变. const在声明必须初始化,只声明不赋值会出错 const的作用域与let一样,只在声明的块级作用域有效. const命令声明的常量也不提升,同样存在 ...

  5. es6 let和const命令(1)

    基本用法 ES新增了let命令,用于声明变量.其用法类似于var,但是所声明的变量只在let命令所在的代码块中有效. for(let i = 0;i<5;i++) {} console.log( ...

  6. ES6——let、const和var的用法和区别

    ES6 新增了let命令,用来声明变量,新增了const命令,用来声明常量,它们的用法类似于var. let a = 1; var b = 2; const PI = 3.14; 主要区别 块级作用域 ...

  7. es6 let和const

    一.let 1.let块作用域 if(true){var a=1;let b=2;}console.log("a:"+a);//a:1console.log("b:&qu ...

  8. ES6 | let 关键字 + const关键字 + 箭头函数 + rest参数 + 扩展运算符 ... + Symbol + 迭代器 + 生成器 + 变量的解构赋值 + 模板字符串

    目录 ECMASript 相关介绍 ECMASript 6 新特性 let 关键字 const关键字 变量的解构赋值 模板字符串 简化对象写法 箭头函数 => 参数默认值 rest参数 扩展运算 ...

  9. es6——let和const

    文章目录 let和const let基本用法 const基本用法 ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. let和const ...

  10. ES6 let 和 const 关键字

    一.ES5 的 var 关键字 var 存在变量提升 var 允许重复声明,浏览器本身只识别一次,但不会报错 var 声明的变量即是全局变量,也相当于给 GO(window) 设置了一个属性而且两者建 ...

最新文章

  1. 递归和循环:跳台阶和变态跳台阶和矩形覆盖
  2. js 适配手机端屏幕字体大小
  3. 用c语言输出数组中最小值,C语言.由键盘输入10个整数存入数组,输出最大值、最小值及它们的位置信息.并将最大、最小值位置互换后,再...
  4. 【转】unity3d优化总结篇
  5. 【源码类】开源项目汇总
  6. Android自定义组合控件--EditText和Button组合成带有清空EditText内容功能的复合控件
  7. VC 为静态控件添加事件
  8. Git 常用命令及讲解(不断更新)
  9. redis和memcached缓存
  10. ETF的战争从未停止【文献推荐·天风金工吴先兴团队】
  11. 10万字208道Java经典面试题总结(附答案)
  12. MySQL Workbench 6.3CE 汉化及使用教程(转载)
  13. 康托尔是怎样发现超限数的?
  14. Mosquitto not authorised
  15. 高中信息技术合格考试Python编程知识点全整理【连载....】
  16. JS之 获取日期方法
  17. PPT处理控件Aspose.Slides功能演示:使用 C# 在 PowerPoint 演示文稿中创建 SmartArt
  18. html+text+shadow语法,text-shadow属性怎么用
  19. Socket网络编程——C++版源码
  20. 计算机无法进入增值税认证平台,增值税勾选认证平台无法进入是什么原因?其他网页都能打开,就这个网页打不开...

热门文章

  1. vue-router同一路由地址同页面切换无效解决
  2. win10 更新计算机时间,win10更新时间太长怎么回事_windows10更新时间太久解决教程...
  3. ST推出 28nm MCU ,NXP更狠,推出16nm MCU
  4. Cat源码分析(三):10种分析器
  5. Invalid hook call. Hooks can only be called inside of the body of a function
  6. Mapreduce统计
  7. 模拟电路仿真LTspice(3):三极管共发射极放大电路
  8. linux查看nas剩余大小,老徐玩NAS 篇二:我的群晖储存空间哪儿去了——100%破案的教程...
  9. Java常见面试题(二)
  10. 设备安全——防火墙j基础策略实验【华为NSP】