摘要:同时这个变量立即被初始化,初始值为当语句执行到赋值语句时,这个变量改变其初始值。对一个还未初始化的变量进行操作将会引起。循环和循环使用申明变量时和循环一样。的运行过程和三者的表现和在循环过程中相似。
let和const
标签(空格分隔): es6
let命令这个命令是用来申明变量的,但是和es5不同的是,用它来声明的变量是局部变量,存在于局部作用域(blocked scope):
var a = 1; console.log(this.a); ===> 1 let a = 1;(局部变量,不会挂载在window或global下) console.log(this.a); ===> undefined
此外,在写es5的时候经常会遇到变量提升的情况,比如:
if(true) { console.log(a); ====> undefined var 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
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/80270.html
摘要:函数调用会在内存形成一个调用记录,又称调用帧,保存调用位置和内部变量等信息。等到运行结束,将结果返回到,的调用帧才会消失。方法用于将一组值,转换为数组。,和遍历数组方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的方法类似。 ES6 简介 ES6, 全称 ECMAScript 6.0 ,是 JavaScript 的下一个版本标准,2015.06 发版。 let 和 const...
摘要:和不同,没有变量提升,声明之前,该变量都是不可用的。声明创建一个只读的常量。这不意味着常量指向的值不可变,而是变量标识符的值只能赋值一次。声明同时必须赋值。 LET和const命令 var 变量声明提升原则 var语句声明的变量的作用域是当前执行位置的上下文 给一个非声明变量赋值会隐式创建一个全局变量(全局object的一个属性),注意这里是非声明赋值 声明和赋值是两回事,注意区分,...
摘要:所以,最终极的办法是一层一层冻结所有对象。块级作用域使呈现出块级作用域的特征。声明的变量仅存在于当前块级作用域中。在中,严格模式下等价于使用声明,非严格下等价于使用。在中使用声明的变量,为了保持程序的严谨性,不允许被访问。 let和const都是声明变量的新方式。 一般的,由于这两种声明方式的特性,现在项目组的开发规范中都会要求:不使用var而是let或const。 Const co...
JavaScript ES6 带来了新的语法和新的强大功能,使您的代码更现代,更易读。它允许您编写更少的代码并执行更多操作。 ES6 向我们介绍了许多强大的功能,如箭头函数,模板字符串,对象结构,模块等,让我们来看看。 const and let const 是 ES6 中用于声明变量的新关键字。 const 比 var 更强大。使用后,无法重新分配变量。换句话说,它是一个不可变的变量,除非它与...
阅读 3073·2021-11-24 11:14
阅读 3505·2021-11-22 15:22
阅读 3204·2021-09-27 13:36
阅读 717·2021-08-31 14:29
阅读 1331·2019-08-30 15:55
阅读 1761·2019-08-29 17:29
阅读 1148·2019-08-29 16:24
阅读 2410·2019-08-26 13:48