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

相关文章

来自专栏码云1024

JAVA 第二天 内部类

25211
来自专栏逸鹏说道

Python3 与 C# 面向对象之~封装

在线编程:https://mybinder.org/v2/gh/lotapp/BaseCode/master 在线预览:http://github.lessch...

663
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-18(02)总结Map,HashMap,HashMap与Hashtable区别,Collections工具类

(8)Hashtable和HashMap的区别? package cn.itcast_07; import java.util.Hashtable; /* *...

2695
来自专栏三好码农的三亩自留地

5分钟彻底理解-Java自动装箱、拆箱

当表格中左边列出的基础类型与它们的包装类有如下几种情况时,编译器会自动帮我们进行装箱或拆箱.

892
来自专栏有趣的django

第二章、深入类和对象

1570
来自专栏青枫的专栏

Java中,匿名内部类在开发中的使用以及匿名内部类的面试题

  我们在开发的时候,会看到抽象类,或者接口作为方法的形式参数。   而这个时候,我们知道实际需要的是一个子类的对象。 如果该方法仅仅调用一次,我们就可以...

612
来自专栏深度学习计算机视觉

Hashmap与Hashtable的区别

Hashmap是新框架中用来取代hashtable的,所以肯定用的更多,那么两者有什么区别呢 Hashmap###是不同步的,###Hashtable###是同...

3265
来自专栏企鹅号快讯

Python异常

一.Python的运行时错误称作异常 语法错误:软件的结构上有错误而导致不能被解释器解释或不能被编译器编译 逻辑错误:由于不完整或不合法的输入所致,也可能是逻辑...

1779
来自专栏余林丰

多个构造器参数使用构建器

标题一眼看过去可能不是很明白要讲什么,先来看看下面一段代码。 1 package example; 2 3 /** 4 * 重叠构造器 5 * ...

1818
来自专栏苍云横渡学习笔记

【JavaSE(五)】Java面向对象(下)

993

扫码关注云+社区