ES6

简单了解ES6与ES2015 Symbol() 方法

symbol的中文意思是:符号;象征;标志;记号等。

Symbol的作用是什么? Symbol的作用非常的专一,换句话说其设计出来就只有一个目的——作为对象属性的唯一标识符,防止对象属性冲突发生。

举个例子,你看上了公司前来的前台妹纸,想了解关于她的更多信息,于是就询问Hr同事,扫地阿姨,于是得到类似这样信息:









 





let info1 = {
    name: '婷婷',
    age: 24,
    job: '公司前台',
    [Symbol('description')]: '平时喜欢做做瑜伽,人家有男朋友,你别指望了'
}

let info2 = {
    [Symbol('description')]: '这小姑娘挺好的,挺热情的,嘿嘿嘿……'
}

let target = {};
Object.assign(target, info1, info2);
1
2
3
4
5
6
7
8
9
10
11
12
13

avatar

es6一共有6种声明变量的方法

es6一共有6种声明变量的方法

var命令、function命令、let命令、const命令、import命令、class命令

全局对象windows, 变量由var定义则可用,由let定义无用

let命令

es6新增了let命令,用于声明变量。其用法类似于var,但是所声明的变量只在let命令所在的代码块内有效。

{
let a=10;
var b=1;
}
a//a is not defined
b//1
1
2
3
4
5
6

结果let声明的变量报错,var声明的变量返回正确值。

这表明,let声明的变量只在其所在的代码块有效。

for循环的计数器,就很适合使用let命令。

forlet i=0;i<arr.length;i++{
}
console.log(i)
referenceError
以上代码中的计数器i,只在for循环体内有效。
下面的代码如果使用var,最后输出10
var a=[]for(var i=0;i<10;i++)
{
a[i]=function(){
console.log(i)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

上面的代码中,变量i是var声明的,在全局范围内都有效。所以每一次循环,新的i值都会覆盖旧值,导致最后输出的是最后一轮的i值,

如果使用let,声明的变量就在块级作用域内有效,最后输出将是6

变量i是let声明。当前i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,于是最后输出6.

不存在变量提升

let不想var那样会发生“变量提升现象”。所以,变量一定要在声明后使用,否则报错,console.log(foo)

let foo=2

上面的代码在声明foo之前就使用这个变量,结果抛出一个错误

这也意味着typeof不再是一个百分之百安全的操作。

typeof x;

let x;

代码未声明,就会抛出referenceerror

暂时性死区

只要块级作用域内存在let命令,他所声明的变量就“绑定”(binding)这个区域,不再受外界的影响。

var tmp=2123iftrue{
tmp=‘abc’;
let tmp;}
1
2
3
4

上面的代码中存在全局变量tmp,但是块级作用域内let有声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错。

es6明确规定,如果区块中存在let和const命令,则这个区块对这些命令声明的变量从一开始就形成封闭作用域。只要在声明之前就使用这些变量,就会报错。

总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。

这在语法上称为“暂时性死区”。

在let命令声明变量tmp之前,都属于变量tmp的“死区”。

有些死区比较隐蔽。不太容易发现。

调用bar函数之所以报错。是因为参数x的默认值等于另一个参数y,而此时y还没有声明,属于死区。如果y的默认值是x就不会报错,因为此时x已声明。

es6规定暂时性死区和不存在变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为,这样的错误在es5中是很常见的,现在有了这种规定避免此类错误就很容易了。

总之,暂时性死区的本质就是只要一进入当前作用域,所要使用的变量就已存在,但是不可获取只有等到声明变量的哪一行代码出现,才可以获取和使用改变量。

不允许重复声明

let不允许在相同作用域内重复声明同一个变量。

块级作用域

为什么需要块级作用域

es5只有全局作用域和函数作用域,没有块级作用域,这带来了很多不合理的场景。

  1. 内层变量可能会覆盖外层变量

  2. 用来计数的循环变量泄露为全局变量

es6的块级作用域 let实际上为javascript新增了块级作用域

外层代码块不受内层代码块的影响。

es6允许块级作用域任意嵌套

内层作用域可以定义外层作用域的同名变量

块级作用域的出现,实际上使得获得广泛应用的立即执行匿名函数不再必要。

需要注意的是,如果在严格模式下,函数只能在顶层作用域和函数内声明,其他状况比如if代码块循环代码块下的声明都会报错。

Last Updated: 3/1/2019, 11:50:36 AM