使用ES6新特性开发微信小程序(4)

Symbol Type

ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。它是JavaScript语言的第七种数据类型,前六种是:Undefined、Null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。

Symbol值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的Symbol类型。凡是属性名属于Symbol类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。

let s = Symbol();    
console.log(typeof s); // 输出: symbol

Iterators(迭代器)

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

Set、Map数据结构

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

ES6提供了Map数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object结构提供了“字符串—值”的对应,Map结构提供了“值—值”的对应,是一种更完善的Hash结构实现。如果你需要“键值对”的数据结构,Map比Object更合适。

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结构与Set类似,也是不重复的值的集合。但WeakSet只能存对象类型的元素,比如:Object, Array, Function 等。WeakSet中的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于WeakSet之中。有了弱引用的WeakSet, 就不用担心内存泄漏了。

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结构与Map结构基本类似,也是是键值对的集合。但WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名,而且键名所指向的对象,不计入垃圾回收机制。

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

Typed Arrays(类型化数组)

类型化数组(ArrayBuffer对象、TypedArray视图和DataView视图)是JavaScript操作二进制数据的一个接口。这些对象早就存在,属于独立的规格(2011年2月发布),ES6将它们纳入了ECMAScript规格,并且增加了新的方法。

类型化数组支持任意基于字节的数据结构,更方便的实现网络协议、加密算法、文件格式操作等功能。

ArrayBuffer是一段不透明的内存区域(所谓不透明,就是无法直接操作的数据块),单位是字节(Byte)也就是8位,它的byteLength属性返回其内存大小。

var a = new ArrayBuffer(10);    
console.log(a.byteLength); // 输出:10

在ArrayBuffer上,可以使用不同的视图来创建任意数量的类型化数组, 这些类型化数组也可以是重叠的。有八种不同的类型化数组(视图),分别为:

  • 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]}

如果一段数据包括多种类型,这时除了建立ArrayBuffer对象的复合视图以外,还可以通过DataView视图进行操作。

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

原文发布于微信公众号 - 极乐技术社区(wxapp-union)

原文发表时间:2016-12-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java、Spring、技术分享

fastjson详解

  fastjson用于将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。

95110
来自专栏C语言及其他语言

C语言网Online Judge系统支持语言和编译说明

Online Judge系统支持语言和编译情况: 语言编译器语言版本编译参数Cgcc 4.6.3C99gcc Main.c -o Main -Wall -lm ...

30780
来自专栏xingoo, 一个梦想做发明家的程序员

Oozie分布式工作流——EL表达式

oozie支持使用EL(expression language)表达式。 基本的EL常量 KB MB GB TB PB 基本EL函数 string fir...

27780
来自专栏小樱的经验随笔

POJ 3278 Catch That Cow(BFS,板子题)

Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submissions...

32150
来自专栏阿杜的世界

Java泛型基础(二)泛型接口泛型方法# 总结

泛型可以应用于同一个类,该类可以针对多种类型使用,例如构建一个RedisTemplateService组件,用于处理当前应用中所有对象的缓存操作。这篇文章主要介...

1.2K30
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础19(01)总结IO流,异常try…catch,throws,File类

1:异常(理解) (1)程序出现的不正常的情况。 (2)异常的体系 Throwable |--Error 严重问题,我们不处理。 |--Excepti...

43170
来自专栏10km的专栏

fastjson:javabean按字段(field)序列化存储为Map并反序列化

大部分json工具对java对象整体序列化都提供了简单的调用方式,以fastjson为例: Model model = new Model(); String ...

40750
来自专栏蓝天

java thrift返回List异常

运行时遇到如下异常,原因是由于hmget返回的List含有null成员,导致thrift编码时异常: 20160415 14:55:39 ERROR ...

14930
来自专栏函数式编程语言及工具

Scalaz(56)- scalaz-stream: fs2-安全运算,fs2 resource safety

    fs2在处理异常及资源使用安全方面也有比较大的改善。fs2 Stream可以有几种方式自行引发异常:直接以函数式方式用fail来引发异常、在纯代码里隐式...

21450
来自专栏IMWeb前端团队

ECMAScript 6 新特性总结

本文作者:IMWeb 张颖 原文出处:IMWeb社区 未经同意,禁止转载 前言 个人感觉ECMAScript 6总体上来说:添加了块级作用域,增加了一...

46560

扫码关注云+社区

领取腾讯云代金券