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 相关文章推荐
Chrome中JSON.parse的特殊实现
Jan 12 Javascript
js实现addClass,removeClass,hasClass的函数代码
Jul 13 Javascript
javascript向flash swf文件传递参数值注意细节
Dec 11 Javascript
js Math 对象的方法
Sep 01 Javascript
不得不分享的JavaScript常用方法函数集(上)
Dec 23 Javascript
VUE axios上传图片到七牛的实例代码
Jul 28 Javascript
微信小程序实现登录遮罩效果
Nov 01 Javascript
详解为element-ui的Select和Cascader添加弹层底部操作按钮
Feb 07 Javascript
在Vue.js中使用TypeScript的方法
Mar 19 Javascript
Vue 构造选项 - 进阶使用说明
Aug 14 Javascript
VUE和Antv G6实现在线拓扑图编辑操作
Oct 28 Javascript
微信小程序淘宝首页双排图片布局排版代码(推荐)
Oct 29 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
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
2013/06/14 PHP
PHP中ltrim与rtrim去除左右空格及特殊字符实例
2016/01/07 PHP
PHP创建/删除/复制文件夹、文件
2016/05/03 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
2018/09/03 PHP
分享8个Laravel模型时间戳使用技巧小结
2020/02/12 PHP
整理一些JavaScript的IE和火狐的兼容性注意事项
2011/03/17 Javascript
关于js中for in的缺陷浅析
2013/12/02 Javascript
通过遮罩层实现浮层DIV登录的js代码
2014/02/07 Javascript
jquery easyui中treegrid用法的简单实例
2014/02/18 Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
2014/04/04 Javascript
浅谈javascript中的instanceof和typeof
2015/02/27 Javascript
跟我学习javascript的作用域与作用域链
2015/11/19 Javascript
javascript时间排序算法实现活动秒杀倒计时效果
2021/01/28 Javascript
轮播图组件js代码
2016/08/08 Javascript
JavaScript 是什么意思
2016/09/22 Javascript
nodejs构建本地web测试服务器 如何解决访问静态资源问题
2017/07/14 NodeJs
微信小程序 循环及嵌套循环的使用总结
2017/09/26 Javascript
vue中实现图片和文件上传的示例代码
2018/03/16 Javascript
vue组件挂载到全局方法的示例代码
2018/08/02 Javascript
layui使用form表单实现post请求页面跳转的方法
2019/09/14 Javascript
Centos7 安装Node.js10以上版本的方法步骤
2019/10/15 Javascript
vue开发简单上传图片功能
2020/06/30 Javascript
[01:31]完美与DOTA2历程
2014/07/31 DOTA
Python进程通信之匿名管道实例讲解
2015/04/11 Python
Python语言实现机器学习的K-近邻算法
2015/06/11 Python
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
Python获取文件所在目录和文件名的方法
2017/01/12 Python
python2.7和NLTK安装详细教程
2018/09/19 Python
Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
2019/02/26 Python
用Python中的turtle模块画图两只小羊方法
2019/04/09 Python
pytorch多GPU并行运算的实现
2019/09/27 Python
基于Python实现拆分和合并GIF动态图
2019/10/22 Python
联想美国官方商城:Lenovo美国
2017/06/19 全球购物
多媒体专业自我鉴定
2014/02/28 职场文书
生物学专业求职信
2014/07/23 职场文书
2015年感恩节活动总结
2015/03/24 职场文书