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 相关文章推荐
javascrip客户端验证文件大小及文件类型并重置上传
Jan 12 Javascript
判断滚动条到底部的JS代码
Nov 04 Javascript
利用进制转换压缩数字函数分享
Jan 02 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
Feb 20 Javascript
jQuery实现文本展开收缩特效
Jun 03 Javascript
详解JavaScript 中的 replace 方法
Jan 01 Javascript
深入理解在JS中通过四种设置事件处理程序的方法
Mar 02 Javascript
js实现多个倒计时并行 js拼团倒计时
Feb 25 Javascript
Vue.js实现备忘录功能
Jun 26 Javascript
element-ui 远程搜索组件el-select在项目中组件化的实现代码
Dec 04 Javascript
JS数组方法push()、pop()用法实例分析
Jan 18 Javascript
vue 实现setInterval 创建和销毁实例
Jul 21 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
超强分页类2.0发布,支持自定义风格,默认4种显示模式
2007/01/02 PHP
PHP的explode和implode的使用说明
2011/07/17 PHP
jquery+php实现导出datatables插件数据到excel的方法
2015/07/06 PHP
PHP redis实现超迷你全文检索
2017/03/04 PHP
[JS]点出统计器
2020/10/11 Javascript
Javascript开发包大全整理
2006/12/22 Javascript
经常用的图片在容器中的水平垂直居中实例
2007/06/10 Javascript
js操作checkbox遇到的问题解决
2013/06/29 Javascript
Jquery 例外被抛出且未被接住原因介绍
2013/09/04 Javascript
判断JS对象是否拥有某种属性的两种方式
2013/12/02 Javascript
简介JavaScript中的push()方法的使用
2015/06/09 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构
2015/11/19 Javascript
基于jQuery实现点击最后一行实现行自增效果的表格
2016/01/12 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
AngularJs bootstrap搭载前台框架——基础页面
2016/09/01 Javascript
js 调用百度分享功能
2017/02/27 Javascript
bootstrap常用组件之头部导航实现代码
2017/04/20 Javascript
NodeJs实现简单的爬虫功能案例分析
2018/12/05 NodeJs
Vue 自定义指令功能完整实例
2019/09/17 Javascript
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
2019/10/26 jQuery
javascript前端和后台进行数据交互方法示例
2020/08/07 Javascript
python 生成器协程运算实例
2017/09/04 Python
使用Python读取大文件的方法
2018/02/11 Python
python3 对list中每个元素进行处理的方法
2018/06/29 Python
python矩阵的转置和逆转实例
2018/12/12 Python
python格式化输出保留2位小数的实现方法
2019/07/02 Python
Canvas与图片压缩的示例代码
2017/11/28 HTML / CSS
金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)-> (一千零一拾一元整)输出
2015/05/29 面试题
献爱心倡议书
2014/04/14 职场文书
交通事故私了协议书
2014/04/16 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
欠款起诉书范文
2015/05/19 职场文书
致短跑运动员加油稿
2015/07/21 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书
七年级作文之秋游
2019/10/21 职场文书
手写实现JS中的new
2021/11/07 Javascript