Array
Array 物件是 JavaScript 提供「陣列」資料結構的解決方案。雖然採行這樣的方式,只能建立一維陣列,但還是可以對陣列產生陣列的方式,來實現多維陣列的設計。
at(索引) | 取得第幾筆資料,可用負數表示尾端資料。 |
concat(元素1,元素2,…) | 將其它陣列或資料加入陣列。 |
entries() | 取得索引和資料。 |
fill(資料,[開始位置,結束位置]) | 填滿資料。 |
includes(資料) | 檢查是否有資料。 |
indexOf(資料) | 搜尋資料位置。 |
join(符號) | 以符號為區隔,輸出陣列資料。參數省略的話預設為 , 逗號。 |
keys() | 取得所有索引編號。 |
lastIndexOf(資料) | 從陣列結尾搜尋資料位置。 |
length | 取得資料的筆數。 |
pop() | 移除最後一筆資料。 |
push(資料1,資料2,…) | 在陣列末端加入新的資料。 |
reverse() | 顛倒陣列資料的排列順序。 |
shift() | 移除第一筆資料。 |
slice(開始位置[,結束位置]) | 傳回擷取範圍內的資料,可用負數表示尾端資料。 |
sort() | 進行排序。 |
splice(位置,數量,資料) | 隨參數不同,進行移除、插入、取代資料不同動作。 |
toReversed() | 傳回顛倒順序的陣列資料。 |
toSorted() | 傳回排序的陣列資料。 |
toSpliced(位置,數量,資料) | 傳回 splice 過的資料。 |
unshift(資料1,資料2,…) | 在陣列開頭加入新的資料。 |
values() | 傳回所有資料。 |
Array.isArray(陣列) | 檢查是否為陣列。 |
Array.of(資料,資料,…) | 將所有參數資料匯集成陣列。 |
Array.from(資料) | 將傳入的一筆資料解析為陣列資料。 |
這裡只列出操作陣列物件的功能,並未列出 ECMAScript 5 以後追加的一系列函數式設計功能!因為這些功能很難說明,要看範例才知道在做什麼,所以請進一步看 MDN 的文件,熟悉這些能提升資料結構與演算法的開發效率。
Audio and Video
對應 HTML5 的 Audio 和 Video 標籤,兩者使用一樣的 API 來控制播放音樂和影片的功能。
addTextTrack(類型,標題,語言) | 向影音添加新的字軌,類型有:subtitles、caption、descriptions、chapters、metadata。 |
audioTracks | 表示可用音軌的 AudioTrackList 物件。 |
autoplay | 是否在加載完成後隨即播放影音。 |
buffered | 表示影音已緩衝部分的 TimeRanges 物件。 |
canPlayType(類型) | 檢查瀏覽器是否能播放指定的影音類型,類型有:video/ogg、video/mp4、video/webm、audio/mpeg、audio/ogg、audio/mp4。 |
controller | 表示影音當前媒體控制器的 MediaController 物件。 |
controls | 影音是否顯示控制項。 |
crossOrigin | 影音的 CORS 設定。 |
currentSrc | 當前影音的 URL。 |
currentTime | 影音中的當前播放位置,以秒計。 |
defaultMuted | 影音默認是否靜音。 |
defaultPlaybackRate | 影音的默認播放速度。 |
duration | 當前影音的長度,以秒計。 |
ended | 影音的播放是否已結束。 |
error | 表示影音錯誤狀態的 MediaError 物件。 |
load() | 重新加載影音元素。 |
loop | 影音是否應在結束時重新播放。 |
mediaGroup | 影音所屬的組合,用於連接多個影音元素。 |
muted | 影音是否靜音。 |
networkState | 影音的當前網絡狀態。 |
paused | 影音是否暫停。 |
pause() | 暫停當前播放的影音。 |
play() | 開始播放影音。 |
playbackRate | 影音播放的速度。 |
played | 表示影音已播放部分的 TimeRanges 物件。 |
preload | 影音是否應該在頁面加載後進行加載。(通常用 auto) |
readyState | 影音當前的就緒狀態。 |
seekable | 表示影音可尋址部分的 TimeRanges 物件。 |
seeking | 用戶是否正在影音中進行查找。 |
src | 影音元素的當前來源。 |
startDate | 表示當前時間偏移的 Date 物件。 |
textTracks | 表示可用字軌的 TextTrackList 物件。 |
videoTracks | 表示可用視軌的 VideoTrackList 物件。 |
volume | 影音的音量。 |
事件:
abort | 影音的加載已放棄時。 |
canplay | 瀏覽器可以播放影音時。 |
canplaythrough | 瀏覽器可在不因緩衝而停頓的情況下進行播放時。 |
durationchange | 影音的時長已更改時。 |
emptied | 目前的播放列表為空時。 |
ended | 目前的播放列表已結束時。 |
error | 在影音加載期間發生錯誤時。 |
loadeddata | 瀏覽器已加載影音的當前幀時。 |
loadedmetadata | 瀏覽器已加載影音的元數據時。 |
loadstart | 瀏覽器開始查找影音時。 |
pause | 影音已暫停時。 |
play | 影音已開始或不再暫停時。 |
playing | 影音在已因緩衝而暫停或停止後已就緒時。 |
progress | 瀏覽器正在下載影音時。 |
ratechange | 影音的播放速度已更改時。 |
seeked | 用戶已移動到影音中的新位置時。 |
seeking | 用戶開始移動到影音中的新位置時。 |
stalled | 瀏覽器嘗試獲取媒體數據,但數據不可用時。 |
suspend | 瀏覽器刻意不獲取媒體數據時。 |
timeupdate | 目前的播放位置已更改時。 |
volumechange | 音量已更改時。 |
waiting | 視頻由於需要緩衝下一幀而停止時。 |
Boolean
Boolean 物件用來表示 true 與 false 兩種值的資料。
它只有繼承自 Object 的 toString() 和 valueOf(物件) 兩個功能,前者以字串輸出 Boolean 物件的資料,後者將物件轉換為 Boolean 物件的資料。
Canvas
對應 HTML5 的 Canvas 標籤,用來表示繪圖區域。
height | 高度 |
width | 寬度 |
getContext('2D') | 取得 CanvasRenderlingContext2D 物件。 |
toDataURL([type], ..args) | 將圖像轉換成 base 64 編碼。 |
對 JavaScript 來說,重點是取得 CanvasRenderlingContext2D 物件後,用它來進行繪圖,有如下屬性:
data | ImageData 物件,用於像素處理。 |
fillStyle | 填充的顏色。 |
font | 文字的粗斜、大小、字型,用法跟 CSS 一樣。 |
globalAlpha | 當前 alpha 值。 |
globalCompositeOperation | 新圖像如何繪製到已有的圖像上:source-over、source-atop、source-in、source-out、destination-over、destination-atop、destination-in、destination-out、lighter、copy、source-over。 |
lineCap | 線條的結束端點樣式:butt、round、square。 |
lineJoin | 兩條線相交時,所建立的拐角類型:miter、bevel、round。 |
lineWidth | 線條寬度。 |
miterLimit | 最大斜接長度。 |
shadowBlur | 陰影的模糊級別。 |
shadowColor | 陰影的顏色。 |
shadowOffsetX | 陰影距形狀的水平距離。 |
shadowOffsetY | 陰影距形狀的垂直距離。 |
strokeStyle | 線條的顏色。 |
textAlign | 文字內容的當前對齊方式:start、end、center、left、right。 |
textBaseline | 在繪製文字時使用的當前文字基線:alphabetic、top、hanging、middle、ideographic、bottom。 |
以及如下方法:
addColorStop(stop,color) | 規定漸變對像中的顏色和停止位置。 |
arc(x,y,r,a1,a2,c) | 繪製圓弧,r 為半徑,a1 a2 為弧角的起始和結束,c 為 true 表示逆時針。 |
arcTo(x,y,x2,y2,r) | 繪製兩切線之間的圓弧。 |
beginPath() | 開始繪製路徑。 |
bezierCurveTo(x,y,x2,y2,x3,y3) | 繪製貝斯曲線。 |
clearRect(x,y,w,h) | 清除矩形內的圖像。 |
clip() | 從原始畫布剪切任意形狀和尺寸的區域。 |
closePath() | 結束繪製路徑。 |
createImageData(w,h) | 建立新的 ImageData 物件。 |
createLinearGradient(x,y,x2,y2) | 建立線性漸變。 |
createPattern(image,pattern) | 指定貼圖的模式:repeat、repeat-x、repeat-y、no-repeat。 |
createRadialGradient(x,y,r,x2,y2,r2) | 建立放射狀或環形的漸變。 |
drawImage(image,x,y) | 在畫布上繪製圖像、畫布或視頻。 |
fillRect(x,y,w,h) | 繪製有填色的矩形。 |
fillText(text,x,y,w) | 在畫布上繪製文字。 |
fill() | 填色。 |
getImageData(x,y,w,h) | 將畫布指定矩形範圍內的圖像輸出為 ImageData 物件。 |
isPointInPath(x,y) | 如果指定的點位於當前路徑中傳回 true,否則 false。 |
lineTo(x,y) | 添加一個新點,然後在畫布中建立從該點到最後指定點的線條。 |
measureText(text) | 傳回指定文字寬度的物件。 |
moveTo(x,y) | 把路徑移動到畫布中的指定點,不建立線條。 |
putImageData(ImageData,x,y) | 將 ImageData 貼到畫布位置上。 |
quadraticCurveTo(x,y,x2,y2) | 繪製曲線。 |
rect(x,y,w,h) | 建立矩形。 |
restore() | 復原畫布。 |
rotate(a) | 旋轉圖像。 |
roundRect(x,y,w,h,r) | 建立圓角矩形。 |
save() | 保存畫布。 |
scale(w,h) | 縮放圖像。 |
setTransform(a,b,c,d,e,f) | 重製矩陣,然後執行 transform()。 |
stroke() | 繪製路徑。 |
strokeRect(x,y,w,h) | 繪製矩形。 |
strokeText(text,x,y,w) | 在畫布上繪製外框文字。 |
toDataURL() | 將畫布以 base64 編碼的 PNG 圖檔輸出。可輸入選擇性參數 'image/jpeg' 變成 JPEG 圖檔。 |
translate(x,y) | 移動圖像位置。 |
transform(a,b,c,d,e,f) | 將圖像轉換為矩陣。 |
雖然 HTML5 提供了這套 API,但沒有 GDI 電腦繪圖專業的一般人很難活用它,不花個一年半載鑽研,沒辦法藉由 Canvas 做出什麼成效來。所以在這套 API 遇到挫折不要氣餒,循序漸進一步步學成相關技術就好。
你可以透過以下章節初步了解 Canvas API 的使用情況:貼圖 (Draw pictures)、連續圖像 (Sprite)、雙重緩衝 (Double Buffer)、翻頁 (Page Flipping)、影格 (Frame)、圖磚 (Tile),雖然無法因此成為圖形裝置電腦繪圖技術的專業,但在循序漸進的這條路上應該會有幫助。
Date
Date 物件提供處理日期與時間的功能。
然而,取得的是使用者電腦所設定的時間,所以不見得是現實生活的準確時間。
getDate() | 取得日期。 |
getDay() | 取得星期。 |
getFullYear() | 取得完整四位數的西元年份。 |
getHours() | 取得小時。 |
getMilliseconds() | 取得毫秒;一秒等於 1000 毫秒。 |
getMinutes() | 取得分鐘。 |
getMonth() | 取得月份。 |
getSeconds() | 取得秒數。 |
getTime() | 計算自 1970 年 1 月 1 日 0 點 0 分至今所經過的毫秒數。 |
getTimezoneOffset() | 取得當地時區和格林威治時間的時差,以分鐘計算。 |
getUTCDate() | 以國際協定時間的格式取得日期。 |
getUTCDay() | 以國際協定時間的格式取得星期。 |
getUTCFullYear() | 以國際協定時間的格式取得年份。 |
getUTCHours() | 以國際協定時間的格式取得小時。 |
getUTCMilliseconds() | 以國際協定時間的格式取得毫秒。 |
getUTCMinutes() | 以國際協定時間的格式取得分鐘。 |
getUTCMonth() | 以國際協定時間的格式取得月份。 |
getUTCSeconds() | 以國際協定時間的格式取得秒數。 |
getYear() | 取得年份。採用 19XX 尾數的方式,已不被建議使用。 |
setDate(日) | 設定日期。 |
setFullYear(年) | 設定完整四位數的西元年份。 |
setHours(時,分,秒,毫秒) | 設定小時。後面參數可同時設定完整的時間,可省略。 |
setMilliseconds(毫秒) | 設定毫秒,注意數值範圍從 0 到 999。 |
setMinutes(分,秒,毫秒) | 設定分鐘。後面的參數可同時設定秒數,可省略。 |
setMonth(月,日) | 設定月份。後面的參數可同時設定日期,可省略。 |
setSeconds(秒,毫秒) | 設定秒數。後面的參數可同時設定毫秒,可省略。 |
setTime() | 設定自 1970 年 1 月 1 日 0 點 0 分至指定日期所經過的毫秒數。 |
setUTCDate(日) | 可以輸入完整的國際協定時間格式來設定日期。 |
setUTCFullYear(年) | 可以輸入完整的國際協定時間格式來設定年份。 |
setUTCHours(時) | 可以輸入完整的國際協定時間格式來設定小時。 |
setUTCMilliseconds(毫秒) | 可以輸入完整的國際協定時間格式來設定毫秒。 |
setUTCMinutes(分) | 可以輸入完整的國際協定時間格式來設定分鐘。 |
setUTCMonth(月) | 可以輸入完整的國際協定時間格式來設定月份。 |
setUTCSeconds(秒) | 可以輸入完整的國際協定時間格式來設定秒數。 |
setYear(19XX 年的尾數) | 採用 19XX 尾數的方式來設定年份,已不被建議使用。 |
toDateString() | 輸出日期。 |
toGMTString() | 以格林威治平均時間格式輸出完整日期與時間。 |
toISOString() | 以 ISO 的格式輸出完整日期與時間。 |
toJSON() | 將時間值以 JSON 字串輸出。 |
toLocaleDateString() | 以作業系統的本地時間格式輸出日期。 |
toLocaleTimeString() | 以作業系統的本地時間格式輸出時間。 |
toLocaleString() | 以作業系統的本地時間格式輸出字串。 |
toTimeString() | 輸出時間。 |
toUTCString() | 以國際協定時間的格式輸出完整日期與時間。 |
Date(年,月,日,時,分,秒,毫秒) | 依參數建立時間值,可省略後面沒用到的參數。 |
Date.now() | 傳回 POSIX 時間的毫秒數。 |
Date.parse(字串) | 剖析字串中的格式,轉為時間值。 |
Date.UTC(年,月,日,時,分,秒,毫秒) | 產生 POSIX 時間的毫秒數。 |
new Date() 不輸入參數,會以當下時間為參數。
輸入字串當時間,格式就像 1995-12-04T12:34:56,依此類推。
在設定為台北地區的作業系統使用 getTimezoneOffset(),會傳回 -480 分鐘,也就是慢八小時的意思。
Function
JavaScript 把 function(函式)設計為 first class object(第一級物件),所有函式都是 Function 物件,而且是最高層級的型別,能夠當作參數傳遞!
apply(指標,參數群) | 代入指標與 arguments 給函式來使用物件。 |
arguments | 這是個物件,可以更多元地處理傳進來的參數,但是只能在函式內部使用。 |
bind(指標,參數群) | 產生新的函式並附加到指標的 method。 |
call(指標,參數1,參數2,…) | 調用函式,但 this 為傳入的指標。 |
length | 傳回參數的個數。 |
call 其實就跟正常呼叫函式一樣,只是能指定 this 的接收者。
apply 可以把多個參數的函式,改用陣列替代,變成只需一個參數就好。它的用途不是指定 this 的接收者,所以接收者通常設為 null。
bind 不是呼叫函式,而是將函式建立成一個新的 function 物件給接收者,就像接收者自己有了這個方法一樣。通常用在傳入匿名函式參數的場合,也就是把 bind 出來的 function 物件當匿名函式傳入參數。
JSON
藉由 eval() 能執行字串中的程式,讓 JavaScript 能將物件轉為字串保存起來,日後再從字串轉為物件,所規範出來的資料格式,全文為 JavaScript Object Notation。
JSON.parse(字串) | 將 JSON 轉為物件 |
JSON.stringify(物件) | 將物件轉為 JSON |
如果你不知道這是怎麼回事,來看範例:
接續上面的範例,現在還原 json 字串為另一個新的物件:
字串很容易寫在檔案保存起來,有了 JSON 等於 JavaScript 有了序列化的機制。
Map
鍵值對資料結構,與 Object 的差別在於照 set() 資料的順序排列資料,不會排序,且迭代性能提高。
clear() | 清除所有資料。 |
delete(鍵) | 刪除一筆資料。 |
entries() | 以 Iterator 傳回所有名稱與資料。 |
forEach(回呼函式) | 隨資料的列舉過程執行程式功能。 |
get(鍵) | 取得資料。 |
has(鍵) | 檢查是否有某筆資料。 |
keys() | 以 Iterator 傳回所有名稱。 |
set(鍵,值) | 加入資料。 |
size | 取得資料筆數。 |
values() | 以 Iterator 傳回所有資料。 |
Map.groupBy(項目,回呼函式) | 分組資料。 |
Math
Math 是適合用來做數學運算的物件。特別的是,Math 物件不能使用 new 來建立,必須直接呼叫它的函數與常數。
Math.abs(x) | 絕對值。 |
Math.acos(x) | 反餘弦。 |
Math.acosh(x) | 雙曲反餘弦。 |
Math.asin(x) | 反正弦。 |
Math.asinh(x) | 雙曲反正弦。 |
Math.atan(x) | 反正切。 |
Math.atan2(x,y) | 傳回從X軸到點 (X,Y) 的角度。 |
Math.atanh() | 雙曲反正切。 |
Math.cbrt(x) | 立方根。 |
Math.ceil(x) | 無條件進位。 |
Math.clz32(x) | 轉為 32 位數二進制值。 |
Math.cos(x) | 餘弦。 |
Math.cosh(x) | 雙曲餘弦。 |
Math.exp(x) | e 的 X 次方。 |
Math.expm1(x) | e - 1 的 X 次方。 |
Math.floor(x) | 無條件捨去。 |
Math.fround(x) | 用浮點數四捨五入。 |
Math.hypot(x,…) | 平方和的平方根。 |
Math.imul(x,y) | 32 位元整數相乘。 |
Math.log(x) | 自然對數。 |
Math.log10(x) | 底數為 10 的對數 |
Math.log1p(x) | X+1 的自然對數。 |
Math.log2(x) | 底數為 2 的對數。 |
Math.max(x,y,z,…) | 傳回最大的那個參數值。 |
Math.min(x,y,z,…) | 傳回最小的那個參數值。 |
Math.pow(x,y) | X 的 Y 次方。 |
Math.random() | 隨機取得 0 到 1 之間的小數。 |
Math.round(x) | 四捨五入。 |
Math.sign(x) | 是正數傳回 1、負數 -1、正零 0、負零 -0。 |
Math.sin(x) | 正弦。 |
Math.sinh(x) | 雙曲正弦。 |
Math.sqrt(x) | 平方根。 |
Math.tan(x) | 正切。 |
Math.tanh(x) | 雙曲正切。 |
Math.trunc(x) | 去掉小數,只留整數。 |
Math.E | 自然對數的底數。 |
Math.LN10 | 10 的自然對數。 |
Math.LN2 | 2 的自然對數。 |
Math.LOG10E | 以 10 為底數 e 的對數。 |
Math.LOG2E | 以 2 為底數 e 的對數。 |
Math.PI | 圓周率。 |
Math.SQRT1_2 | 根號 2 分之 1。 |
Math.SQRT2 | 根號 2。 |
大多是直接套用的數學函數,只有 random() 的使用比較複雜,需要另外說明!它是我們取得「亂數」的管道,但它傳回的值是小數點達十幾個位數、介於 0.0 到 1.0 之間,所以如果不另外處理的話,傳回來的值不適合我們使用。
通常我們取得亂數的情況希望是整數,因此常見的用法是使用四捨五入的方式來處理 random() 的值……
Math.round(Math.random()*(最大值-最小值))+最小值
如果你需要傳回 3 到 9 之間的亂數,就是:
除了使用四捨五入的 round(),有時候會想使用無條件進位的 ceil() 或無條件捨去的 floor(),差異如下:
當你希望產生的亂數直接對照陣列索引值,就適合直接用 floor():
Number
Number 物件可以直接決定數值資料的輸出方式。在 JavaScript 我們稍不留意,資料容易就會轉為字串來處理,使用 Number 物件來確保使用數值資料。
toExponential(小數位數) | 將資料以指數形式輸出。 |
toFixed(小數位數) | 將資料以小數點的形式輸出。 |
toPrecision(保留位數) | 設定保留的位數來輸出資料。 |
Number.siFinite(資料) | 檢查資料是否為無限大。 |
Number.siInteger(資料) | 檢查資料是否為整數。 |
Number.siNaN(資料) | 檢查資料是否為 NaN。 |
Number.siSafeInteger(資料) | 檢查資料是否為安全精度範圍的整數。 |
Number.EPSILON | 傳回 ε 常數。 |
Number.MAX_SAFE_INTEGER | 傳回安全精度範圍內的最大數值。 |
Number.MAX_VALUE | 傳回 JavaScript 所能接受的最大數值。 |
Number.MIN_SAFE_INTEGER | 傳回安全精度範圍內的最小數值。 |
Number.MIN_VALUE | 傳回 JavaScript 所能接受的最小數值。 |
Number.NaN | Not a number。 |
Number.NEGATIVE_INFINITY | 負無限大。 |
Number.POSITIVE_INFINITY | 無限大。 |
Object
所有物件都會繫結 Object 的 prototype,因此 Object 最主要作用,就是在內部做為其它物件的共通功能!像是所有物件都能以 toString() 輸出資料、都能以 valueOf() 將資料轉換成各自己型態的資料、都能以 constructor 做為 class 語法的建構式。
其次是以 Object. 開頭的功能,方便外部使用者組織程式碼,讓 JavaScript 這門動態型別的物件導向語言,也能有效管理大量程式碼。
constructor | 建構式。 |
hasOwnProperty(屬性) | 檢查是否有自己的屬性,非繼承而來。 |
isPrototypeOf(物件) | 檢查物件是否在原型鏈中。 |
name | 傳回物件名稱。 |
propertyIsEnumerable(屬性) | 檢查屬性是否可迭代。 |
prototype | 原型。 |
toString() | 以字串輸出資料。 |
valueOf(物件) | 轉換為物件型態的資料。 |
Object.assign(物件,物件) | 將物件合併並傳回新物件。 |
Object.create(物件) | 複製新的物件。 |
Object.defineProperites(物件,屬性群) | 用 object literal 定義屬性。 |
Object.defineProperty(物件,屬性,值) | 用 object literal 定義一個屬性。 |
Object.entries() | 以鍵值對取得所有屬性。 |
Object.freeze(物件) | 禁止物件被複製。 |
Object.fromEntries(物件) | 將鍵值對資料轉為物件。 |
Object.getOwnPropertyDescriptor(物件) | 取得自有屬性的描述。 |
Object.getOwnPropertyDescriptors(物件) | 取得自有屬性的描述。 |
Object.getOwnPropertyNames(物件) | 取得自有屬性的名稱。 |
Object.getOwnPropertySymbols(物件) | 取得自有屬性的內容。 |
Object.getPrototypeOf(物件) | 取得物件的原型。 |
Object.hasOwn(屬性) | 檢查是否有自己的屬性,非繼承而來。 |
Object.is(物件值,物件值) | 檢查兩個值是否連型別也相同。 |
Object.isExtensible(物件) | 檢查物件是否為 preventExtensions() 狀態。 |
Object.isFrozen(物件) | 檢查物件是否為 freeze() 狀態。 |
Object.isSealed(物件) | 檢查物件是否為 seal() 狀態。 |
Object.keys() | 取得所有屬性名稱。 |
Object.preventExtensions(物件) | 禁止物件被增加屬性和功能。 |
Object.seal(物件) | 禁止物件被增刪屬性和功能。 |
Object.setPrototypeOf(原型,物件) | 設定原型為另一個物件。 |
Object.values() | 取得所有屬性值。 |
Object 有多好用,看了範例就知道,簡直能讓人下出一手神乎其技:
Promise
用來設計非同步(asynchronous)執行的程式。
all(iterable) | iterable 全都 resolved 的話傳回 Promise。 |
allSettled(iterable) | iterable 全都 settled 的話傳回 Promise。 |
any(iterable) | iterable 有 resolved 的話傳回 Promise。 |
catch(onRejected) | 有觸發 onRejected 的話傳回 Promise。 |
finally(onFinally) | 有觸發 onFinally 的話傳回 Promise。 |
race(iterable) | 無論 iterable 有 resolved 或 reason 都傳回 Promise。 |
reject(reason) | reason 的話傳回 Promise 物件。 |
resolve(value) | value 是 thenable 的話傳回 Promise。 |
then(onFulfilled[,onRejected]) | 產生 Promise 時執行回呼函式。 |
在 JavaScript 3 時代,想另外開一個執行序來進行非同步運算,都是用 setTimeout()。但 setTimeout() 把要執行的程式寫在回呼函式裡,當非同步運算複雜到一條又一條的執行序,會導致一層又一層的回呼函式:
Promise 可以用串接一個又一個 then() 函式解決回呼地獄的問題:
注意!Promise 並不是執行序,它本身並沒有執行序的功能,Promise API 是用來為非同步程式設計制定一個上下文語義的框架,畢竟就本文所舉的例子,執行序只是用來設計非同步運算的一個手段。所以它不叫 Thread,而叫 Promise,它可用來表示非同步運算結果為成功或失敗。如果你需要的是比 setTimeout() 和 setInterval() 更正式一點的執行序,可以用 Web worker。
底下範例會在三秒後輸出 Hello! 訊息:
Promise() 建構函式可接受兩個參數,第一個用在有結果的情況,通常參數名稱取為 resolve,第二個用在沒有結果的情況,通常參數名稱取為 reject。範例只對有結果的情況做出反應,沒有結果的話其實可以進一步除錯或防呆。
then() 會在 Promise 送出 resolve() 的情況下有反應,它會獲得 resolve() 傳回的值,並將它傳入第一個參數,運作完會再將 Promise 本身傳回,也就是再度獲得同一個 Promise,這也是 then() 可以串接的原因,能持續對同一個 Promise 做出反應。
就像 resolve 對應 then(),reject 的話可以用 catch() 來做反應。
除了用建構函式設計非同步程式,也可以直接用 Promise.resolve() 和 Promise.reject() 產生有結果的 Promise 和沒有結果的 Promise:
RegExp
RegExp 物件用來實現 Regular Expressions,這是一種強大的字元匹配機制。
exec(正規式) | 匹配正規式,成立的話傳回資料。 |
flags | 取得 d g i m s u y 設定狀態。 |
test(正規式) | 匹配正規式,成立傳回 true,否則 false。 |
還有 hasIndices、global、ignoreCae、multiline、dotAll、unicode、sticky 屬性沒列出來,這是因為通常要設定這些狀態的話,不如改用 /正規式/dgimsuy
這語法糖來簡化 RegExp 的操作。
Set
集合資料結構,與 Array 的差別在於資料不會重複,且迭代性能提高。
add(值) | 加入資料。 |
clear() | 清除所有資料。 |
delete(值) | 刪除一筆資料。 |
forEach(回呼函式) | 隨資料的列舉過程執行程式功能。 |
has(值) | 檢查是否有某筆資料。 |
size | 取得資料筆數。 |
values() | 以 Iterator 傳回所有資料。 |
Set 雖然也有 entries() 和 keys(),但那是為了能和混用 Map() 防錯用的。
來看個有趣的範例:
String
String 物件可以對「文字資料」進行多種操作,例如:搜尋、替換、擷取。
at(字元位置) | 傳回指定位置的字元,允許負號倒數。 |
charAt(字元位置) | 傳回指定位置的字元。 |
charCodeAt(字元位置) | 以 UTF-16 傳回指定位置字元的 Unicode 編碼。 |
codePointAt(字元位置) | 傳回指定位置字元的 Unicode 編碼。 |
concat(字串,字串,…) | 將多個字串結合成一串。 |
endsWith(文字) | 字串是否以文字結尾。 |
inclueds(文字) | 檢查是否包含文字。 |
indexOf(比對字串) | 比對是否出現所指定的字串,並傳回找到的字元位置。 |
isWellFormed() | 檢查字串是否完全 Uncicode 而非 UTF-16。 |
lastIndexOf(比對字串) | 類似 indexOf(),但由後往前找。 |
length | 取得文字的長度。 |
localeCompare(字串) | 很難說明,請看 MDN 的範例比較快。 |
match(正規表示法) | 比對 RegExp 條件,有的話傳回找到的資料。 |
matchAll(正規表示法) | 比對 RegExp 條件,有的話傳回找到的資料。 |
normalize('NFD'|'NFKC'|'NFKD') | 指定格式傳回 Uncicode 字串,不指定的話為 'NFC'。 |
padEnd(長度[,文字]) | 字數不足時,在尾端填上文字。 |
padStart(長度[,文字]) | 字數不足時,在頭端填上文字。 |
repeat(次數) | 以次數複製字串。 |
replace(正規表示法,替代字串) | 比對 RegExp 條件,有的話改為替代文字並傳回資料。 |
replaceAll(正規表示法,替代字串) | 比對 RegExp 條件,有的話改為替代文字並傳回資料。 |
search(正規表示法) | 比對 RegExp 條件,有的話傳回找到的位置。 |
slice(開始位置,結束位置) | 擷取範圍內的字串,結束位置可用負數表示倒數。 |
split(分割點,區段) | 以分割點作依據,將字串切成好幾個區段。區段可省略。 |
startsWith(文字) | 字串是否以文字開頭。 |
substr(開始位置,長度) | 從指定位置開始擷取指定長度的字串。 |
substring(位置,位置) | 擷取位置到位置範圍內的字串,兩位置大小順序可顛倒。 |
toLowerCase() | 將英文字母以小寫輸出。 |
toUpperCase() | 將英文字母以大寫輸出。 |
toWellFormed() | 以完全 Unicode 編碼輸出字串,而不是以 UTF-16 方式進行。 |
trim() | 刪除頭尾兩端空白。 |
trimEnd() | 刪除尾端空白。 |
trimStart() | 刪除頭端空白。 |
String.fromCharCode(字元編碼,…) | 以 UTF-16 輸出 Unicode 編碼對應的字元。 |
String.fromCodePoint(字元編碼,…) | 輸出 Unicode 編碼對應的字元。 |
String.raw`字串` | Template literal。 |
JavaScript 的字串使用 UTF-16,不夠處理完整的 Unicode 編碼,於是追加 code point 和 well formed 等做法解決問題。
substr() 並不是標準,但它往往比 substring() 好用而被廣泛使用,於是規格書刻意 deprecated 說不建議使用這項功能。對此我的想法是,就算有哪個程式引擎沒實作 substr(),我也會自己加到 String.prototype,沒理由不用它 (●'◡'●)
非標準功能:以 HTML 4.01 格式輸出文字
anchor() | 將文字以 <A NAME></A> 格式輸出 |
big() | 將文字以 <BIG></BIF> 格式輸出 |
blink() | 將文字以 <BLNK></BLINK> 格式輸出 |
bold() | 將文字以 <B></B> 格式輸出 |
fixed() | 將文字以 <TT></TT> 格式輸出 |
fontcolor() | 將文字以 <FONT COLOR=''></FONT> 格式輸出 |
fontsize() | 將文字以 <FONT SIZE=''></FONT> 格式輸出 |
italics() | 將文字以 <I></I> 格式輸出 |
link() | 將文字以 <A HREF=''></A> 格式輸出 |
small() | 將文字以 <SMALL></SMALL> 格式輸出 |
strike() | 將文字以 <STRIKE></STRIKE> 格式輸出 |
sub() | 將文字以 <SUB></SUB> 格式輸出 |
sup() | 將文字以 <SUP></SUP> 格式輸出 |
坦白說,把網頁當 GUI 寫應用程式時,這些 deprecated 的功能蠻好用的,程式碼很優雅,我甚至想自行追加更多這樣的輸出函式來用 (๑•̀ㅂ•́)و✧
URL
URL 能在從網址中取得通訊行定、域名、埠號、標識,以及夾帶的參數資料。
hash | 傳回 # 的標識(fragment) |
host | 傳回域名和埠號 |
hostname | 傳回域名 |
href | 傳回完整網址 |
pathname | 傳回資料夾和檔案的路徑字串 |
port | 傳回埠號 |
protocol | 傳回通訊協定 |
search | 傳回 ? 的參數 |
searchParams | 傳回 URLSearchParams 物件,可用 get() 直接取得參數。 |
你很難不喜歡這個功能:
進一步把 window.location 傳給 URL(),就能取得網頁夾帶的參數資料。