[].slice function on JavaScript
這幾天學習 CoffeeScript,裡面有許多好玩的 syntax sugar ,當然 JavaScript 原生不會有這種產物,很明顯是沿用 Python, Ruby 語言的優雅之處。
裡面有個部分有個奇妙的使用方式,介紹如下,
Coffee code
awardMedals = (first, second, others...) -> gold = first silver = second rest = others
編譯後的 JavaScript code
awardMedals = function() { var first, others, second; first = arguments[0], second = arguments[1], others = 3 <= arguments.length ? __slice.call(arguments, 2) : []; gold = first; silver = second; return rest = others; };
裡面用到了有趣的 Array.slice ,用模擬的方式來實踐 others… 這樣的語法糖衣。
原理說明
原理是直接採用 Array.slice ,通常這個方法都是用在陣列裡面,不過在這邊是用來做傳參考參數的指定。Array 這個原生 Object 可以直接使用 [] 來使用,
others = (3 <= arguments.length) ? __slice.call(arguments, 2) : [];
從呼叫的方法 (function) 直接使用 arguments 取得所有帶進去 function 中的參數,傳進去的參數數目必需要大於限制,這邊是 3 ,接著才會將第三個以後傳入的參數做分割。
這邊使用了 call 這個方法,不太曉得的人可以,call 會直接執行此 slice 這個方法。
使用 call 這樣的方式執行,第一個傳遞進去的變數,就是
this
,需要告訴這個方法,呼叫者是誰 (傳說中的 JavaScript, what is this)。後面就可以依序帶入原本 slice 所需要的參數,這邊就直接帶入 2 ,會將將前面的兩個參數從 arguments 陣列中移除,後面就可以依序傳遞給目標 others
藉由這樣的方式,達到 other… ,真是個聰明的方法。
結語
從 Coffee 看到許多 JavaScript 缺陷,以及 JavaScript 所帶來的奇妙之處, Coffee 可以讓開發者少打許多 code 。對於剛開始學習 JavaScript 的初學者來說,可能不太合適直接跳進去 CoffeeScript,畢竟必須當成一種新的語言來學習,而且無法從中了解 JavaScript 許多本質上的特性。
當然如果以偷懶來說,CoffeeScript 真的是個不錯的工具,有機會可以試著將 CoffeeScript 使用在 Project 中。
留言
張貼留言