2012年8月30日 星期四

[分享] [].slice 在 JavaScript 神奇應用

[].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 中。

參考資料

沒有留言:

張貼留言

Facebook