ES6学习笔记之变量声明let,const

最近用淘宝的weex作了个项目,最近稍微闲下来了。正好好久没有接触RN了,因此趁这个机会系统的学习一下ES6的相关知识。es6

孔子说:没有对比就没有伤害。因此咱们要拿ES6和ES5好好对比的学习。这样才能明白es6是多少的好,积极的拥抱她!weex

1.let函数

用let声明的变量,只会在let命令所在的代码块内有效。学习

let的块状做用域spa

咱们来看一个简单的例子:指针

'use strict';
{
    let name = 'cloud';
    var age = 21;
}
name;//ReferenceError: name is not defined
age;//21

咱们在let声明变量name的代码块以外去访问这个变量,结果name是没有定义的。若是咱们但愿在能访问到name应该怎么作呢?code

'use strict';
{
    let name = 'cloud';
    var age = 21;
    name;//cloud
}

没错,咱们在let声明变量的代码块中去访问name变量。结果也正如咱们指望的那样,name的值被访问到了。对于高级oo语言而言,他们都是基于块状做用域的。对象

因此说,let让咱们声明的变量也拥有了块状做用域这样一个概念,而不单单是函数做用域了。blog

既然有了块级做用域,那把let用来声明循环里的变量是极好的。作用域

'use strict';
//死循环
for(var i = 0; i < 5; i++){
    console.log(i);
    for(var i = 0; i < 3; i++){
        console.log(i);
    }
}

for(let i = 0; i < 5; i++){
    console.log(i);
    for(let i = 0; i < 3; i++){
        console.log(i);
    }
}

若是没有let的话,上面代码中的内循环每次都会把var声明的变量i重置为0,因此毫无疑问,这是一个死循环。因此咱们必须把内循环中变量i换成变量j,或者其余的名称。可是这也会带来一个反作用,就是循环完成之后的i,被泄露成了全局变量。

'use strict';
for(var i = 0; i < 5; i++){
    i;//0,1,2,3,4
}
i;//5
for(let i = 0; i < 5; i++){
    i;//0,1,2,3,4
}
i;//ReferenceError: i is not defined

 

let声明的变量不存在变量声明提高

'use strict';
name; //undefined
age; //ReferenceError: age is not defined
var name = 'cloud';
let age = 21;

用var声明的变量name,虽然咱们在name使用后才声明并给其赋值,可是由于变量声明提高的缘由,咱们看到name已经声明了,只是其值是undefined而已。可是用let声明的age变量,却没有定义。因此说let是不存在变量声明提高的。

let的暂时性死区(temporal dead zone,简称TDZ)

只要是块级做用域中存在let命令,它所在的区域就成为了暂时性死区,使用let命令声明变量以前,该变量都是不可用的。同时该变量再也不受到外部的影响。

var name = 'new cloud';
{
//TDZ start name = 'cloud'; name;//ReferenceError: name is not defined let name;    //TDZ end name;//undefined let name = 'cloud'; name;//cloud }

如上代码,在let声明name以前,那么这个变量都是不可用的。因此这也带来一个问题,当咱们使用typeof这样的反射机制来检测咱们的所需的变量是否按照咱们设想的那样,typeof再也不是一个坚决不移的忠臣了,它也会报错了。

{
    typeof name;//undefined
    var name = 'cloud';
    typeof name;//ReferenceError: name is not defined
    let name = 'cloud';
}

let块状做用域内声明的变量,不容许重复声明。

1.
'
use strict'; var name = 'cloud'; var name = 'new cloud'; name;//new cloud
2.
'
use strict'; { let name = 'cloud'; var name = 'new cloud'; name; let name = 'cloud'; var name = 'new cloud'; name; let name = 'cloud'; let name = 'new cloud'; name; //SyntaxError: Identifier 'name' has already been declared }

第二段代码中的全部声明方式,都会报错。name已经被声明。

'use strict';
function setName(name){
    let name = name;//SyntaxError: Identifier 'name' has already been declared
    {
        let name = 'new cloud';
        console.log(name);//new cloud
    }
    console.log(name);//cloud
}
setName('cloud');

一样,在函数中从新声明变量也会报错的。

2.const

const是一个只读的常量。一旦声明,就不可更改。

'use strict';
const PI = 3.14;
PI = 3.1415;//TypeError: Assignment to constant variable

若是用const声明了常量,可是并无去初始化它。那么,也是会报错的。

'use strict';
const PI;//SyntaxError: Missing initializer in const declaration

一样,const的做用域与let命令相同:只在声明所在的块级做用域内有效。const命令声明的常量也是不提高,一样存在暂时性死区,只能在声明的位置后面使用。const声明的常量,也与let同样不可重复声明。

若是咱们用const来声明一个引用类型的话。const只能保证指针域不变,可是并不能保证数据域是不可变动的。

'use strict';
const employee = {};
employee['name'] = 'cloud';
employee['age'] = 21;

employee = {}; //TypeError: "employee " is read-only
employee['name'] = 'new cloud';
console.log(employee.name);//new cloud

若是想把一个对象完成的冻结的话,应该是用Object.freeze()方法。

const employee = Object.freeze({});
employee.name= 'cloud';//TypeError: Can't add property prop, object is not extensible
相关文章
相关标签/搜索