JavaScript ES6中const、let与var的对比详解

来源:互联网 发布:淘宝投诉不成立 编辑:程序博客网 时间:2024/04/27 09:15

ECMAScript 6 新增 const 和 let 命令,用来声明变量。

声明方式变量提升作用域初始值重复定义const否块级需要不允许let否块级不需要不允许var是函数级不需要允许

变量提升:const 和 let 必须先声明再使用,不支持变量提升

?
1
2
3
4
5
6
7
console.log(c1, l1, v1);
// 报错
// Uncaught ReferenceError: c1 is not defined
  
const c1 = 'c1';
let l1 = 'l1';
varv1 = 'v1';

作用域:const,let 支持块级作用域,有效避免变量覆盖

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const c21 = 'c21';
let l21 = 'l21';
varv21 = 'v21';
  
if(0.1 + 0.2 != 0.3) {
 const c21 = 'c22';
 let l21 = 'l22';
 varv21 = 'v22';
  
 console.log(c21, l21, v21);
 // 输出 c22 l22 v22
}
  
console.log(c21, l21, v21);
// 输出 c21 l21 v22

块级作用域,在外层不能直接访问内层变量

?
1
2
3
4
5
6
7
8
9
10
11
12
13
if(0.1 + 0.2 != 0.3) {
 const c22 = 'c22';
 let l22 = 'l22';
 varv22 = '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 定义常量,该常量不能赋值,但该常量的属性可以赋值

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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)的属性,有效避免全局变量污染

?
1
2
3
4
5
6
7
8
const c24 = 'c24';
let l24 = 'l24';
  
console.log(c24, l24);
// 输出 c24 l24
  
console.log(window.c24, window.l24);
// 输出 undefined undefined

符合预期的 for 循环

?
1
2
3
4
5
6
7
8
9
10
11
12
13
for(vari = 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 循环中至少有两层作用域,看下面的例子更容易理解。

?
1
2
3
4
5
6
7
8
9
10
for(let i = 0; i != 3; i++) {
 let i = 'seven';
 console.log(i);
}
console.log('eight');
// 依次打印
seven
seven
seven
eight

初始值:const 声明的变量必须设置初始值,且不能重复赋值。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const c3 = 'c3';
let l3 = 'l3';
varv3 = '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 声明变量。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

原文链接:https://blog.zhengxianjun.com/2017/06/javascript-const-let-var/

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝账号体检虚拟违规怎么办 京东虚拟单被骗怎么办 网络公选课挂科怎么办 淘宝评论被商家关闭怎么办? 皇冠车钥匙丢了怎么办 皇冠行李箱钥匙丢了怎么办 淘宝主推产品扣两分怎么办 淘宝直通车宝贝排查下架怎么办 滴滴车龄超过8年怎么办 购物车超120了怎么办 没发货申请退款卖家不处理怎么办 淘宝卖家帐号被骗了怎么办 淘宝网下单忘了用返利网怎么办 该地域无法观看此直播怎么办 宝宝喝了有活虫的奶粉怎么办 淘宝商家店铺状态异常怎么办 淘宝购物提示买家信息错误怎么办 苹果淘宝占用空间大怎么办 苹果手机淘宝占内存太大怎么办 苹果手机淘宝图标找不到了怎么办 苹果手机看淘宝很卡怎么办 苹果手机淘宝忘了密码怎么办 苹果手机更新后淘宝打不开怎么办 淘宝买到苹果翻新机怎么办 淘宝网密码忘了怎么办 淘宝改密码要拍摄脸部怎么办 苹果一体机键盘没反应怎么办 淘宝买东西退货卖家拒绝怎么办? 淘宝被限制下单怎么办 淘宝扫码登录后怎么办 花呗选项被隐藏怎么办 新换手机支付宝怎么办 ih5点击按钮跳转页面怎么办 sap点安装程序没反应怎么办 淘宝店账号忘了怎么办 点击电脑桌面图标没反应怎么办 为什么淘宝打不开已停止运行怎么办 移动宽带打不开淘宝网怎么办 淘宝发布宝贝没有品牌怎么办 烫了卷发显老怎么办 唯品会商品不支持退换货怎么办