SlideShare a Scribd company logo
Submit Search
Upload
8. 常用標準API
Report
Share
Justin Lin
Technology / Community Evangelist at Free lancer
Follow
•
0 likes
•
573 views
1
of
105
8. 常用標準API
•
0 likes
•
573 views
Report
Share
Download Now
Download to read offline
Technology
陣列的操作 Set、Map與ArrayBuffer 物件與JSON的轉換 規則表示式
Read more
Justin Lin
Technology / Community Evangelist at Free lancer
Follow
Recommended
Java SE 8 技術手冊第 9 章 - Collection與Map by
Java SE 8 技術手冊第 9 章 - Collection與Map
Justin Lin
4.9K views
•
81 slides
Collection與Map by
Collection與Map
Justin Lin
577 views
•
100 slides
資料結構 by
資料結構
Justin Lin
1.8K views
•
62 slides
Java SE 8 技術手冊第 4 章 - 認識物件 by
Java SE 8 技術手冊第 4 章 - 認識物件
Justin Lin
4.2K views
•
91 slides
Java SE 7 技術手冊投影片第 09 章 - Collection與Map by
Java SE 7 技術手冊投影片第 09 章 - Collection與Map
Justin Lin
2.5K views
•
68 slides
Java SE 8 技術手冊第 17 章 - 反射與類別載入器 by
Java SE 8 技術手冊第 17 章 - 反射與類別載入器
Justin Lin
2.3K views
•
50 slides
More Related Content
What's hot
9. 資料結構 by
9. 資料結構
Justin Lin
292 views
•
73 slides
進階主題 by
進階主題
Justin Lin
3K views
•
61 slides
Java SE 8 技術手冊第 10 章 - 輸入輸出 by
Java SE 8 技術手冊第 10 章 - 輸入輸出
Justin Lin
2.6K views
•
48 slides
Java SE 7 技術手冊投影片第 12 章 - 通用API by
Java SE 7 技術手冊投影片第 12 章 - 通用API
Justin Lin
2.2K views
•
126 slides
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫 by
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Justin Lin
2.1K views
•
100 slides
CH04:認識物件 by
CH04:認識物件
Justin Lin
421 views
•
87 slides
What's hot
(16)
9. 資料結構 by Justin Lin
9. 資料結構
Justin Lin
•
292 views
進階主題 by Justin Lin
進階主題
Justin Lin
•
3K views
Java SE 8 技術手冊第 10 章 - 輸入輸出 by Justin Lin
Java SE 8 技術手冊第 10 章 - 輸入輸出
Justin Lin
•
2.6K views
Java SE 7 技術手冊投影片第 12 章 - 通用API by Justin Lin
Java SE 7 技術手冊投影片第 12 章 - 通用API
Justin Lin
•
2.2K views
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫 by Justin Lin
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Justin Lin
•
2.1K views
CH04:認識物件 by Justin Lin
CH04:認識物件
Justin Lin
•
421 views
5. 建構式、原型與類別 by Justin Lin
5. 建構式、原型與類別
Justin Lin
•
205 views
Power shell – object 篇 by LearningTech
Power shell – object 篇
LearningTech
•
316 views
4. 使用物件 by Justin Lin
4. 使用物件
Justin Lin
•
174 views
Java SE 8 技術手冊第 2 章 - 從JDK到IDE by Justin Lin
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Justin Lin
•
5.3K views
Java SE 8 技術手冊第 5 章 - 物件封裝 by Justin Lin
Java SE 8 技術手冊第 5 章 - 物件封裝
Justin Lin
•
3.4K views
Java SE 8 技術手冊第 3 章 - 基礎語法 by Justin Lin
Java SE 8 技術手冊第 3 章 - 基礎語法
Justin Lin
•
5.3K views
My scala learning note for TWJUG by Ian Tsai
My scala learning note for TWJUG
Ian Tsai
•
1.3K views
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器 by Justin Lin
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Justin Lin
•
1.9K views
Java - TA課 - Array by Redhung @ Nationtal Chung Cheng University, Chiayi, Taiwan.
Java - TA課 - Array
Redhung @ Nationtal Chung Cheng University, Chiayi, Taiwan.
•
326 views
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2 by Justin Lin
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2
Justin Lin
•
5.6K views
More from Justin Lin
Ch14 簡介 Spring Boot by
Ch14 簡介 Spring Boot
Justin Lin
872 views
•
22 slides
Ch13 整合 Spring MVC/Security by
Ch13 整合 Spring MVC/Security
Justin Lin
280 views
•
58 slides
Ch12 Spring 起步走 by
Ch12 Spring 起步走
Justin Lin
274 views
•
31 slides
Ch11 簡介 JavaMail by
Ch11 簡介 JavaMail
Justin Lin
157 views
•
8 slides
Ch10 Web 容器安全管理 by
Ch10 Web 容器安全管理
Justin Lin
153 views
•
30 slides
Ch09 整合資料庫 by
Ch09 整合資料庫
Justin Lin
233 views
•
92 slides
More from Justin Lin
(20)
Ch14 簡介 Spring Boot by Justin Lin
Ch14 簡介 Spring Boot
Justin Lin
•
872 views
Ch13 整合 Spring MVC/Security by Justin Lin
Ch13 整合 Spring MVC/Security
Justin Lin
•
280 views
Ch12 Spring 起步走 by Justin Lin
Ch12 Spring 起步走
Justin Lin
•
274 views
Ch11 簡介 JavaMail by Justin Lin
Ch11 簡介 JavaMail
Justin Lin
•
157 views
Ch10 Web 容器安全管理 by Justin Lin
Ch10 Web 容器安全管理
Justin Lin
•
153 views
Ch09 整合資料庫 by Justin Lin
Ch09 整合資料庫
Justin Lin
•
233 views
Ch08 自訂標籤 by Justin Lin
Ch08 自訂標籤
Justin Lin
•
133 views
Ch07 使用 JSTL by Justin Lin
Ch07 使用 JSTL
Justin Lin
•
161 views
Ch06 使用 JSP by Justin Lin
Ch06 使用 JSP
Justin Lin
•
250 views
Ch05 Servlet 進階 API、過濾器與傾聽器 by Justin Lin
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
•
204 views
Ch04 會話管理 by Justin Lin
Ch04 會話管理
Justin Lin
•
238 views
Ch03 請求與回應 by Justin Lin
Ch03 請求與回應
Justin Lin
•
236 views
Ch02 撰寫與設定 Servlet by Justin Lin
Ch02 撰寫與設定 Servlet
Justin Lin
•
352 views
CH1. 簡介 Web 應用程式 by Justin Lin
CH1. 簡介 Web 應用程式
Justin Lin
•
1.2K views
14. 進階主題 by Justin Lin
14. 進階主題
Justin Lin
•
406 views
13.並行、平行與非同步 by Justin Lin
13.並行、平行與非同步
Justin Lin
•
238 views
12. 除錯、測試與效能 by Justin Lin
12. 除錯、測試與效能
Justin Lin
•
153 views
11. 常用內建模組 by Justin Lin
11. 常用內建模組
Justin Lin
•
149 views
10. 資料永續與交換 by Justin Lin
10. 資料永續與交換
Justin Lin
•
156 views
8. open() 與 io 模組 by Justin Lin
8. open() 與 io 模組
Justin Lin
•
245 views
8. 常用標準API
2.
8.常用標準API • 學習目標 – 陣列的操作 –
Set、Map與ArrayBuffer – 物件與JSON的轉換 – 規則表示式 2
3.
Array.isArray() • 判斷是否為原生的「真」陣列 3
4.
• 使用類別語法繼承Array,子類別實例會 被Array.isArray()判斷為true 4
5.
Array.of() • 取代Array建構式 5
6.
• 不建議使用Array建構式指定元素來建立 陣列 6
7.
• 使用類別語法繼承Array,透過子類別的 of()方法建立之物件,也會是子類別型態 7
8.
Array.from() • 接受類陣列或可迭代物件 8
9.
• 使用類別語法繼承Array,透過子類別的 from()方法建立之物件,會是子類別型態 9
10.
改變陣列 • sort()方法傳回值是原陣列,主要是為了 可以支援方法鏈連續操作風格 • reverse()方法是原地反轉陣列後傳回原 陣列 10
11.
• 如果要用某值填滿陣列 • 建立類陣列物件時 11
12.
實現堆疊 12
13.
13
14.
• Array沒有提供附加陣列的方法,不過可 以透過push()來實現 14
15.
實現佇列 15
16.
16
17.
• Array.prototype定義的方法,都具有通用 性,可以對普通的物件進行操作 • 操作結果會令指定的物件成為類陣列 17
18.
函數式風格API • 若說JavaScript令函數式程式設計的概念, 得以在開發者間耳熟能詳也不為過 18
19.
• indexOf()、lastIndexOf()、 includes()在比對元素時,使用的是=== • 應該避免在陣列中存放NaN 19
20.
• 純函數式程式語言不提供迴圈語法 20
21.
• 在純函數式典範中,沒有變數的概念,也 不能改變物件或資料結構的狀態 21
22.
遞迴 • 思考邊界條件為何 • 一次做一件事 •
別管上層遞迴或下層遞迴的狀態 22
23.
• JavaScript支援一級函式,若有個重複性任 務,有對應的方法在不使用迴圈、不改變 物件狀態的情況下完成需求,該方法可以 說具有函數式設計的概念 23
24.
24
25.
• reduce()方法是從左而右迭代元素 • 如果需要從右而左迭代元素,可以使用 reduceRight() 25
26.
• reduce、reduceRight名稱本身很抽象, 建議封裝在擁有具體名稱的函式之中 26
27.
Set與WeakSet • 若不想收集重複的值 27
28.
• Set本身是無序,不具備索引 28
29.
• SameValueZero演算,相等比較採用===, 然而0等於-0,NaN等於NaN 29
30.
• WeakSet只能加入物件 • 只要物件沒有其他名稱參考著,就會回收 物件 •
用來避免記憶體洩漏(Memory leak) 30
31.
Map與WeakMap • 物件的鍵只能是字串(ES6以後可使用 Symbol) 31
32.
• Map的鍵可以使用基本型態、undefined、 NaN、null與物件 • Map對鍵的唯一性採用的是 SameValueZero演算 32
33.
33
34.
• 建構Map時,可以使用可迭代物件 • ES10新增了Object.fromEntries() 34
35.
• WeakMap只能使用物件作為鍵 • 只要物件沒有其他名稱參考,就會回收物件 •
避免記憶體洩漏 35
36.
36
37.
37
38.
ArrayBuffer • 儲存二進位資料 • 要改變或取得ArrayBuffer內容,方式之 一是透過TypedArray包裹ArrayBuffer 38
39.
39
40.
• 在不同的TypedArray型態下,每個元素的 位元組長度不同 40
41.
• TypedArray是以元素為單位 41
42.
• 建構TypedArray型態的實例時,也可以使 用類陣列物件 • TypedArray對待ArrayBuffer是採整體 觀點,也就是對待各元素的觀點是一致的 42
43.
• 如果想對ArrayBuffer的各個區段採用不 同觀點 43
44.
JSON • 是個資料格式,由於易讀、易寫、易於剖 析、可表現階層性資料 • 現今是各應用程式間常用的資料交換格式 •
參考JavaScript物件實字與陣列實字語法而 制定 44
45.
• 全名JavaScript Object
Notation • Douglas Crockford在2000年初設計 • 2013年在ECMA-404與RFC 7158標準化 – ECMA-404主要是規範語法 – RFC涵蓋了一些安全與資料交換上的考量 • 2017年發佈了JSON新版規範ECMA-404第 二版與RFC 8259 – 最大的差異是規範非封閉系統間交換資料時, 必須使用UTF-8 45
46.
• www.json.org • JSON主要有兩種結構 –
名稱/值成對的資料 – 有序的值清單 46
47.
• 名稱必須用""雙引號包括。 • 值可以是""雙引號包括的文字,或者是數字、 true、false、null、JavaScript陣列或 子JSON格式。 47
48.
• 在網路上傳輸JSON資料時,常會去除不必 要的空白、縮排等,以節省流量開銷 • 有序清單形式,也是合法的JSON格式 48
49.
• ES5內建JSON作為JSON API名稱空間 –
JSON.stringify() – JSON.parse() 49
50.
• JSON.stringify()會遞迴地走訪可列舉 特性進行JSON格式轉換,然而不包含符號 50
51.
51 • 指定特性轉換JSON字串
52.
• 若想考量JSON格式的可讀性 52
53.
• JSON.stringify()會使用toJSON() 53
54.
• 想將JSON字串剖析為JavaScript物件 54
55.
規則表示式 • 根據某字串切割 • 任意數字呢? 55
56.
• /regex/規則表示式實字(Regular expression literal) •
也可以用new來建立RegExp實例 • 別把規則表示式與字串搞混了 • 規則表示式是一套語言,在JavaScript中可 以使用字串來表示規則表示式 56
57.
簡介規則表示式 • 字面字元(Literals) – 按照字面意義比對的字元 –
例如Orz • 詮譯字元(Metacharacters) – 不按照字面比對,在不同情境會有不同意義 – 例如[^Orz] – 理解詮譯字元在不同情境中想詮譯的概念,對 於規則表示式的閱讀非常重要 57
58.
字元表示 • 字母和數字在規則表示式中,都是按照字 面意義比對 • 有些字元之前加上了之後,會被當作詮譯 字元 58
59.
59
60.
• 詮譯字元在規則表示式中有特殊意義,例 如! $
^ * ( ) + = { } [ ] | : . ?等,若要比對 這些字元,必須加上轉譯符號 • 要比對!,則必須使用!,要比對$字元,則 必須使用$ 60
61.
• 規則表示式為XY,那麼表示比對「X之後要 跟隨著Y」 • 如果想表示「X或Y」,可以使用X|Y •
如果有多個字元要以「或」的方式表示, 例如「X或Y或Z」,可以使用字元類表示為 [XYZ] 61
62.
字元類 62
63.
預定義字元類 • 有些字元類很常用,例如[0-9]撰寫為d 更為方便 63
64.
貪婪量詞 • dddd-dddddd更簡單的寫法 是d{4}-d{6} 64
65.
• 貪婪量詞會儘可能地找出最長的符合文字 – 文字xfooxxxxxxfoo,若使用規則表示 式.*foo比對 –
比對器會先吃掉整個xfooxxxxxxfoo,在吐出 foo後符合了foo,而剩下的xfooxxxxxx符合.* – 最後得到的符合字串就是整個xfooxxxxxxfoo 65
66.
逐步量詞 • 在貪婪量詞表示法後加上? • 比對器看到逐步量詞時,會一邊吃掉剩餘 文字,一邊看看吃下的文字是否符合規則 表示式 •
逐步量詞會儘可能地找出長度最短的符合 文字 66
67.
• 文字xfooxxxxxxfoo若用規則表示式.*?foo比 對 – 比對器在吃掉xfoo後發現符合*?foo,接著繼 續吃掉xxxxxxfoo發現符合 –
xfoo與xxxxxxfoo都符合規則表示式 67
68.
邊界比對 • 想依當中單字dog切出前後兩個子字串? 68
69.
69
70.
分組與參考 • 使用()為規則表示式分組 – 作為子規則表示式 –
搭配量詞使用 – 若有字串符合了規則表示式分組,字串會被捕 捉(Capture) 70
71.
回頭參考(Back reference) • 分組計數((A)(B(C))) 1.
((A)(B(C))) 2. (A) 3. (B(C)) 4. (C) • 回頭參考分組時,是在後加上分組計數, 表示參考第幾個分組的比對結果 71
72.
• dd要求比對兩個數字 • (dd)1表示要輸入四個數字,輸入的前 兩個數字與後兩個數字必須相同 •
輸入1212會符合 • 輸入1234則不符合 72
73.
• ["'][^"']*["']比對單引號或雙引號中 0或多個字元,但沒有比對兩個都要是單引 號或雙引號 • (["'])[^"']*1則比對出前後引號必須 一致 73
74.
擴充標記 • (?…) • 使用(?:…)來表示不捕捉分組 –
若只想比對郵件位址格式,不打算捕捉分組, 可以使用^[a-zA-Z]+d*@(?:[a-zA-Z0- 9]+.)+com • 使用(?<name>…)來為分組命名,在同一 個規則表示式中使用k<name>取用分組 – (?<tens>dd)k<tens> 74
75.
• 如果想比對出的對象,之後必須跟隨或沒 有跟隨著特定文字,可以使用(?=…)或 (?!…) – 分別稱為Lookahead與Negative
lookahead 75
76.
• 如果想比對出的對象,前面必須有或沒有 著特定文字,可以使用(?<=…)或(?<!…) – 分別稱為Lookbehind與Negative
lookbehind 76
77.
search()、replace() 77
78.
• 黏性匹配的例子: • 使用$n來捕捉被分組匹配的文字 78
79.
• 也可以改用函式: • 指定命名時是使用$<name>的形式 79
80.
match() 80
81.
matchAll() 81
82.
使用RegExp • 若必須動態地、依需求建立最後的規則表 示式,可以使用字串方式來組合 82
83.
• 可以在第二個參數處指定旗標 83
84.
操作RegExp方法 • 搜尋、測試字串中是否有符合規則表示式 的子字串 84
85.
• RegExp實例狀態是可變的(Mutable) • 若規則表示式被設置了全域旗標,RegExp 實例的lastIndex就會有作用 85
86.
• RegExp有個exec()方法,用來比對字串, 如果有符合的字串,會傳回一個陣列 • 如果分組使用了(?:...)就不會捕捉,傳 回的陣列中也就不會有該分組的值 86
87.
87
88.
• 如果加上了全域旗標,每呼叫一次exec(), 傳回的陣列會是當次符合的結果,最後沒 有符合結果時傳回null 88
89.
89
90.
規則表示式協定 • String有split()、search()、 replace()、match()以及ES11以後新增 了matchAll()方法 • RegExp也有定義有這些方法,不過是以符 號Symbol.split、Symbol.search、 Symbol.replace、Symbol.match定義, ES11後還多了個Symbol.matchAll 90
91.
91
92.
• 切割、搜尋等與規則表示式相關的職責, 集中在RegExp上了 • String的split()、search()等方法, 會將比對的工作委託給RegExp實例上對應 的協定 •
必要時可以繼承RegExp來重新定義相關的 方法,修正或增強String的split()、 search()等方法的功能 92
93.
93
94.
Unicode規則表示式 • 在規則表示式中,uhhhh是以四位數十六 進位數字指定「碼元」(而不是碼點) • 如果字元在U+0000至U+FFFF以內,例如 「林」的碼點U+6797 •
規則表示式比對時可以使用u6797來指定 94
95.
• 有些字元超出了U+0000至U+FFFF以外 • JavaScript對Unicode規則表示式,從ES6 開始逐步支援,想運用的話,必須開啟u旗 標採用Unicode模式 95
96.
Unicode模式 • 若要在規則表示式使用u{…},必須開啟u 旗標 • 在啟用Unicode模式的情況下,既有的 uhhhh寫法就是指定「碼點」 96
97.
• 啟用Unicode模式後,對於0xFFFF以外的 字元,才會進行正確的辨識,這會影響預 定義字元類、量詞等的判斷 • 未啟用Unicode模式前,預定義字元類S 表示非空白字元,然而,對0xFFFF以外的 字元會誤判 •
只有在加上u旗標的情況下才會正確比對; • W、「.」也只有在啟用Unicode模式下, 才能正確比對0xFFFF以外的字元 97
98.
98
99.
Unicode特性轉譯 • ES9以後支援規則表示式的Unicode特性轉 譯(Unicode property
escapes) • 必須認識Unicode規範中的分類 (Category)、文字(Script) 99
100.
• 每個Unicode字元會隸屬於某個分類 – Letter、Uppercase
Letter等一般分類 – 每個分類也給予了L、Lu等縮寫名稱。 • 隸屬於Letter分類的字元都是字母,a到z、 A到Z、全形的a到z、A到Z都在Letter 分類中 • 其他如希臘字母α、β、γ等,也都隸屬於 Letter分類。 100
101.
• 開啟Unicode模式,可以使用 p{General_Category=Letter}、 p{gc=Letter}、p{Letter}、p{L} 等方式來指定分類 101
102.
102
103.
• Unicode將希臘文、漢字等組織為文字 (Script)特性 • 如果想在規則表示式中以文字特性比對, 可以使用p{Script=Greek}、 p{Script_Extensions=Greek}、 p{sc=Han}、p{scx=Han}的寫法 •
(Han包含了正體中文、簡體中文,以及日、 韓、越南文的全部漢字) 103
104.
104
105.
• 二元特性 105