1
+ <!DOCTYPE html>
2
+ < html >
3
+ < head >
4
+ < title > ES6引入的数据结构 - Javascript编程语言</ title >
5
+ < meta charset ="UTF-8 ">
6
+ < meta name ="baidu-site-verification " content ="LPyqUhB1p3 " />
7
+ < meta name ="viewport " content ="width=device-width ">
8
+ < meta http-equiv ="X-UA-Compatible " content ="IE=edge ">
9
+ < meta name ="description " content ="Javascript编程语言 - 一本开源的Javascript编程指南; An open-sourced Javascript Guide and Tutorial; ES6引入的数据结构 ES6新加入的数据类型有: WeakMap WeakSet Map Set Typed Objects1 Proxy2 Symbol3 Promise4 这些数据结构的支持并不广泛,在写这篇文章的时候。仅有新版本的Firefox和Node v0.11.x以上版本(开启--harmony参数后)支持。 Map 提供传统意义上的Map。支持任意对象作为key。 new Map ">
10
+ < meta name ="keywords " content ="Javascript, guide, open-sourced ">
11
+ < link rel ="stylesheet " type ="text/css " href ="/style.css " />
12
+ < script >
13
+ ( function ( i , s , o , g , r , a , m ) { i [ 'GoogleAnalyticsObject' ] = r ; i [ r ] = i [ r ] || function ( ) {
14
+ ( i [ r ] . q = i [ r ] . q || [ ] ) . push ( arguments ) } , i [ r ] . l = 1 * new Date ( ) ; a = s . createElement ( o ) ,
15
+ m = s . getElementsByTagName ( o ) [ 0 ] ; a . async = 1 ; a . src = g ; m . parentNode . insertBefore ( a , m )
16
+ } ) ( window , document , 'script' , '//www.google-analytics.com/analytics.js' , 'ga' ) ;
17
+
18
+ ga ( 'create' , 'UA-313435-11' , 'robinqu.me' ) ;
19
+ ga ( 'send' , 'pageview' ) ;
20
+
21
+ </ script >
22
+ </ head >
23
+ < body >
24
+ < header class ="clearfix ">
25
+ < div class ="left back-toc ">
26
+ < ul class ="inline-list ">
27
+ < li > < a href ="/ "> 目录</ a > </ li >
28
+
29
+ < li class ="seperator "> > </ li >
30
+ < li > JavaScript核心</ li >
31
+
32
+ < li class ="seperator "> > </ li >
33
+ < li > ECMAScript特性</ li >
34
+
35
+ < li class ="seperator "> > </ li >
36
+ < li > ECMAScript6</ li >
37
+
38
+
39
+ < li class ="seperator "> > </ li >
40
+ < li class ="current "> < strong > 当前页面</ strong > </ li >
41
+
42
+ < li > (< a href ="https://github.com/RobinQu/Programing-In-Javascript/edit/master/chapters/JavaScript_Core/ECMAScript/es6/es6_data_types.md "> 编辑</ a > )</ li >
43
+ </ ul >
44
+ </ div >
45
+ < div class ="right ">
46
+ < a href ="/ "> < img src ="/images/logo.png " alt ="Javascript编程语言 " width ="256 " height ="50 " /> </ a >
47
+ </ div >
48
+ </ header >
49
+ < div class ="primary ">
50
+ < h1 id ="es6- "> ES6引入的数据结构</ h1 >
51
+ < p > ES6新加入的数据类型有:</ p >
52
+ < ul >
53
+ < li > WeakMap</ li >
54
+ < li > WeakSet</ li >
55
+ < li > Map</ li >
56
+ < li > Set</ li >
57
+ < li > Typed Objects< sup id ="fnref1 "> < a href ="#fn1 "> 1</ a > </ sup > </ li >
58
+ < li > Proxy< sup id ="fnref2 "> < a href ="#fn2 "> 2</ a > </ sup > </ li >
59
+ < li > Symbol< sup id ="fnref3 "> < a href ="#fn3 "> 3</ a > </ sup > </ li >
60
+ < li > Promise< sup id ="fnref4 "> < a href ="#fn4 "> 4</ a > </ sup > </ li >
61
+ </ ul >
62
+ < p > 这些数据结构的支持并不广泛,在写这篇文章的时候。仅有新版本的Firefox和Node v0.11.x以上版本(开启< code > --harmony</ code > 参数后)支持。</ p >
63
+ < h2 id ="map "> Map</ h2 >
64
+ < p > 提供传统意义上的Map。支持任意对象作为key。</ p >
65
+ < p > < code > new Map(iterable)</ code > </ p >
66
+ < p > iteralbe是Array或其他可枚举的对象,其每个元素是key、value的2元数组。</ p >
67
+ < p > 重要的属性和方法:</ p >
68
+ < ul >
69
+ < li > Map.prototype.size</ li >
70
+ < li > Map.prototype.clear()</ li >
71
+ < li > Map.prototype.entries()</ li >
72
+ < li > Map.prototype.forEach(callback, thisArg)</ li >
73
+ < li > Map.prototype.get(k)</ li >
74
+ < li > Map.prototype.set(k,v)</ li >
75
+ < li > Map.prototype.has(k)</ li >
76
+ < li > Map.prototype.keys()</ li >
77
+ < li > Map.prototype.values()</ li >
78
+ </ ul >
79
+ < h2 id ="set "> Set</ h2 >
80
+ < p > 传统意义上的< code > Set</ code > 。</ p >
81
+ < ul >
82
+ < li > Set.prototype.size</ li >
83
+ < li > Set.prototype.add(v)</ li >
84
+ < li > Set.prototype.clear()</ li >
85
+ < li > Set.prototype.delete(v)</ li >
86
+ < li > Set.prototype.entries()</ li >
87
+ < li > Set.prototype.forEach(callback, thisArg)</ li >
88
+ < li > Set.prototype.has(v)</ li >
89
+ < li > Set.prototype.keys()</ li >
90
+ < li > Set.prototype.values()</ li >
91
+ </ ul >
92
+ < h2 id ="weakmap "> WeakMap</ h2 >
93
+ < p > Weak开头的Set和Map不对key持有引用,不影响GC。因此,他们没有办法对自身entries的key进行直接的枚举。</ p >
94
+ < p > 构造函数和普通的Map相同:</ p >
95
+ < p > < code > new WeakMap(iterable)</ code > </ p >
96
+ < ul >
97
+ < li > WeakMap.prototype.clear()</ li >
98
+ < li > WeakMap.prototype.delete(k)</ li >
99
+ < li > WeakMap.prototype.get(k)</ li >
100
+ < li > WeakMap.prototype.has(k)</ li >
101
+ < li > WeakMap.prototype.set(k,v)</ li >
102
+ </ ul >
103
+ < h2 id ="weakset "> WeakSet</ h2 >
104
+ < p > < code > new WeakSet(iterable)</ code > </ p >
105
+ < ul >
106
+ < li > WeakSet.prototype.add(v)</ li >
107
+ < li > WeakSet.prototype.clear()</ li >
108
+ < li > WeakSet.prototype.delete(v)</ li >
109
+ < li > WeakSet.prototype.has(v)</ li >
110
+ </ ul >
111
+ < h2 id ="typed-objects "> Typed Objects</ h2 >
112
+ < p > 类似Ruby的Struct的,但是目前没有任何引擎实现。</ p >
113
+ < h2 id ="proxy-objects "> Proxy Objects</ h2 >
114
+ < pre > < code > var proxy = Proxy(target, handler);
115
+ </ code > </ pre > < p > 将< code > target</ code > 的函数调用转向到< code > handler</ code > 之上。目前除了Firefox支持,没有其他任何JavaScript引擎支持。</ p >
116
+ < h2 id ="symbol "> Symbol</ h2 >
117
+ < p > 笔者还在理解中。目前新版的Chrome和node支持。</ p >
118
+ < h2 id ="prmoise "> Prmoise</ h2 >
119
+ < p > 原生版本的Promise API,有关Promise的内容,会在另外一篇文章内详细说明: < a href ="../../Functional_JavaScript/JavaScript_Promise.html "> JavaScript Promise</ a > 。</ p >
120
+ < h2 id ="proxy "> Proxy</ h2 >
121
+ < p > Proxy是JavaScript元编程的一道大门。JavaScript在语言层面无法去重载操作符,但是通过Proxy API,我们可以彻底的修改一个对象的各种行为。这种强大的行为已经在< code > node --harmony</ code > 和Firefox中支持了。</ p >
122
+ < p > 待补充。可以参考:</ p >
123
+ < ul >
124
+ < li > < a href ="http://www.slideshare.net/BrendanEich/metaprog-5303821 "> http://www.slideshare.net/BrendanEich/metaprog-5303821</ a > </ li >
125
+ < li > < a href ="http://soft.vub.ac.be/~tvcutsem/proxies/ "> http://soft.vub.ac.be/~tvcutsem/proxies/</ a > </ li >
126
+ < li > < a href ="http://ariya.ofilabs.com/2013/07/es6-and-proxy.html "> http://ariya.ofilabs.com/2013/07/es6-and-proxy.html</ a > </ li >
127
+ </ ul >
128
+ < hr >
129
+ < div class ="footnotes ">
130
+ < ol >
131
+ < li id ="fn1 "> < p > < a href ="http://wiki.ecmascript.org/doku.php?id=harmony:typed_objects "> http://wiki.ecmascript.org/doku.php?id=harmony:typed_objects</ a > </ p >
132
+ < a href ="#fnref1 " class ="footnoteBackLink " title ="Jump back to footnote 1 in the text. "> ↩</ a > </ li >
133
+ < li id ="fn2 "> < p > < a href ="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy "> https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy</ a > </ p >
134
+ < a href ="#fnref2 " class ="footnoteBackLink " title ="Jump back to footnote 2 in the text. "> ↩</ a > </ li >
135
+ < li id ="fn3 "> < p > < a href ="http://people.mozilla.org/~jorendorff/es6-draft.html#sec-symbol-constructor "> http://people.mozilla.org/~jorendorff/es6-draft.html#sec-symbol-constructor</ a > </ p >
136
+ < a href ="#fnref3 " class ="footnoteBackLink " title ="Jump back to footnote 3 in the text. "> ↩</ a > </ li >
137
+ < li id ="fn4 "> < p > < a href ="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise "> https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise</ a > </ p >
138
+ < a href ="#fnref4 " class ="footnoteBackLink " title ="Jump back to footnote 4 in the text. "> ↩</ a > </ li >
139
+ </ ol >
140
+ </ div >
141
+
142
+ </ div >
143
+ < footer class ="misc clearfix ">
144
+ < p class ="hint "> 建议在新版的Chrome、Safari、Firefox中阅读</ p >
145
+ < div class ="left ">
146
+ < ul class ="inline-list ">
147
+ < li > < a href ="https://github.com/RobinQu/Programing-In-Javascript/ "> Source</ a > </ li >
148
+ < li > < a href ="https://github.com/RobinQu/Programing-In-Javascript/blob/master/README.md "> Contributors</ a > </ li >
149
+ < li > < a href ="https://github.com/RobinQu/Programing-In-Javascript/issues "> Issues</ a > </ li >
150
+ </ ul >
151
+ </ div >
152
+ < div class ="right ">
153
+ < ul class ="inline-list ">
154
+ < li > Rev < a href ="https://github.com/RobinQu/Programing-In-Javascript/tree/f295f8e/chapters/JavaScript_Core/ECMAScript/es6/es6_data_types.md "> f295f8e</ a > </ li >
155
+ < li > 2014-05-22T02:11:03.469Z</ li >
156
+ </ ul >
157
+ </ div >
158
+ </ footer >
159
+ </ body >
160
+ </ html >
0 commit comments