2007/09/22

JavaScript 1.6, 1.7, 1.8 新功能探討

此為 JavaScript 學習筆記。

目前 JavaScript 由 Mozilla 基金會所主導維護開發,目前最新版是 1.7 (in Firefox 2.0),開發中版本 1.8 (in Firefox 3) 是 jQuery 作者 John Resig 主導。雖然 1.5 以後的新版本大多只有 Firefox 自己支援,但是如果就這樣不去學習新功能也未免太可惜了點。有鑒於坊間的書都是介紹舊版本而不會介紹新版的關係,自本家的 Development Wiki 看資料最快速,搭配範例程式碼實際操作幾遍很快就會了。可惜的是這些新功能不是每個瀏覽器都支援,在等待迎向 JavaScript 2.0 的同時,也來關心一下這些版本到底多了什麼新玩意。

New in JavaScript 1.6:

‧Array 增加更多方法
- indexOf, lastIndexOf
- every, some, filter
- map, forEach

(last)indexOf 方法其實跟 String 的一樣,所以沒什麼好講的。要查詢某個陣列中是否有特定的元素用這個方法會更方便。至於 every, some, filter 可傳入一個函式讓陣列中的元素去試,every 全部符合回傳 true, some 部分符合回傳 true, filter 則會回傳符合元素。map 和 forEach 則可以丟入一個函式讓每個元素去跑 (map 可依函式執行結果修改陣列元素)。



New in JavaScript 1.7:

1.7 真是大改進。不像先前的版本只有方法的增加,這次更有語法方面的增加。

‧新增 Generator, Iterator 物件
- yield 敘述, next 方法

Generator 可以在迴圈內暫停,並將值先送出來。待下次呼叫時再行運作,並且重複以上步驟。用範例看會比較清楚。



這個 foo 用到了 yield 敘述,因此會回傳一個 Generator 物件並指定給變數 bar。變數 bar 具有 next() 方法,當每次呼叫時會執行 foo() 裡面的敘述,第一次碰到 yield 時就會將指定的 i++ 傳出來,於是印出 1。當下一次再呼叫 bar.next() 時便會繼續從剛才中斷處執行下去,又碰到 yield,中斷回傳 2,就這樣重複。雖然 foo() 內定義的是無限迴圈, 但是有了 Generator 就可以控制這個迴圈,不斷的以 next() 回傳希望的數值。

Iterator 就是迭代器(迴圈器),使用 Iterator() 包裹起來後便可以用 next() 來逐一取元素,當已經取到底的時候 next() 會觸發一個 StopIteration 例外藉以停止。



但是我覺得下面的方法更直覺:



‧Array comprehensions

將原本生成陣列時繁瑣的步驟變成一行式,不過這不好理解而且有點難用,似乎是從 Python 移植過來的功能。



[i for (i in ...) if ...] 是這個功能的重點,首先從 for...in 取出值來放入陣列,後面也可以指定 if 條件另外限制陣列值,符合 if 條件式的才放入陣列。

‧let 敘述
- let 敘述 / 區塊, 定義

在一個特定的範圍定義變數的值,就類似結界那樣,超過此範圍後設定無效,效果只在範圍內。當然也可以作用在一行,不要加中括號後面直接跟著一段敘述就可以了。



let 定義比較特別,用法跟 var 其實差不多,不過它只作用在一個指定的小區塊,比方說下面兩個例子:



第一例告訴我們可以在一個區塊內暫時更改變數值,範例中 let 被 if{ } 包住,故作用區塊就是這一塊。第二例告訴我們用在迴圈的 let 非常方便,不會影響到外面的變數,可以在獨立的環境中安心使用變數。

‧Destructuring assignment

這是個非常便利且直覺的好功能,可以直接一次對多個變數作指定,而不必再用暫時變數挪來挪去的,另外也可以在函式回傳陣列值時直接大量指定。

比較有趣的功能是可以在物件同時取得元素鍵值和資料,有點類似 PHP 的 foreach($arr as $k => $v) 那樣。



New in JavaScript 1.8:

‧Expression closures

為了實現簡單的 Lambda Function,JavaScript 1.8 簡化了這種特殊的語法:


簡單說就是省略大括號 {} 跟 return 這樣,這部分有人建議既然都改短了應該要改的更簡潔,例如 f(x) x * x; 這樣,看日後是否有修改機會。

‧Generator expressions

1.7 的 Generator 活用法,這好像還是 Python 移植過來的。類似 Array comprehensions 的做法:


這可以生成一個 Generator,每次執行 .next() 會回傳 "XX(new)" 字串。範例使用 for...in 來對其作 Iteration 的動作,可以當成陣列來處理的感覺。

‧其他
我比較期待原生支援 JSON encode/decode 方法,希望日後能內建成功。

2 則留言:

  1. 根據維基的說法,JavaScript 2.0(標準名稱將會是ECMAScript 4)只以1.5(=ECMAScript 3)為底來開發,不會向下相容1.6/1.7由MoFo自己加入的功能……如果情報屬實,學JavaScript 1.6+可說是沒未來啊。 :p

    回覆刪除
  2. 我想 Mozilla 社群不會做蠢事吧,由他們作頭的東西應該是不至於太悽慘就是。
    而且也確實多了一些實用功能,應該會化成某種成果併進 ECMAScript 4 內吧。

    最後這位於 Web 平台的創新語言是否能順利產出並為多數瀏覽器支援,又是一段漫漫長路吧。

    回覆刪除