ES6知识点(三)

2016-11-09 wilsonIs 更多博文 » 博客 » GitHub »

原文链接 https://wilsonis.github.io/blog/posts/es6_3
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


七、新增原始数据类型Symbol

ES6中引入了一种新的原始数据类型Symbol,表示独一无二的值,它是javascript语言的第七种数据类型。其它六种分别是Undefined,Null,Boolean,String,Number,Object.

1. Symbol的意义

Symbol的作用是保证每一个对象的属性名都是独一无二的,从根本上防止属性名的冲突。

Symbol值通过Symbol函数生成,凡是属性名属于Symbol类型的,都是独一无二的。Symbol通过Symbol函数生成,但不能使用new命令生成,因为生成的Symbol是一个原始类型的值,不是对象。

let s = Symbol();

typeof s; //"symbol"

也就是说,ES6中对象的属性名可以有两种类型,一种是原先的字符串形式,另一种就是新增的Symbol类型。Symbol函数可以传入一个字符串参数,表示对该Symbol实例的描述,以示区分不同的实例。

Symbol值不能参与计算,不能进行字符串拼接,但可以通过调用toString方法显示转为字符串,除此之外,Symbol值只可以转为布尔值。

2. Symbol的使用

Symbol作为属性名的使用方法有如下三种:

var mySymbol = Symbol();

// 第一种写法
var a = {};
a[mySymbol] = 'Hello!';

// 第二种写法
var a = {
  [mySymbol]: 'Hello!'
};

// 第三种写法
var a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });

// 以上写法都得到同样结果
a[mySymbol] // "Hello!"

Symbol值作为对象属性名时,不能使用点运算符,只能放在方括号中。

3. Symbol的遍历

Symbol作为属性名,不会出现在for...in,for...of遍历中,但可以通过Object.getOwnPropertySymbols方法来获取制定对象的Symbol属性名,返回的是包含所有Symbol值的数组。

4. Symbol的内置方法

Symbol有11种内置方法,这里不一一讲述了,啥时候能用到了再叙述。

八、Set和Map数据结构

Set数据结构类似于数组,它的成员的值都是唯一的,没有重复值,Set本身是一个构造函数,用来生成数据结构。

var s = new Set();

[2, 3, 5, 4, 5, 2, 2].map(x => s.add(x));

for (let i of s) {
  console.log(i);
}
// 2 3 5 4

1. Set的属性和方法

Set结构的实例有以下属性。

Set.prototype.constructor:构造函数,默认就是Set函数。
Set.prototype.size:返回Set实例的成员总数。

Set实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)。下面先介绍四个操作方法。

add(value):添加某个值,返回Set结构本身。
delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
has(value):返回一个布尔值,表示该值是否为Set的成员。
clear():清除所有成员,没有返回值。

Set结构的实例有四个遍历方法,可以用于遍历成员。

keys():返回键名的遍历器
values():返回键值的遍历器
entries():返回键值对的遍历器
forEach():使用回调函数遍历每个成员

2. Map数据结构

Map结构的键不限于字符串,各种类型的值都可以当做键。

var m = new Map([
  [true, 'foo'],
  ['true', 'bar']
]);

m.get(true) // 'foo'
m.get('true') // 'bar'

Map结构的实例有以下属性和操作方法。

属性:

  • size属性返回Map结构的成员总数。

  • set(key, value):set方法设置key所对应的键值,然后返回整个Map结构。如果key已经有值,则键值会被更新,否则就新生成该键。set方法返回的是Map本身,因此可以采用链式写法。

  • get(key):get方法读取key对应的键值,如果找不到key,返回undefined。

  • has(key):has方法返回一个布尔值,表示某个键是否在Map数据结构中。

  • delete(key):delete方法删除某个键,返回true。如果删除失败,返回false。

  • clear():clear方法清除所有成员,没有返回值。

遍历方法

Map原生提供三个遍历器生成函数和一个遍历方法。

keys():返回键名的遍历器。
values():返回键值的遍历器。
entries():返回所有成员的遍历器。
forEach():遍历Map的所有成员。