ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。它是JavaScript语言的第七种数据类型,前六种是:Undefined、Null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。
Symbol值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的Symbol类型。凡是属性名属于Symbol类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。
- let s = Symbol();
- console.log(typeof s); // 输出: symbol
ES6迭代器不是内建的,通过使用[Symbol.iterator]()和.next()来进行创建。Iterators(迭代器)是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。
Iterator的作用:
- 为各种数据结构,提供一个统一的、简便的访问接口;
- 使得数据结构的成员能够按某种次序排列;
- ES6创造了一种新的遍历命令for...of循环,Iterator接口主要供for...of消费。
- function f() {
- let fibonacci = {
- [Symbol.iterator]() {
- let pre = 0,
- cur = 1;
- return {
- next() {
- [pre, cur] = [cur, pre + cur];
- return { done: false, value: cur };
- }
- };
- }
- };
- for (let n of fibonacci) {
- if (n > 1000)
- break;
- console.log(n);
- }
- }
- f(); // 输出: 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
ES6提供了新的数据结构Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
Set本身是一个构造函数,用来生成Set数据结构。
- let s = new Set();
- s.add("hello").add("goodbye").add("hello");
- s.size === 2;
- s.has("hello") === true;
- for (let key of s.values())
- console.log(key) // 输出: hello goodbye
- let m = new Map();
- m.set("hello", 42);
- m.set(s, 34);
- m.get(s) === 34;
- m.size === 2;
- for (let [key, val] of m.entries())
- console.log(key + " = " + val); // 输出: hello = 42 [object Set] = 34
WeakSet对象的方法只有三个,WeakMap没有size属性:
- add(): 向集添加新元素。
- delete(): 从集中移除指定元素。
- has(): 如果集包含指定的元素,则返回 true。
- var ws = new WeakSet();
- var str = new String("Hello");
- var num = new Number(1776);
- ws.add(str);
- ws.add(num);
- console.log(ws.has(str)); // 输出: true
- console.log(ws.has(num)); // 输出: true
- ws.delete(str);
- console.log(ws.has(str)); // 输出: false
WeakMap对象的方法,WeakMap没有size属性,WeakMap对象不能枚举:
- clear():从 WeakMap 中移除所有元素。
- delete(): 从 WeakMap 中移除指定的元素。
- get(): 从 WeakMap 中返回指定的元素。
- has(): 如果 WeakMap 包含指定元素,则返回 true。
- set(): 添加新元素至 WeakMap。
- toString():返回 WeakMap 的字符串表示形式。
- valueOf():返回指定对象的原始值。
- var dog = {
- breed: "yorkie"
- }
- var cat = {
- breed: "burmese"
- }
- var wm = new WeakMap();
- wm.set(dog, "fido");
- wm.set(cat, "pepper");
- console.log(wm.get(dog) + ": " + dog.breed); // 输出: fido: yorkie
- console.log(wm.get(cat) + ": " + cat.breed); // 输出: pepper: burmese
类型化数组(ArrayBuffer对象、TypedArray视图和DataView视图)是JavaScript操作二进制数据的一个接口。这些对象早就存在,属于独立的规格(2011年2月发布),ES6将它们纳入了ECMAScript规格,并且增加了新的方法。
类型化数组支持任意基于字节的数据结构,更方便的实现网络协议、加密算法、文件格式操作等功能。
ArrayBuffer是一段不透明的内存区域(所谓不透明,就是无法直接操作的数据块),单位是字节(Byte)也就是8位,它的byteLength属性返回其内存大小。
- var a = new ArrayBuffer(10);
- console.log(a.byteLength); // 输出:10
- Int8Array: 1个字节,8位二进制带符号整数 -2^7~(2^7) - 1
- Uint8Array: 1个字节,8位无符号整数 0~(2^8) - 1
- Int16Array: 2个字节,16位二进制带符号整数 -2^15~(2^15)-1
- Uint16Array: 2个字节,16位无符号整数 0~(2^16) - 1
- Int32Array: 4个字节,32位二进制带符号整数 -2^31~(2^31)-1
- Uint32Array: 4个字节,32位无符号整数 0~(2^32) - 1
- Float32Array: 4个字节,32位IEEE浮点数
- Float64Array: 8个字节,64位IEEE浮点数
- let typedArray = new Uint8Array([0, 1, 2]);
- console.log(typedArray.length); // 输出: 3
- typedArray[0] = 5;
- let normalArray = [...typedArray];
- console.log(normalArray); // 输出: [5,1,2]
- class Example {
- constructor(buffer = new ArrayBuffer(24)) {
- this.buffer = buffer;
- }
- set buffer(buffer) {
- this._buffer = buffer;
- this._id = new Uint32Array(this._buffer, 0, 1);
- this._username = new Uint8Array(this._buffer, 4, 16);
- this._amountDue = new Float32Array(this._buffer, 20, 1);
- }
- get buffer() {
- return this._buffer;
- }
- set id(v) {
- this._id[0] = v;
- }
- get id() {
- return this._id[0];
- }
- set username(v) {
- this._username[0] = v;
- }
- get username() {
- return this._username[0];
- }
- set amountDue(v) {
- this._amountDue[0] = v;
- }
- get amountDue() {
- return this._amountDue[0]
- }
- }
- let example = new Example();
- example.id = 7;
- example.username = "John Doe";
- example.amountDue = 42.0;
- console.log(example); // 输出: Example {_buffer: ArrayBuffer, _id: Uint32Array[1], _username: Uint8Array[16], _amountDue: Float32Array[1]}
DataView视图提供更多操作选项,而且支持设定字节序。
DataView本身也是构造函数,接受一个ArrayBuffer对象作为参数,生成视图。
- let typedArray2 = new Uint8Array([1, 4, 9, 25, 36, 49, 64, 81]);
- let dataView = new DataView(typedArray2.buffer);
- console.log(dataView.getUint8(5)); // 输出: 49