ES6对于let和const的认识

ES5对于变量而言,没有块级作用域这一说,存在的是函数作用域,但是在ES6中,let和const是属于块级作用域的声明,需要先声明,再使用,有点想起当时使用VC的场景,哈哈哈~

let

let的出现为JavaScript增加了块级作用域,使用let定义的变量,外层作用域是无法读取内层作用域的变量的

暂时性死区

if(true) {
    //TDZ开始
    tmp = 'abc';
    console.log(tmp);

    let tmp; // TDZ结束
    console.log(tmp);

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

babel编译之后的代码

'use strict';

if (true) {
    //TDZ开始
    tmp = 'abc';
    console.log(tmp);

    var tmp = void 0; // TDZ结束
    console.log(tmp);

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

在看到这里我觉得相比较而言就是定义tmp的时候,babel后多了一个void 0 , 于是我去查询了一下,总结出下面的东西,关于void的介绍

void(0) 相当于void 0,在ES5之前,window下的undefined是可以被重写的,于是导致了某些极端情况下使用undefined会出现一定的差错,所以用void 0是防止undefined被重写而出现判断不准确的情况,非严格模式下,undefined是可以重写的,严格模式是不能重写的

作用:1)防止被重写 2)减少字节,undefined属于基本类型,占用8个字节,而void 0代替undefined省了三个字节

对比以下两段代码

1)x赋默认值,y的值等于x

function  bar(x = 1, y = x) {
    return [x, y];
}

var res = bar();
console.log(res);

babel之后的代码

"use strict";

function bar() {
    var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
    var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : x;

    return [x, y];
}

var res = bar();
console.log(res);

2)x赋值为y,y赋默认值为1

function bar(x = y, y = 1) {
    return [x, y];
}
var res = bar();
console.log(res);

这个时候就出错了,x=y,此时y还没有声明,属于死区,babel的代码与上面类似,这里就不再赘述

块级作用域

function f() { console.log('I am outside!'); }

(function () {
  if (false) {
    // 重复声明一次函数f
    function f() { console.log('I am inside!'); }
  }

  f();
}());

在ES5的执行环境中输出的结果是”I am inside!”,但是在ES6的环境中,这是会报错的,但是利用bable编译的代码,执行的结果是“I am outside!”,利用babel编译的代码如下

'use strict';

function f() {
    console.log('I am outside!');
}

(function () {
    if (false) {
        // 重复声明一次函数f
        var _f = function _f() {
            console.log('I am inside!');
        };
    }
    f();
})();

const

const声明一个只读的变量,一旦声明,常量的值就不能改变

const PI = 3.1415;
console.log(PI);
PI = 3;

运行的时候,会出现Assignment to constant variable.的错误提示

const obj = {name : 'vam'};
obj.name = 'uu';

上面的代码运行并没有错误提示,const保证的不是变量的值不发生改变,而是变量指向的那个内存地址不得变动,对于简单类型(undefined、null、boolean、number、string)而言,值就保存在变量指向的那个内存空间,等同于常量,对于复杂类型,只是保存的一个指针,这个指针指向的空间里的内容就是无关紧要的

const和let一样存在暂时性死区,只能在声明的位置之后使用


参考:《ECMAScript 6入门

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值