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 相关文章推荐
jquery提升性能最佳实践小结
Dec 06 Javascript
IE8提示Invalid procedure call or argument 异常的解决方法
Sep 30 Javascript
网页右下角弹出窗体实现代码
Jun 05 Javascript
JavaScript编程中window的location与history对象详解
Oct 26 Javascript
JS深度拷贝Object Array实例分析
Mar 31 Javascript
Bootstrap实现导航栏的2种方式
Nov 28 Javascript
基于casperjs和resemble.js实现一个像素对比服务详解
Jan 10 Javascript
express启用https使用小记
May 21 Javascript
el-input 标签中密码的显示和隐藏功能的实例代码
Jul 19 Javascript
一步一步实现Vue的响应式(对象观测)
Sep 02 Javascript
不刷新网页就能链接新的js文件方法总结
Mar 01 Javascript
vue过滤器实现日期格式化的案例分析
Jul 02 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
当海贼王变成JOJO风
2020/03/02 日漫
解析PHP中常见的mongodb查询操作
2013/06/20 PHP
php多种形式发送邮件(mail qmail邮件系统 phpmailer类)
2014/01/22 PHP
PHP遍历文件夹与文件类及处理类用法实例
2014/09/23 PHP
PHP把MSSQL数据导入到MYSQL的方法
2014/12/27 PHP
javascript 节点排序 2
2011/01/31 Javascript
在js文件中写el表达式取不到值的原因及解决方法
2013/12/23 Javascript
jQuery CSS()方法改变现有的CSS样式表
2014/09/09 Javascript
TypeScript具有的几个不同特质
2015/04/07 Javascript
jQuery插件bxSlider实现响应式焦点图
2015/04/12 Javascript
javascript 判断两个日期之差的示例代码
2015/09/05 Javascript
Javascript的动态增加类的实现方法
2016/10/20 Javascript
JS 插件dropload下拉刷新、上拉加载使用小结
2017/04/13 Javascript
JavaScript纯色二维码变成彩色二维码
2020/07/23 Javascript
快速掌握jquery分页插件jqPaginator的使用方法
2017/08/09 jQuery
Node.js如何使用Diffie-Hellman密钥交换算法详解
2017/09/05 Javascript
利用hasOwnProperty给数组去重的面试题分享
2018/11/05 Javascript
TypeScript类型声明书写详解
2019/08/28 Javascript
基于Element的组件改造的树形选择器(树形下拉框)
2020/02/27 Javascript
three.js 如何制作魔方
2020/07/31 Javascript
Python Tkinter基础控件用法
2014/09/03 Python
pandas Dataframe行列读取的实例
2018/06/08 Python
python实现顺序表的简单代码
2018/09/28 Python
Python原始套接字编程实例解析
2020/01/29 Python
基于spring boot 日志(logback)报错的解决方式
2020/02/20 Python
django使用多个数据库的方法实例
2021/03/04 Python
伦敦最著名的老字号百货公司:Selfridges(塞尔福里奇百货)
2016/07/25 全球购物
会务接待方案
2014/02/27 职场文书
小学语文国培感言
2014/03/04 职场文书
歌唱比赛主持词
2014/03/18 职场文书
办公室文员岗位职责
2015/02/04 职场文书
索赔员岗位职责
2015/02/15 职场文书
2015中秋节晚会开场白
2015/07/30 职场文书
《童年的发现》教学反思
2016/02/18 职场文书
浅谈pytorch中stack和cat的及to_tensor的坑
2021/05/20 Python
pandas:get_dummies()与pd.factorize()的用法及区别说明
2021/05/21 Python