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 相关文章推荐
Prototype最新版(1.5 rc2)使用指南(1)
Jan 10 Javascript
Confirmer JQuery确认对话框组件
Jun 09 Javascript
showModalDialog模态对话框的使用详解以及浏览器兼容
Jan 11 Javascript
javascript使用prototype完成单继承
Dec 24 Javascript
Javascript将数值转换为金额格式(分隔千分位和自动增加小数点)
Jun 22 Javascript
JSONP跨域请求实例详解
Jul 04 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
Nov 18 Javascript
Angularjs中的ui-bootstrap的使用教程
Feb 19 Javascript
对angular4子路由&辅助路由详解
Oct 09 Javascript
vue实现登录页面的验证码以及验证过程解析(面向新手)
Aug 02 Javascript
学前端,css与javascript重难点浅析
Jun 11 Javascript
javascript实现前端分页功能
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
浅析echo(),print(),print_r(),return之间的区别
2013/11/27 PHP
根据中文裁减字符串函数的php代码
2013/12/03 PHP
PHP生成不重复标识符的方法
2014/11/21 PHP
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
微信支付开发动态链接Native支付
2016/07/12 PHP
php获取客户端IP及URL的方法示例
2017/02/03 PHP
php 中htmlentities导致中文无法查询问题
2018/09/10 PHP
php策略模式简单示例分析【区别于工厂模式】
2019/09/25 PHP
Google Map API更新实现用户自定义标注坐标
2009/07/29 Javascript
Jquery中使用setInterval和setTimeout的方法
2013/04/08 Javascript
ExtJs设置GridPanel表格文本垂直居中示例
2013/07/15 Javascript
node.js中的fs.lchownSync方法使用说明
2014/12/16 Javascript
jQuery层动画定位滑动效果的方法
2015/04/30 Javascript
gulp-htmlmin压缩html的gulp插件实例代码
2016/06/06 Javascript
js与jquery正则验证电子邮箱、手机号、邮政编码的方法
2016/07/04 Javascript
基于Phantomjs生成PDF的实现方法
2016/11/07 Javascript
完美解决JS文件页面加载时的阻塞问题
2016/12/18 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
[40:10]2015国际邀请赛全明星表演赛
2015/08/07 DOTA
利用python求相邻数的方法示例
2017/08/18 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
2018/05/16 Python
Python 类的魔法属性用法实例分析
2019/11/21 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
2020/02/20 Python
Python实现石头剪刀布游戏
2021/01/20 Python
L’Artisan Parfumeur官网:法国香水品牌
2020/08/11 全球购物
室内设计专业学生的自我评价分享
2013/11/27 职场文书
国际贸易专业个人职业生涯规划
2014/02/15 职场文书
体育系毕业生求职自荐信
2014/04/16 职场文书
优秀教师感人事迹材料
2014/05/04 职场文书
转正申请报告格式
2015/05/15 职场文书
小学运动会加油稿
2015/07/22 职场文书
办公室规章制度范本
2015/08/04 职场文书
JS一分钟在github+Jekyll的博客中添加访问量功能的实现
2021/04/03 Javascript
详解CSS不定宽溢出文本适配滚动
2021/05/24 HTML / CSS
Java输出Hello World完美过程解析
2021/06/13 Java/Android
详解Vue router路由
2021/11/20 Vue.js