JavaScript ES6中const、let与var的对比详解


Posted in Javascript onJune 18, 2017

ECMAScript 6 新增 const 和 let 命令,用来声明变量。

声明方式 变量提升 作用域 初始值 重复定义
const 块级 需要 不允许
let 块级 不需要 不允许
var 函数级 不需要 允许

变量提升:const 和 let 必须先声明再使用,不支持变量提升

console.log(c1, l1, v1);
// 报错
// Uncaught ReferenceError: c1 is not defined
 
const c1 = 'c1';
let l1 = 'l1';
var v1 = 'v1';

作用域:const,let 支持块级作用域,有效避免变量覆盖

const c21 = 'c21';
let l21 = 'l21';
var v21 = 'v21';
 
if (0.1 + 0.2 != 0.3) {
 const c21 = 'c22';
 let l21 = 'l22';
 var v21 = 'v22';
 
 console.log(c21, l21, v21);
 // 输出 c22 l22 v22
}
 
console.log(c21, l21, v21);
// 输出 c21 l21 v22

块级作用域,在外层不能直接访问内层变量

if (0.1 + 0.2 != 0.3) {
 const c22 = 'c22';
 let l22 = 'l22';
 var v22 = 'v22';
 
 console.log(c22, l22, v22);
 // 输出 c22 l22 v22
}
 
console.log(c22, l22, v22);
// 报错
// Uncaught ReferenceError: c22 is not defined
// 同样地, l22 is not defined

const 定义常量,该常量不能赋值,但该常量的属性可以赋值

const c231 = {};
const c232 = [];
 
c231.name = 'seven';
c232.push(27);
 
console.log(c231, c232);
// 输出 {name: "seven"} [27]
 
// 禁止给对象赋值,应该使用 Object.freeze
 
const c233 = Object.freeze({});
const c234 = Object.freeze([]);
 
c233.name = 'seven';
// 普通模式下不报错
// 严格模式下报错
// Uncaught TypeError: Cannot add property name, object is not extensible
  
c234.push(27);
// 普通模式下就会报错
// Uncaught TypeError: Cannot add property 0, object is not extensible
 
console.log(c233, c234);
// 输出 {} []

全局变量不再设置为顶层对象(window)的属性,有效避免全局变量污染

const c24 = 'c24';
let l24 = 'l24';
 
console.log(c24, l24);
// 输出 c24 l24
 
console.log(window.c24, window.l24);
// 输出 undefined undefined

符合预期的 for 循环

for (var i = 0; i != 3; i++) {
 setTimeout(function() {
  console.log(i);
 },10);
}
// 依次打印

for (let i = 0; i != 3; i++) {
 setTimeout(function() {
  console.log(i);
 },10);
}
// 依次打印,为啥呢

可以看到在 for 循环中使用 let 方式声明变量才是符合预期。

在 for 中每一次循环,let 都是重新声明变量,并且因为 JavaScript 引擎会记住上一次循环的值,初始化 i 时在上一轮的基础上计算。

可以看到在 for 循环中至少有两层作用域,看下面的例子更容易理解。

for (let i = 0; i != 3; i++) {
 let i = 'seven';
 console.log(i);
}
console.log('eight');
// 依次打印
seven
seven
seven
eight

初始值:const 声明的变量必须设置初始值,且不能重复赋值。

const c3 = 'c3';
let l3 = 'l3';
var v3 = 'v3';
 
console.log(c3, l3, v3);
// 输出 c3 l3 v3
 
c3 = 2; // Uncaught TypeError: Assignment to constant variable
l3 = 2;
v3 = 2;
 
console.log(c3, l3, v3);
// 输出 c3 2 2
 
const c32;
// 报错
// Uncaught SyntaxError: Missing initializer in const declaration

重复定义:const 和 let 不支持重复定义

const、let 缩小了变量作用域,完美避免变量污染;const 固定变量(即固定变量类型),对于弱类型 JavaScript 来说,可以明显提升性能。推荐在应用中使用 const、let 声明变量。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
不使用XMLHttpRequest实现异步加载 Iframe和script
Oct 29 Javascript
JavaScript与DOM组合动态创建表格实例
Dec 23 Javascript
jquery解析JSON数据示例代码
Mar 17 Javascript
Node.js事件循环(Event Loop)和线程池详解
Jan 28 Javascript
简易的投票系统以及js刷票思路和方法
Apr 07 Javascript
asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)
May 05 Javascript
Angular2 Service实现简单音乐播放器服务
Feb 24 Javascript
d3.js入门教程之数据绑定详解
Apr 28 Javascript
使用jQuery实现简单的tab框实例
Aug 22 jQuery
深入解析ES6中的promise
Nov 08 Javascript
微信小程序实现类似微信点击语音播放效果
Mar 30 Javascript
微信小程序模板消息限制实现无限制主动推送的示例代码
Aug 27 Javascript
jquery DataTable实现前后台动态分页
Jun 17 #jQuery
jQuery Jsonp跨域模拟搜索引擎
Jun 17 #jQuery
vue router路由嵌套不显示问题的解决方法
Jun 17 #Javascript
详解vue+vueRouter+webpack的简单实例
Jun 17 #Javascript
js轮播图无缝滚动效果
Jun 17 #Javascript
详解webpack+vue-cli项目打包技巧
Jun 17 #Javascript
vue-router单页面路由
Jun 17 #Javascript
You might like
PHP 中的批处理的实现
2007/06/14 PHP
解析php中static,const与define的使用区别
2013/06/18 PHP
PHP实现简单实用的验证码类
2015/07/29 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
PHP生成推广海报的方法分享
2018/04/22 PHP
xml 封装与解析(javascript和C#中)
2009/07/26 Javascript
javascript Onunload与Onbeforeunload使用小结
2009/12/31 Javascript
基于jQuery实现左右div自适应高度完全相同的代码
2012/08/09 Javascript
将两个div左右并列显示并实现点击标题切换内容
2013/10/22 Javascript
javascript中apply和call方法的作用及区别说明
2014/02/14 Javascript
jQuery给动态添加的元素绑定事件的方法
2015/03/09 Javascript
js省市联动效果完整实例代码
2015/12/09 Javascript
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
2016/06/14 Javascript
微信小程序 图片宽度自适应的实现
2017/04/06 Javascript
利用Node.js批量抓取高清妹子图片实例教程
2018/08/02 Javascript
详解vue使用插槽分发内容slot的用法
2019/03/28 Javascript
微信小程序如何调用新闻接口实现列表循环
2019/07/02 Javascript
优化Vue中date format的性能详解
2020/01/13 Javascript
解决 window.onload 被覆盖的问题方法
2020/01/14 Javascript
Vue实现购物车基本功能
2020/11/08 Javascript
零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers
2014/11/05 Python
Python3字符串学习教程
2015/08/20 Python
json跨域调用python的方法详解
2017/01/11 Python
Python中类型检查的详细介绍
2017/02/13 Python
Python解惑之整数比较详解
2017/04/24 Python
Python实现的基数排序算法原理与用法实例分析
2017/11/23 Python
Python实现查找字符串数组最长公共前缀示例
2019/03/27 Python
python实现ip代理池功能示例
2019/07/05 Python
opencv实现简单人脸识别
2021/02/19 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
2020/06/28 Python
python 爬取小说并下载的示例
2020/12/07 Python
巴西最大的体育用品商城:Netshoes巴西
2016/11/29 全球购物
关于读书的演讲稿
2014/05/07 职场文书
青春励志演讲稿范文
2014/08/25 职场文书
2014年学校工会工作总结
2014/12/06 职场文书
大学生安全教育主题班会
2015/08/12 职场文书