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遍历之parent()和parents()的区别及parentsUntil()方法详解
Dec 02 Javascript
javascript遍历控件实例详细解析
Jan 10 Javascript
深入理解JavaScript编程中的原型概念
Jun 25 Javascript
JS组件Bootstrap实现弹出框和提示框效果代码
Dec 08 Javascript
详解javascript跨浏览器事件处理程序
Mar 27 Javascript
jQuery Ajax 上传文件处理方式介绍(推荐)
Jun 30 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
Jan 12 Javascript
Bootstrap Table使用整理(三)
Jun 09 Javascript
荐书|您有一份JavaScript书单待签收
Jul 21 Javascript
vue基于mint-ui实现城市选择三级联动
Jun 30 Javascript
vue 强制组件重新渲染(重置)的两种方案
Oct 29 Javascript
vue+echarts+datav大屏数据展示及实现中国地图省市县下钻功能
Nov 16 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
如何在PHP中使用Oracle数据库(6)
2006/10/09 PHP
浅析Mysql 数据回滚错误的解决方法
2013/08/05 PHP
让codeigniter与swfupload整合的最佳解决方案
2014/06/12 PHP
PHP连接MySQL数据库操作代码实例解析
2020/07/11 PHP
10个新的最有前途的JavaScript框架
2009/03/12 Javascript
jquery select(列表)的操作(取值/赋值)
2009/08/06 Javascript
jQuery Tools tooltip使用说明
2012/07/14 Javascript
JS匀速运动演示示例代码
2013/11/26 Javascript
Jquery树插件zTree用法入门教程
2015/02/17 Javascript
JavaScript 函数的执行过程
2016/05/09 Javascript
jQuery插件WebUploader实现文件上传
2016/11/07 Javascript
js实现数组内数据的上移和下移的实例
2017/11/14 Javascript
vue 中动态绑定class 和 style的方法代码详解
2018/06/01 Javascript
Vue项目从webpack3.x升级webpack4不完全指南
2019/04/28 Javascript
layui table复选框禁止某几条勾选的实例
2019/09/20 Javascript
详解如何在JS代码中消灭for循环
2019/12/11 Javascript
ES2020系列之空值合并运算符 '??'
2020/07/22 Javascript
ant design vue导航菜单与路由配置操作
2020/10/28 Javascript
通过python下载FTP上的文件夹的实现代码
2013/02/10 Python
python assert的用处示例详解
2019/04/01 Python
python 抓包保存为pcap文件并解析的实例
2019/07/23 Python
基于python实现把图片转换成素描
2019/11/13 Python
mac安装python3后使用pip和pip3的区别说明
2020/09/01 Python
使用css3实现超炫的loading加载动画效果
2014/05/07 HTML / CSS
HTML5实现分享到微信好友朋友圈QQ好友QQ空间微博二维码功能
2018/01/03 HTML / CSS
请写出 BOOL flag 与"零值"比较的 if 语句
2016/02/29 面试题
专科应届生求职信
2013/11/24 职场文书
政府门卫岗位职责
2014/04/29 职场文书
品质口号大全
2014/06/17 职场文书
离婚协议书怎么写
2014/09/12 职场文书
交通事故委托书范本
2014/09/28 职场文书
荒岛余生观后感
2015/06/09 职场文书
导游词之无锡古运河
2019/11/14 职场文书
七个非常实用的Python工具包总结
2021/06/15 Python
java.util.NoSuchElementException原因及两种解决方法
2022/06/28 Java/Android
python 使用pandas读取csv文件的方法
2022/12/24 Python