ES6的let和const

let

  • let和var很相似,用于声明一个变量。但是let声明的变量只存在块状作用域内。
function order(x, y) {
    if (x > y) { // (A)
        let tmp = x;
        x = y;
        y = tmp;
    }
    console.log(tmp===x); // ReferenceError: tmp is not defined
    return [x, y];
}
  • 使用大括号代替立即执行函数{ let a = 123; } console.log(a); // ReferenceError: a is not defined

const

  • const则是用来声明某个变量等于它初始化的值,并且不能再改变。同样,const也是只存在块状作用域内的
const foo;  // SyntaxError: Missing initializer in const declaration

const bar = 123;
bar = 456; // TypeError: `bar` is read-only
  • 注意和Object.freeze的区别。PS:经庄希琦提醒,这里可以借用指针的概念,obj指向了obj的指针,此指针不可变,但是对象内部的值还是可以改变的。
const obj = {a: 123};
obj.a = 234;
console.log(obj.a); // 234

const obj2 = Object.freeze({a:123});
obj.a = 234; // 这里应该要报错的,但是chrome现在没有报错
console.log(obj.a); // 123

Temporal Dead Zone (TDZ)

由let和const声明的变量都会有自己的TDZ。当进入这个变量的作用域的时候,这个变量是不能被访问的,直到这个变量被初始化。我们来看下面一段代码

let tmp = true;
if (true) { // enter new scope, TDZ starts
    // Uninitialized binding for `tmp` is created
    console.log(tmp); // ReferenceError

    let tmp; // TDZ ends, `tmp` is initialized with `undefined`
    console.log(tmp); // undefined

    tmp = 123;
    console.log(tmp); // 123
}
console.log(tmp); // true

TDZ的原因可以简单地理解为,let和const不存在变量提升

并且要注意,这段代码经过babel编译,结果会是:undefined, undefined, 123, true,不会报错,因为babel是使用var去最大限度模拟let

何时使用let和const

  1. 尽可能使用const
  2. 当变量需要改变的时候,把const改为let

参考资料

Exploring ES6

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Petrichor的专栏

Dataset 列表:机器学习研究

In computer vision, face images have been used extensively to develop face recog...

1831
来自专栏搞前端的李蚊子

Html5模拟通讯录人员排序(sen.js)

// JavaScript Document  var PY_Json_Str = ""; var PY_Str_1 = ""; var PY_Str_...

6426
来自专栏一个会写诗的程序员的博客

java.base.jmod

/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/jmods$ jmod list java....

1182
来自专栏前端儿

Web 前端颜色值--字体--使用,整理整理

颜色值 CSS 颜色使用组合了红绿蓝颜色值 (RGB) 的十六进制 (hex) 表示法进行定义。对光源进行设置的最低值可以是 0(十六进制 00)。最高值是 2...

2762
来自专栏c#开发者

making Task<T> awaitable

Eduasync part 5: making Task<T> awaitable In part 3 we looked at what the C# 5 c...

3367
来自专栏我和未来有约会

silverlight beta 2 将在本周末发布.

太开心了,刚刚收到微软silverlight.net的邮件.  确定了 将在本周末发布beta2. 以下是部分邮件内容 引用: There are some...

2006
来自专栏c#开发者

XML Encryption in .Net

XML Encryption in .Net One of the new features being introduced with the Whidbey...

4477
来自专栏增长技术

App Guide相关

##TourGuide https://github.com/worker8/TourGuide

832
来自专栏linux驱动个人学习

高通Audio中ASOC的machine驱动

ASoC被分为Machine、Platform和Codec三大部分,其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的...

1K4
来自专栏跟着阿笨一起玩NET

c# 使用timer定时器操作,上次定时到了以后,下次还未执行完怎么处理

------解决方案-------------------------------------------------------- 开始的时候,禁用定时器,你...

3071

扫码关注云+社区