es6--let和const
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
通过let
或const
声明的变量都有一个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相关推荐
- ES6 let和const 命令
ES6 let 和 const 命令 1. 变量声明 2. 变量提升问题 3. 暂时性死区(TDZ) 4. 块级作用域 4.1 为什么需要块级作用域? 4.2 ES6的块级作用域 4.3 块级作用域和 ...
- ES6 - let、const与作用域
一.let 1.1 学习let,首先我们来看一段代码: function test(){for(var i=0;i<3;i++){console.log(i) //1,2}console.log ...
- ES6 let与const基础用法笔记
ES2015(ES6)新增了两个JS关键字:let和const.主要是用来变量的声明. 2.let 用法示例 { let score=100; alert(score); } let 特性 代码块内有 ...
- ES6 let和const命令(3)
const 用来声明常量.一旦声明,就不能改变. const在声明必须初始化,只声明不赋值会出错 const的作用域与let一样,只在声明的块级作用域有效. const命令声明的常量也不提升,同样存在 ...
- es6 let和const命令(1)
基本用法 ES新增了let命令,用于声明变量.其用法类似于var,但是所声明的变量只在let命令所在的代码块中有效. for(let i = 0;i<5;i++) {} console.log( ...
- ES6——let、const和var的用法和区别
ES6 新增了let命令,用来声明变量,新增了const命令,用来声明常量,它们的用法类似于var. let a = 1; var b = 2; const PI = 3.14; 主要区别 块级作用域 ...
- es6 let和const
一.let 1.let块作用域 if(true){var a=1;let b=2;}console.log("a:"+a);//a:1console.log("b:&qu ...
- ES6 | let 关键字 + const关键字 + 箭头函数 + rest参数 + 扩展运算符 ... + Symbol + 迭代器 + 生成器 + 变量的解构赋值 + 模板字符串
目录 ECMASript 相关介绍 ECMASript 6 新特性 let 关键字 const关键字 变量的解构赋值 模板字符串 简化对象写法 箭头函数 => 参数默认值 rest参数 扩展运算 ...
- es6——let和const
文章目录 let和const let基本用法 const基本用法 ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. let和const ...
- ES6 let 和 const 关键字
一.ES5 的 var 关键字 var 存在变量提升 var 允许重复声明,浏览器本身只识别一次,但不会报错 var 声明的变量即是全局变量,也相当于给 GO(window) 设置了一个属性而且两者建 ...
最新文章
- 递归和循环:跳台阶和变态跳台阶和矩形覆盖
- js 适配手机端屏幕字体大小
- 用c语言输出数组中最小值,C语言.由键盘输入10个整数存入数组,输出最大值、最小值及它们的位置信息.并将最大、最小值位置互换后,再...
- 【转】unity3d优化总结篇
- 【源码类】开源项目汇总
- Android自定义组合控件--EditText和Button组合成带有清空EditText内容功能的复合控件
- VC 为静态控件添加事件
- Git 常用命令及讲解(不断更新)
- redis和memcached缓存
- ETF的战争从未停止【文献推荐·天风金工吴先兴团队】
- 10万字208道Java经典面试题总结(附答案)
- MySQL Workbench 6.3CE 汉化及使用教程(转载)
- 康托尔是怎样发现超限数的?
- Mosquitto not authorised
- 高中信息技术合格考试Python编程知识点全整理【连载....】
- JS之 获取日期方法
- PPT处理控件Aspose.Slides功能演示:使用 C# 在 PowerPoint 演示文稿中创建 SmartArt
- html+text+shadow语法,text-shadow属性怎么用
- Socket网络编程——C++版源码
- 计算机无法进入增值税认证平台,增值税勾选认证平台无法进入是什么原因?其他网页都能打开,就这个网页打不开...
热门文章
- vue-router同一路由地址同页面切换无效解决
- win10 更新计算机时间,win10更新时间太长怎么回事_windows10更新时间太久解决教程...
- ST推出 28nm MCU ,NXP更狠,推出16nm MCU
- Cat源码分析(三):10种分析器
- Invalid hook call. Hooks can only be called inside of the body of a function
- Mapreduce统计
- 模拟电路仿真LTspice(3):三极管共发射极放大电路
- linux查看nas剩余大小,老徐玩NAS 篇二:我的群晖储存空间哪儿去了——100%破案的教程...
- Java常见面试题(二)
- 设备安全——防火墙j基础策略实验【华为NSP】