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 相关文章推荐
JavaScript入门教程(7) History历史对象
Jan 31 Javascript
一些实用的jQuery代码片段收集
Jul 12 Javascript
jQuery div层的放大与缩小简单实现代码
Mar 28 Javascript
javascript Array.prototype.slice的使用示例
Nov 14 Javascript
JS模式之简单的订阅者和发布者模式完整实例
Jun 30 Javascript
jQuery实现摸拟alert提示框
May 22 Javascript
全面解析DOM操作和jQuery实现选项移动操作代码分享
Jun 07 Javascript
Vue.js学习教程之列表渲染详解
May 17 Javascript
详解如何使用node.js的开发框架express创建一个web应用
Dec 20 Javascript
详解vue 路由跳转四种方式 (带参数)
Apr 28 Javascript
javascript json对象小技巧之键名作为变量用法分析
Nov 11 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
Nov 26 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
如何做到多笔资料的同步
2006/10/09 PHP
php之XML转数组函数的详解
2013/06/07 PHP
浅析application/x-www-form-urlencoded和multipart/form-data的区别
2014/06/22 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
2019/05/09 PHP
javaScript同意等待代码实现心得
2011/01/01 Javascript
使用JavaScript判断图片是否加载完成的三种实现方式
2014/05/04 Javascript
JS绘制生成花瓣效果的方法
2015/08/05 Javascript
javascript中select下拉框的用法总结
2016/01/07 Javascript
原生js实现自由拖拽弹窗代码demo
2016/06/29 Javascript
Ajax与服务器(JSON)通信实例代码
2016/11/05 Javascript
使用JavaScript实现表格编辑器(实例讲解)
2017/08/02 Javascript
JS基于贪心算法解决背包问题示例
2017/11/27 Javascript
JS实现的将html转为pdf功能【基于浏览器端插件jsPDF】
2018/02/06 Javascript
解决vue-router中的query动态传参问题
2018/03/20 Javascript
微信小程序实现时间预约功能
2018/11/27 Javascript
Python将xml和xsl转换为html的方法
2015/03/10 Python
python实现微信接口(itchat)详细介绍
2017/10/23 Python
使用numpy和PIL进行简单的图像处理方法
2018/07/02 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
2019/03/14 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
2019/09/20 Python
使用Python构造hive insert语句说明
2020/06/06 Python
德国最大的设计师鞋网上商店:Budapester
2017/12/07 全球购物
Eyeko美国:屡获殊荣的睫毛膏、眼线笔和眉妆
2018/07/05 全球购物
Foreo国际站:Foreo International
2018/10/29 全球购物
西班牙在线光学:Visual-Click
2020/06/22 全球购物
商务日语毕业生自荐信范文
2013/11/14 职场文书
研发工程师的岗位职责
2013/11/18 职场文书
编辑找工作求职信范文
2013/12/16 职场文书
火车的故事教学反思
2014/02/11 职场文书
2015年物业管理工作总结
2015/04/23 职场文书
2015年共青团工作总结
2015/05/15 职场文书
安全生产会议制度
2015/08/06 职场文书
远程教育集中轮训基层干部培训班学习心得体会
2016/01/09 职场文书
关于python中模块和重载的问题
2021/11/02 Python
使用Python获取字典键对应值的方法
2022/04/26 Python