数组解构基本语法
数据解构的语法和对象解构看起来类似,只是将对象字面量替换成了数组字面量,而且解构操作的是数组内部的位置(索引)而不是对象中的命名属性,例如:
|
|
如果只想取数组中的某一项,则可以不用命名。
|
|
解构表达式
你可以想要赋值的情况下使用数组的解构赋值表达式,但是和对象解构不同,没必要将它们包含在圆括号中,例如:
数组解构表达式有一个很常用的地方,就是交换两个变量的值。在以前一般定义一个第三方变量进行交换,例如下面的代码:
|
|
那么在ES6中完全可以抛弃第三方变量这种方式,使用我们的数组解构表达式
|
|
新的基本类型:Symbol
以前我们有5种基本数据类型:Number、String、Boolean、Null、Undefined
ES6新增了一种新的数据类型:Symbol
在ES5之前我们都没办法创建私有变量,只能想办法去封装。symbol 来创建私有成员,这也是 JavaScript 开发者长久以来期待的一项特性。
创建Symbol
Symbol在基本数据类型中是比较特别的。我们以前的都可以用字面量去创建基本数据类型的数据,但是Symbol却不可以使用字面量的是形式去创建。
我们可以使用symbol全局函数来创建Symbol。
说明:上面的代码中,firstName 作为 symbol 类型被创建并赋值给 person 对象以作其属性。每次访问这个属性时必须使用该 symbol 。
在创建Symbol的时候,也可以传入字符串,这个字符串也仅仅是在调试输出的时候方便,实际没有啥用处。
|
|
注意:任意两个Symbol都不会相等,即使创建他们的时候使用了相同的参数。
识别Symbol
既然 symbol 是基础类型,你可以使用 typeof 操作符来判断变量是否为 symbol 。ECMAScript 6 拓展了 typeof 使其操作 symbol 时返回 “symbol”。例如:
Symbol作为属性名
由于每一个Symbol值都是不相等的,这意味着Symbol值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。这对于一个对象由多个模块构成的情况非常有用,能防止某一个键被不小心改写或覆盖。
|
|
以上两种写法都是相同的结果
注意:
symbol作为对象的属性的时候,只能使用 [ ] 去访问,不能使用点去访问。
symbol作为对象的属性名使用的时候,该属性还是公开属性,不是私有属性。但是这个时候使用for… in和for…of时无法遍历到这个symbol属性的。
Symbol属性名的遍历
Symbol 作为属性名,该属性不会出现在for…in循环中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回。但是,它也不是私有属性,有一个Object.getOwnPropertySymbols方法,可以获取指定对象的所有 Symbol 属性名。
看下面的代码:
|
|
看下面的代码:
|
|
还有一个新API可以拿到所有类型的属性,包括常规和Symbol型的。
Reflect.ownKeys
|
|
说明:
由于以 Symbol 值作为名称的属性,不会被常规方法遍历得到。我们可以利用这个特性,为对象定义一些非私有的、但又希望只用于内部的方法。
Symbol.for(字符串)和Symbol.keyFor(symbol类型的值)
一、Symbol.for(字符串参数):在全局环境中搜索 以该字符串作为参数的Symbol值,如果搜到则返回这个sybol,如果搜不到则创建一个Symbol,并把它注册在全局环境中。
Symbol.for()和Symbol()都可以创建Symbol类型的数据。
二者区别:
Symbol.for()对同样的字符串,每次得到结果肯定是一样的。因为都是从全局环境中搜索。
Symbol()则不会有搜索的过程,每次都是一个全新的不同的symbol,而且也不会向全局环境中注册。
看下面的代码:
|
|
二、Symbol.keyFor(symbol):返回一个已经注册的symbol的”key”。
访客的ip和所在地址: 访问时间: 当前时间: