在ES6中,增加了2个声明变量的关键字:let 和 const。在这里将详细介绍let与var的区别、Babel对let的处理以及const的简单使用。

1. let

在ES6规范中增加了 let 关键字。let有什么用呢?与var有什么区别呢?

1.1 let 的作用

let,可用于声明一个块级作用域的变量。

如在if()语句内用let声明的变量,不会延伸到if()语句外部。

function foo() {
if (true) {
let x = 1;
}
console.log(x); // error:x is not defined
}
foo();

1.2 let与var的区别

在比较两者区别之前,首先需要了解var的作用域和变量提升:

①var没块级作用域。

②使用var在函数或全局内任何地方声明变量相当于在其内部最顶上声明它,这种行为称为Hoisting(提升)。

了解更多var的知识可访问之前的文章:JavaScript var的作用域和提升

1) 作用域的区别

var:没有块级作用域,因为变量提升的特性,其声明变量的作用域为整个函数或全局范围。

let:拥有块级作用域的特性,其声明的变量作用域范围从声明处一直到当前块级语句(若存在)的结尾,否则会一直延伸到函数结尾(在函数内)或全局结尾。

2) 在全局作用域声明的变量是否作为window对象的成员

var:在全局作用域声明的变量,会作为widnow对象的成员。

let:在全局作用域声明的变量,不会作为window对象的成员。

var x = 1;
let y = 1;
console.log(window.x); // => 1
console.log(window.y); // => undefined:let声明的变量没有附加到window对象上

3) 同级作用域声明同名变量的区别

在在同一个作用域声明2个名称一样的变量时两者的表现:

var:因变量提升特性,声明2个相同的变量没问题。

let:报错,会提示变量已存在。

function foo() {
var x = 1;
let x = 2; // error:Identifier 'x' has already been declared
}
foo();

4) for()循环语句内延迟输出循环变量

在下面代码中使用setTimeout函数延迟输出let和var定义的变量:

function foo() {
for (var x = 0; x < 5; x++) {
setTimeout(function() {
console.log(x); // => 5 5 5 5 5
}, 100);
} for (let y = 0; y < 5; y++) {
setTimeout(function() {
console.log(y); // => 0 1 2 3 4
}, 100);
}
}
foo();

可以看到使用var定义的x变量将会输出5次5,而使用let定义的y变量会依次输出0 1 2 3 4,这是为什么呢?

还是因为var的变量提升特性,第一个循环体的变量x,实际就为1个;而第二个循环体,每循环一次创建一次变量y。

所以上面的代码可转换以下代码:

function foo() {
var x;
for (x = 0; x < 5; x++) {
setTimeout(function() {
console.log(x); // => 5 5 5 5 5
}, 100);
} for (let y = 0; y < 5; y++) {
setTimeout(function() {
console.log(y); // => 0 1 2 3 4
}, 100);
}
}
foo();

1.3 Babel对let的处理

let是属于ES6,当使用Babel将其转换为ES5的代码是时是怎么转换的呢?可得出几种转换场景:

1)在同一作用域范围内,若 let 前面没有用 var 定义过的同名变量时,直接使用 var 代替 let 用于声明变量

2) 在同一作用域范围内,若 let 前面出现过用 var 定义同名变量时,修改 let 声明的变量名,并用 var 代替声明

3) 若在一个循环语句内部,let声明的变量 参与了 延时函数(setTimeout、setInterval)的执行时,那么延时函数会转换一个独立函数

2. const

说明:const用于定义一个常量变量。

2.1 特性

①作用域的范围与let一样,声明前无法使用以const声明的常量。

②同一作用域范围内,const不能声明同名常量。

③const声明的常量不会成为window对象的成员。

④当用const声明的常量为值类型(e.g. String、Number)时,修改此常量的值会报错;但当声明的常量为引用类型(e.g. Array、Object)时,只可以修改此常量的成员。

2.2 示例

1) 修改值类型的常量会报错

const x = 1;
x = 2; // => Uncaught TypeError: Assignment to constant variable.

2) 修改引用类型的常量的成员不会报错

// 1.const声明一个数组
const x = [1, 2, 3];
console.log(x); // => [1, 2, 3]
x[0] = 2; // 修改数组的第一个元素的值
console.log(x); // => [2, 2, 3] // 2.const声明一个对象
const obj = {};
obj.name = 'polk';
console.log(obj.name); // => polk

3. 扩展阅读

let MDN :https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

const MDN :https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const

End
菜单加载中...

JavaScript ES6 let、const的更多相关文章

  1. 我的Vue之旅、02 ES6基础、模块、路径、IO

    自定义模块 为什么要模块?模块化源代码能给我们带来什么好处? 试想一个巨无霸网购平台,在没有模块化的情况下,如果出现bug,程序员就要在几百万行代码里调试,导致后期维护成本上升,为了解决问题,模块化按 ...

  2. JavaScript 变量声明:var、let、const

    1. 概述 1.1 说明 在ES5 声明变量的方法:var命令和function命令. 在ES6 声明变量的方法:var命令.function命令.let命令.const命令.import命令.cla ...

  3. JavaScript中var、let和const的区别(转载)

    一.前言 在ES6(ES2015)出现之前,JavaScript中声明变量就只有通过 var 关键字,函数声明是通过 function 关键字,而在ES6之后,声明的方式有 var . let . c ...

  4. 【ES6】var、let、const三者的区别

    首先,一个常见的问题是,ECMAScript 和 JavaScript 到底是什么关系? ECMAScript是一个国际通过的标准化脚本语言.JavaScript由ECMAScript和DOM.BOM ...

  5. JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别

    JavaScript:学习笔记(7)——VAR.LET.CONST三种变量声明的区别 ES2015(ES6)带来了许多闪亮的新功能,自2017年以来,许多JavaScript开发人员已经熟悉并开始使用 ...

  6. JavaScript ES6中export、import与export default的用法和区别

    前言 相信很多人都使用过export.export default.import,然而它们到底有什么区别呢? 在看他们之间的区别之前,我们先来看看它们的用法. ES6 import和export的用法 ...

  7. 浅谈ES6——ES6中let、const、var三者的区别

    在了解let.const.var的区别之前,先了解一些什么是es6 Es6 全称ECMAscript 是JavaScript语言的一个标准,其实Es6本质就是JavaScript的一个版本,为什么叫E ...

  8. ES6 学习笔记(一)let、const与作用域

    一.let命令 1.1用法 1.1.1 let类似于var,但所声明的变量只在let命令所在的代码块有效. 如: { let a = 10 var b = 20 } console.log(b) co ...

  9. ES6学习笔记一:let、const、解构赋值

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7236342.html 感谢阮一峰老师的无私奉献,开源推动世界!教程地址:http://es6.ruanyife ...

随机推荐

  1. PE文件详解二

    本文转自小甲鱼的PE文件相关教程,原文传送门 咱接着往下讲解IMAGE_OPTIONAL_HEADER32 结构定义即各个属性的作用! 接着我们来谈谈 IMAGE_OPTIONAL_HEADER 结构 ...

  2. 高效开发技巧:为什么你下载Git项目这么慢?

    文章首发于[博客园-陈树义],点击跳转到原文<高效开发技巧:为什么你下载Git项目这么慢?>. 笔者所在公司采用的是 GitLab 进行版本管理,但许多同事下载 Git 项目的路径是这样的 ...

  3. java 重定向和转发的区别

    注:原创链接  http://www.cnblogs.com/shenliang123/archive/2011/10/27/2226892.html response.sendredirect(&q ...

  4. OpenCV2.4.9 Qt5.3.1 开发环境配置错误原因与解决方案

    问题原因与解决办法 A.配置完成后,示例程序无法正常显示图片且程序无法运行 出现原因:环境变量未正确配置 解决办法:检查环境变量,添加缺失的环境变量 B.出"未定义的引用..."类 ...

  5. C/C++知识点清单01

    第一章 C/C++程序基础 一.一般赋值语句: 考察一般赋值语句的概念和方法. 1.程序: #include<stdio.h> int main(void) { ,y,z; x*=(y=z ...

  6. gradle学习记录

    一.Gradle简介 Gradle是Android现在主流的编译工具,虽然在Gradle出现之前和之后都有对应更快的编译工具出现,但是Gradle的有时就在于它是亲儿子,Gradle确实比较慢,这和它 ...

  7. React Native随笔——组件TextInput

    一.实例 先看一下我要做的搜索框的样子 需要一个Image,和一个TextInput 去掉默认下划线 underlineColorAndroid='transparent' 设置光标颜色 select ...

  8. 微信公众号问题:{"errcode":40125,"errmsg":"invalid appsecret, view more at http:\/\/t.cn\/LOEdzVq, hints: [ req_id: kL8J90219sg58 ]"}

    在调试微信公众号授权登录时遇到了这个错误,着实是心烦了半天,公众号相关开发以前是经常做的,很久没有接触了,而且遇到了这么个以前没遇到的问题. {"errcode":40125,&q ...

  9. 基于springboot的freemarker创建指定格式的word文档

    在web或其他应用中,经常我们需要导出或者预览word文档,比较实际的例子有招聘网站上预览或者导出个人简历,使用POI导出excel会非常的方便,但是如果想导出word,由于其格式控制非常复杂,故而使 ...

  10. 如何转换MySQL表的引擎

    有很多种方法可以将表的存储引擎转换成另一种引擎.每种方法都有其优缺点,在这里介绍四种方法: 选择优先级(pt-online-schema-change > 创建与查询 > 导出和导入 &g ...