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 相关文章推荐
event对象的方法 兼容多浏览器
Jun 27 Javascript
JS对HTML标签select的获取、添加、删除操作
Oct 17 Javascript
javascript利用apply和arguments复用方法
Nov 25 Javascript
.NET微信公众号开发之创建自定义菜单
Jul 16 Javascript
Jquery ajax 同步阻塞引起的UI线程阻塞问题
Nov 17 Javascript
jQuery的Cookie封装,与PHP交互的简单实现
Oct 05 Javascript
使用 jQuery 实现表单验证功能
Jul 05 jQuery
Vue 动态设置路由参数的案例分析
Apr 24 Javascript
JavaScript面向对象中接口实现方法详解
Jul 24 Javascript
原生Vue 实现右键菜单组件功能
Dec 16 Javascript
JSONP解决JS跨域问题的实现
May 25 Javascript
js+canvas实现刮刮奖功能
Sep 13 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
雄兵连:天使彦天使彦为爱折翼,彦和炙心同时念动的誓言!
2020/03/02 国漫
PHP 和 COM
2006/10/09 PHP
让Json更懂中文(JSON_UNESCAPED_UNICODE)
2011/10/27 PHP
php中将数组存到文件里的实现代码
2012/01/19 PHP
做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)
2013/04/13 PHP
解析ajax事件的调用顺序
2013/06/17 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
PHP实现普通hash分布式算法简单示例
2018/08/06 PHP
php设计模式之职责链模式定义与用法经典示例
2019/09/19 PHP
javascript实现的鼠标链接提示效果生成器代码
2007/06/28 Javascript
编写跨浏览器的javascript代码必备[js多浏览器兼容写法]
2008/10/29 Javascript
js原型链原理看图说明
2012/07/07 Javascript
javascript Slip.js实现整屏滑动的手机网页
2015/11/25 Javascript
JS获取地址栏参数的两种方法(简单实用)
2016/06/14 Javascript
jQuery实现简单的网页换肤效果示例
2016/09/18 Javascript
vue实现表格增删改查效果的实例代码
2017/07/18 Javascript
微信小程序删除处理详解
2017/08/16 Javascript
使用JS和canvas实现gif动图的停止和播放代码
2017/09/01 Javascript
JS实现图片放大镜插件详解
2017/11/06 Javascript
react学习笔记之state以及setState的使用
2017/12/07 Javascript
vue.js 底部导航栏 一级路由显示 子路由不显示的解决方法
2018/03/09 Javascript
JS如何实现手机端输入验证码效果
2020/05/13 Javascript
基于Python在MacOS上安装robotframework-ride
2018/12/28 Python
详解pandas删除缺失数据(pd.dropna()方法)
2019/06/25 Python
Python 控制终端输出文字的实例
2019/07/12 Python
Django高并发负载均衡实现原理详解
2020/04/04 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
2020/05/20 Python
解决Python3.8运行tornado项目报NotImplementedError错误
2020/09/02 Python
纯css3实现图片翻牌特效
2015/03/10 HTML / CSS
美国在线鲜花速递:ProFlowers
2017/01/05 全球购物
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
宣传策划类求职信范文
2014/01/31 职场文书
八年级语文教学反思
2014/02/11 职场文书
单位绩效考核方案
2014/05/11 职场文书
2015年公务员转正工作总结
2015/04/24 职场文书
科技活动总结范文
2015/05/11 职场文书