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 条评论
登录 后参与评论

相关文章

来自专栏iOS技术杂谈

iOS @property探究(一): 基础详解你要知道的@property都在这里

你要知道的@property都在这里 本文大纲 Apple Adopting Modern Objective-C翻译 @property基本用法 @prope...

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

《Kotlin极简教程》第3章 Kotlin语言基础第3章 Kotlin语言基础《Kotlin极简教程》正式上架:参考资料

学习任何东西,都是一个由表及里的过程。学习一门编程语言也一样。对于一门编程语言来说,“表” 就是基本词汇(关键字、标识符等)、句子(表达式)和语法。

14520
来自专栏二进制文集

LeetCode 473 Matchsticks to Square

Remember the story of Little Match Girl? By now, you know exactly what matchstic...

11930
来自专栏程序员宝库

精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解

该项目来自于 Github 用户 Chalarangelo,目前已在 Github 上获得了 5000 多Star,精心收集了多达 48 个有用的 JavaSc...

376120
来自专栏LEo的网络日志

python技巧分享(三)

363100
来自专栏北京马哥教育

只要3分钟,Python生成器原理详解

翻译:你逗比 segmentfault.com/a/1190000011330511 这篇文章是对 500 Lines or Less 一书中高效爬虫一章的部...

37550
来自专栏Hongten

python开发_python代码风格(coding style)

13210
来自专栏算法修养

ZOJ 3715 Kindergarten Election

At the beginning of the semester in kindergarten, the n little kids (indexed fro...

29940
来自专栏LinXunFeng的专栏

iOS - 通过runtime获取某个类中所有的变量和方法

11220
来自专栏小狼的世界

用PHP实现的四则运算表达式计算

这个实现方式中使用了两个堆栈,一个用来存储数字,一个用来存储运算符,遇到括号以后就递归进入括号内运算,实现方式有点笨拙,后面补充一下“逆波兰表达式”的算法实现。...

15430

扫码关注云+社区

领取腾讯云代金券