From a065e04d529da1d847b5062a12c46d916408bf32 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 21:46:22 -0500 Subject: update based on https://github.com/mdn/yari/issues/2028 --- .../javascript/new_in_javascript/1.1/index.html | 71 --- .../javascript/new_in_javascript/1.2/index.html | 89 --- .../javascript/new_in_javascript/1.3/index.html | 138 ----- .../javascript/new_in_javascript/1.4/index.html | 25 - .../javascript/new_in_javascript/1.5/index.html | 37 -- .../javascript/new_in_javascript/1.6/index.html | 87 --- .../javascript/new_in_javascript/1.7/index.html | 600 --------------------- .../javascript/new_in_javascript/1.8.1/index.html | 41 -- .../javascript/new_in_javascript/1.8.5/index.html | 132 ----- .../javascript/new_in_javascript/1.8/index.html | 125 ----- .../web/javascript/new_in_javascript/index.html | 71 --- .../index.html" | 25 - .../index.html" | 105 ---- .../index.html" | 87 --- .../index.html" | 13 - .../index.html" | 15 - .../index.html" | 18 - .../index.html" | 50 -- .../global_objects/object/watch/index.html | 191 ------- 19 files changed, 1920 deletions(-) delete mode 100644 files/zh-tw/web/javascript/new_in_javascript/1.1/index.html delete mode 100644 files/zh-tw/web/javascript/new_in_javascript/1.2/index.html delete mode 100644 files/zh-tw/web/javascript/new_in_javascript/1.3/index.html delete mode 100644 files/zh-tw/web/javascript/new_in_javascript/1.4/index.html delete mode 100644 files/zh-tw/web/javascript/new_in_javascript/1.5/index.html delete mode 100644 files/zh-tw/web/javascript/new_in_javascript/1.6/index.html delete mode 100644 files/zh-tw/web/javascript/new_in_javascript/1.7/index.html delete mode 100644 files/zh-tw/web/javascript/new_in_javascript/1.8.1/index.html delete mode 100644 files/zh-tw/web/javascript/new_in_javascript/1.8.5/index.html delete mode 100644 files/zh-tw/web/javascript/new_in_javascript/1.8/index.html delete mode 100644 files/zh-tw/web/javascript/new_in_javascript/index.html delete mode 100644 "files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/java_\345\220\221_javascript_\347\232\204\351\200\232\350\250\212/index.html" delete mode 100644 "files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/java_\345\220\221_javascript_\347\232\204\351\200\232\350\250\212/liveconnect_\351\241\236\345\210\245\347\232\204\344\275\277\347\224\250/index.html" delete mode 100644 "files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/javascript_\345\220\221_java_\347\232\204\351\200\232\350\250\212/index.html" delete mode 100644 "files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/\345\214\205\350\243\235\345\231\250\347\232\204\351\201\213\347\224\250/index.html" delete mode 100644 "files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/\350\263\207\346\226\231\351\241\236\345\236\213\347\232\204\350\275\211\346\217\233/index.html" delete mode 100644 "files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/\350\263\207\346\226\231\351\241\236\345\236\213\347\232\204\350\275\211\346\217\233/\345\276\236_java_\345\210\260_javascript_\347\232\204\350\275\211\346\217\233/index.html" delete mode 100644 "files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/\350\263\207\346\226\231\351\241\236\345\236\213\347\232\204\350\275\211\346\217\233/\345\276\236_javascript_\345\210\260_java_\347\232\204\350\275\211\346\217\233/index.html" delete mode 100644 files/zh-tw/web/javascript/reference/global_objects/object/watch/index.html (limited to 'files/zh-tw/web') diff --git a/files/zh-tw/web/javascript/new_in_javascript/1.1/index.html b/files/zh-tw/web/javascript/new_in_javascript/1.1/index.html deleted file mode 100644 index 1095a343b3..0000000000 --- a/files/zh-tw/web/javascript/new_in_javascript/1.1/index.html +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: New in JavaScript 1.1 -slug: Web/JavaScript/New_in_JavaScript/1.1 -translation_of: Archive/Web/JavaScript/New_in_JavaScript/1.1 ---- -
{{jsSidebar("New_in_JS")}}
- -

The following is a changelog for JavaScript from Netscape Navigator 2.0 to 3.0. The old Netscape documentation references this as "Features added after version 1". Netscape Navigator 3.0 was released on August 19, 1996. Netscape Navigator 3.0 was the second major version of the browser with JavaScript support.

- -

JavaScript versions

- -

Netscape Navigator 3.0 also introduced JavaScript language versions.

- -
<SCRIPT LANGUAGE="JavaScript">    <!-- JavaScript for Navigator 2.0. -->
-<SCRIPT LANGUAGE="JavaScript1.1"> <!-- JavaScript for Navigator 3.0. -->
- -

New features in JavaScript 1.1

- -

New objects

- - - -

New properties

- - - -

New methods

- - - -

New operators

- - - -

Other new features

- - - -

Changed functionality in JavaScript 1.1

- - diff --git a/files/zh-tw/web/javascript/new_in_javascript/1.2/index.html b/files/zh-tw/web/javascript/new_in_javascript/1.2/index.html deleted file mode 100644 index 3c5db395fc..0000000000 --- a/files/zh-tw/web/javascript/new_in_javascript/1.2/index.html +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: New in JavaScript 1.2 -slug: Web/JavaScript/New_in_JavaScript/1.2 -translation_of: Archive/Web/JavaScript/New_in_JavaScript/1.2 ---- -
{{jsSidebar("New_in_JS")}}
- -

The following is a changelog for JavaScript from Netscape Navigator 3.0 to 4.0. The old Netscape documentation can be found on archive.org. Netscape Navigator 4.0 was released on June 11, 1997. Netscape Navigator 4.0 was the third major version of the browser with JavaScript support.

- -

JavaScript versions

- -

Netscape Navigator 4.0 executes JavaScript language versions up to 1.2. Note that Netscape Navigator 3.0 and earlier ignored scripts with the language attribute set to "JavaScript1.2" and higher.

- -
<SCRIPT LANGUAGE="JavaScript1.1"> <!-- JavaScript for Navigator 3.0. -->
-<SCRIPT LANGUAGE="JavaScript1.2"> <!-- JavaScript for Navigator 4.0. -->
- -

New features in JavaScript 1.2

- -

New objects

- - - -

New properties

- - - -

New methods

- - - -

New operators

- - - -

New statements

- - - -

Other new features

- - - -

Changed functionality in JavaScript 1.2

- - diff --git a/files/zh-tw/web/javascript/new_in_javascript/1.3/index.html b/files/zh-tw/web/javascript/new_in_javascript/1.3/index.html deleted file mode 100644 index 635126dc4f..0000000000 --- a/files/zh-tw/web/javascript/new_in_javascript/1.3/index.html +++ /dev/null @@ -1,138 +0,0 @@ ---- -title: New in JavaScript 1.3 -slug: Web/JavaScript/New_in_JavaScript/1.3 -translation_of: Archive/Web/JavaScript/New_in_JavaScript/1.3 ---- -
{{jsSidebar("New_in_JS")}}
- -

The following is a changelog for JavaScript from Netscape Navigator 4.0 to 4.5. The old Netscape documentation can be found on archive.org. Netscape Navigator 4.5 was released on October 19, 1998.

- -

The most significant change in JavaScript 1.3 was compliance with ECMA-262 and Unicode by removing inconsistencies between JavaScript 1.2 and the new ECMA standard (which was published in June 1997). Additional features of version 1.2, at the time not specified by ECMA-262 were kept in the JavaScript language (see below for a list of differences).

- -

JavaScript versions

- -

Netscape Communicator and Navigator 4.06 and 4.5 executes JavaScript language versions up to 1.3. Note that Communicator and Navigator 4.0-4.05 and earlier ignored scripts with the language attribute set to "JavaScript1.3" and higher.

- -
<SCRIPT LANGUAGE="JavaScript1.2"> <!-- JavaScript for Navigator 4.0. -->
-<SCRIPT LANGUAGE="JavaScript1.3"> <!-- JavaScript for Navigator 4.5. -->
- -

New features in JavaScript 1.3

- -

New globals

- - - -

New methods

- - - -

Other new features

- - - -

Changed functionality in JavaScript 1.3

- - - -

Non-ECMA-262 features of JavaScript 1.3

- -

The following is a comparison between the June 1998 version of ECMA-262 and JavaScript 1.3. The following features were not part of the standard at that time, but implemented in JavaScript 1.3.

- -

Keywords and operators

- - - -

Statements

- - - -

Built-in objects

- - - -

Methods of built-in objects

- - diff --git a/files/zh-tw/web/javascript/new_in_javascript/1.4/index.html b/files/zh-tw/web/javascript/new_in_javascript/1.4/index.html deleted file mode 100644 index d44fe1eb71..0000000000 --- a/files/zh-tw/web/javascript/new_in_javascript/1.4/index.html +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: New in JavaScript 1.4 -slug: Web/JavaScript/New_in_JavaScript/1.4 -translation_of: Archive/Web/JavaScript/New_in_JavaScript/1.4 ---- -
{{jsSidebar("New_in_JS")}}
- -

The following is a changelog for JavaScript 1.4, which was only used for Netscape's server side JavaScript released in 1999. The old Netscape documentation can be found on archive.org.

- -

New features in JavaScript 1.4

- - - -

Changed functionality in JavaScript 1.4

- - diff --git a/files/zh-tw/web/javascript/new_in_javascript/1.5/index.html b/files/zh-tw/web/javascript/new_in_javascript/1.5/index.html deleted file mode 100644 index b516506dcd..0000000000 --- a/files/zh-tw/web/javascript/new_in_javascript/1.5/index.html +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: New in JavaScript 1.5 -slug: Web/JavaScript/New_in_JavaScript/1.5 -translation_of: Archive/Web/JavaScript/New_in_JavaScript/1.5 ---- -
{{jsSidebar("New_in_JS")}}
- -

The following is a changelog for JavaScript 1.5. This version was included in Netscape Navigator 6.0 was released on November 14, 2000 and was also used in later versions of Netscape Navigator and Firefox 1.0. You can compare JavaScript 1.5 to JScript version 5.5 and Internet Explorer 5.5, which was released in July 2000. The corresponding ECMA standard is ECMA-262 Edition 3 (from December 1999).

- -

New features in JavaScript 1.5

- - - -

Changed functionality in JavaScript 1.5

- - diff --git a/files/zh-tw/web/javascript/new_in_javascript/1.6/index.html b/files/zh-tw/web/javascript/new_in_javascript/1.6/index.html deleted file mode 100644 index 0c3ffa0f25..0000000000 --- a/files/zh-tw/web/javascript/new_in_javascript/1.6/index.html +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: JavaScript 1.6 新鮮事 -slug: Web/JavaScript/New_in_JavaScript/1.6 -tags: - - E4X - - JavaScript - - JavaScript_version_overviews - - 所有類別 -translation_of: Archive/Web/JavaScript/New_in_JavaScript/1.6 ---- -
{{jsSidebar("New_in_JS")}}
- -

JavaScript 1.6 推出了幾項新機能:E4X、幾個新的 Array 方法、以及 Array 與 String 的通用化。

- -

Firefox 1.5 或更新版的瀏覽器支援 JavaScript 1.6。

- -

E4X

- -

ECMAScript for XML(E4X)是個在 JavaScript 內建立並處理 XML 內容的強力技術。我們將持續改進我們對 E4X 的支援,包括新增與既有的 DOM 進行透明化的整合,不過建立以 XML 為基礎的 Web 應用程式的開發者已可受益於 Firefox 1.5 對 E4X 的支援。

- -

使用 E4X 時還是可以使用標準的 MIME 類型:

- -
<script type="text/javascript">
-
- -

不過,E4X 語法可能會和把 Script 放進 HTML 註解以避免舊瀏覽器讀取的現行方式(<!--...-->)發生衝突。E4X 也有可能與把 Script 放進 XML CDATA 區段(<![CDATA{{ mediawiki.external('...') }}]>)讓 Script 可以直接使用 "<" 和 ">" 符號(這並不適用於 HTML)的現行方式發生衝突。如果你不斷的見到莫名其妙的語法錯誤,那就把 "; e4x=1" 加到 MIME 類型裡:

- -
<script type="text/javascript; e4x=1">
-
- -

注意,擴充套件中的 Script 一定會把 HTML 註解當作 E4X 的語法來處理。也就是說,"e4x=1" 是預設的。

- -

E4X 已在 使用 E4X 處理 XML 一文中說明。

- -

Array 的擴充

- -

在此有七個新的 Array 方法,並且可以分成兩大類,項目定位方法以及迭代方法。項目定位方法有:

- - - -

迭代方法有:

- - - -

閱讀 陣列的運用 以取得更多資訊,或見 Nicholas C. Zakas 的文章,Mozilla's New Array Methods

- -

Array 與 String 的通用化

- -

有時候你會想要把陣列的方法套用在字串上。這樣做的話,便是把字串視為字元的陣列。比如說,如果要檢查變數 str 裡面的每個字元都是字母,你就會這樣寫:

- -
function isLetter(character) {
-  return (character >= "a" && character <= "z");
-}
-
-if (Array.prototype.every.call(str, isLetter))
-  alert("字串 '" + str + "' 只有包含字母!");
-
- -

這樣的寫法相當耗事,所以 JavaScript 1.6 有比較簡短的寫法:

- -
if (Array.every(str, isLetter))
-  alert("字串 '" + str + "' 只有包含字母!");
-
- -

同理,你可以把 String 方法用在任何物件上:

- -
var num = 15;
-alert(String.replace(num, /5/, '2'));
-
- -

參閱

- - - -

{{ languages( { "en": "en/New_in_JavaScript_1.6", "es": "es/Novedades_en_JavaScript_1.6", "fr": "fr/Nouveaut\u00e9s_dans_JavaScript_1.6", "ja": "ja/New_in_JavaScript_1.6", "pl": "pl/Nowo\u015bci_w_JavaScript_1.6", "ru": "ru/\u041d\u043e\u0432\u043e\u0435_\u0432_JavaScript_1.6", "zh-cn": "cn/New_in_JavaScript_1.6" } ) }}

diff --git a/files/zh-tw/web/javascript/new_in_javascript/1.7/index.html b/files/zh-tw/web/javascript/new_in_javascript/1.7/index.html deleted file mode 100644 index 9f94bb6e88..0000000000 --- a/files/zh-tw/web/javascript/new_in_javascript/1.7/index.html +++ /dev/null @@ -1,600 +0,0 @@ ---- -title: JavaScript 1.7 新鮮事 -slug: Web/JavaScript/New_in_JavaScript/1.7 -tags: - - JavaScript - - JavaScript_version_overviews - - 待翻譯 - - 所有類別 -translation_of: Archive/Web/JavaScript/New_in_JavaScript/1.7 ---- -
{{jsSidebar("New_in_JS")}}
- -

{{ Fx_minversion_header(2) }}

- -

JavaScript 1.7 是個程式語言上的更新,新推出了幾項新功能,諸如特別的產生器(generator)、迭代器(iterator)、陣列簡約式(array comprehension)、let 表達式、以及分割代入(destructuring assignment)。它也包含了所有 JavaScript 1.6 的功能。

- -

Firefox 2 起,開始支援 JavaScript 1.7。

- -

本文章使用的程式碼範例可以用 JavaScript shell 實驗。請參見 JavaScript shell 入門 以得知如何建造及使用 shell。

- -

使用 JavaScript 1.7

- -

為了使用 JavaScript 1.7 的一些新機能,你必須在 HTML 或 XUL 的原始碼中指明你希望使用 JavaScript 1.7:

- -
 <script type="application/javascript;version=1.7"/>
-
- -

當使用 JavaScript shell 的時候,你需要設定想要使用的版本,可以在命令列加上 -version 170 或使用 version() 函式:

- -
 version(170);
-
- -

當碰到必須使用新關鍵字「yield」和「let」的機能時,你必須指定版本 1.7,因為既有的程式可能會將那些關鍵字判讀為變數或函數的名字。當某項機能並未引入新關鍵字時(分割代入和陣列簡約式),可不必指定 JavaScript 的版本。

- -

產生器與迭代器

- -

當開發中的代碼涉及到迭代演算法時(例如迭代整個列表或在同一組資料上反覆進行計算),在計算處理期間還需要維護狀態變數的值。傳統上,你必須使用 Callback 函數以取得迭代演算法的立即值。

- -

產生器

- -

思考下面的迭代演算法,他會計算費伯納契數︰

- -
function do_callback(num) {
-  document.write(num + "<BR>\n");
-}
-
-function fib() {
-  var i = 0, j = 1, n = 0;
-  while (n < 10) {
-    do_callback(i);
-    var t = i;
-    i = j;
-    j += t;
-    n++;
-  }
-}
-
-fib();
-
- -

代碼中使用的 Callback 常式會在演算法每一次的迭代步驟中進行運算。在本例中,每一個費伯納契數只是簡單的輸出到控制台上。

- -

產生器和迭代器的結合運用可提供較佳的新方式來完成這一動作。讓我們來看看使用產生器所寫成的費伯納契數常式的樣子︰

- -
function fib() {
-  var i = 0, j = 1;
-  while (true) {
-    yield i;
-    var t = i;
-    i = j;
-    j += t;
-  }
-}
-
-var g = fib();
-for (var i = 0; i < 10; i++) {
-  document.write(g.next() + "<BR>\n");
-}
-
- -

內含 yield 關鍵字的函數便是產生器。當你呼叫函數的時候,函數的形式參數受限於實際的參數,但函數本身並不會被實際進行求值。取而代之的是產生器迭代器(generator-iterator)的返回。每當呼叫產生器迭代器的 next() 方法就進行迭代演算法的下一步驟。每一步驟的值都是由 yield 關鍵字的值所指定。可以把 yield 想成是產生器迭代器版本的 return,並指明演算法每一回迭代之間的分界線。每當你呼叫 next() 的時候,產生器的代碼會從 yield 之後的語句開始恢復執行。

- -

你可以反覆呼叫產生器迭代器的 next() 方法,直到達到你所想要的結果為止。在本例中,我們可以取得任意多的費伯納契數,只要我們持續呼叫 g.next() 直到拿到所需數目的結果為止。

- -
在指定點上恢復產生器的執行
- -

產生器的 next() 方法一經呼叫以後產生器就會被啟動,你可以使用 send() 傳入指定的值,傳入的值會被視為最後一個 yield 的結果。產生器將會返回隨後的 yield 的運算元。

- -

你不能在任意點上啟動產生器;在你可以使用 send() 傳入指定值以前,你必須先以 next() 啟動。

- -
附註: 有趣的一點是,呼叫 send(undefined) 和呼叫 next() 是等價的。然而,使用除了 undefined 以外的任意值來呼叫 send() 並啟動新生的產生器,將會導致 TypeError 的例外。
- -
產生器裡的例外
- -

你可以呼叫產生器的 throw() 方法並傳入要拋出的例外值,強制使產生器拋出例外。例外將會從產生器當下被暫停的內容中拋出,彷彿 throw value 被代換成目前被暫停的 yield 語句。

- -

如果在拋出例外的過程中沒有遇到 yield,例外將會不斷擴散直到呼叫 next(),而隨後呼叫的 next() 將會導致 StopIteration 被拋出。

- -
關閉產生器
- -

產生器有一個 close() 方法可強制產生器關閉他自己。關閉產生器的作用有︰

- -
    -
  1. 執行產生器函數裡面所有活動中的 finally 子句。
  2. -
  3. 如果 finally 子句拋出除了 StopIteration 以外的任何例外,例外會被擴散到 close() 方法的呼叫端。
  4. -
  5. 結束產生器。
  6. -
- -
產生器的範例
- -

下面的代碼驅動的產生器將會產生 100 個迴圈。

- -
var gen = generator();
-
-function driveGenerator() {
-  if (gen.next()) {
-    window.setTimeout(driveGenerator, 0);
-  } else {
-    gen.close();
-  }
-}
-
-function generator() {
-  while (i < something) {
-    /** stuff **/
-
-    ++i;
-    /** 100 loops per yield **/
-    if ((i % 100) == 0) {
-      yield true;
-    }
-  }
-  yield false;
-}
-
- -

迭代器

- -

迭代器是一種特殊的物件,可讓你在資料上進行迭代。

- -

在正常使用下,迭代器物件是「看不見的」;你並不需要直接在裡面做操作,但會使用到 JavaScript 的 for...infor each...in 語法 在物件的鍵值上自然的循環。

- -
var objectWithIterator = getObjectSomehow();
-
-for (var i in objectWithIterator)
-{
-  document.write(objectWithIterator[i] + "<BR>\n");
-}
-
- -

如果你正在實裝你自己的迭代器物件,或者有另一個需要直接操作的迭代器,你將需要知道 next 方法、StopIteration 例外、還有 __iterator__ 方法。

- -

你可以藉著呼叫 Iterator(objectname) 來為物件建立迭代器;物件的迭代器會透過物件的 __iterator__ 方法找出來,如果沒有提供 __iterator__ 方法,就會建立預設的迭代器。預設的迭代器會提供物件的屬性,通常是對應於 for...infor each...in 的模式。如果你想要提供自訂的迭代器,你就要覆蓋 __iterator__ 方法並返回你自訂的迭代器的實體。要從 Script 取得物件的迭代器,你就要使用 Iterator(obj) 而非直接存取 __iterator__ 屬性。前者可用於陣列;而後者不行。

- -

一旦你有了迭代器以後,你就可以藉由呼叫迭代器的 next() 方法輕鬆的取得物件中的下一項。如果已無下一項資料,就會拋出 StopIteration 例外。

- -

下面是直接操作迭代器的簡單範例︰

- -
var obj = {name:"Jack Bauer", username:"JackB", id:12345, agency:"CTU", region:"Los Angeles"};
-
-var it = Iterator(obj);
-
-try {
-  while (true) {
-    document.write(it.next() + "<BR>\n");
-  }
-} catch (err if err instanceof StopIteration) {
-  document.write("記錄結束。<BR>\n");
-} catch (err) {
-  document.write("未知的錯誤︰" + err.description + "<BR>\n");
-}
-
- -

這個程式的輸出就像下面這樣︰

- -
name,Jack Bauer
-username,JackB
-id,12345
-agency,CTU
-region,Los Angeles
-記錄結束。
-
- -

當你正在建立你的迭代器的時候,也可以選擇性的指定第二個參數,這個參數是真假值,可表明每當你呼叫 next() 方法時是否只想要返回鍵的部分。把前面例子的 var it = Iterator(obj); 改成 var it = Iterator(obj, true); 會變成以下的輸出內容︰

- -
name
-username
-id
-agency
-region
-記錄結束。
-
- -

在這兩種情況下,返回的資料的實際順序主要是由實裝方式所決定。在此並沒有統一的資料順序。

- -

迭代器是用來掃描物件裡的資料的簡便方式,包括那些你沒注意到的內容。如果你需要維護應用程式無法預期的資料的話,這一點將會特別實用。

- -

陣列簡約式

- -

陣列簡約式的用法和產生器一樣,可提供簡便的方式進行陣列的初始化。例如︰

- -
function range(begin, end) {
-  for (let i = begin; i < end; ++i) {
-    yield i;
-  }
-}
-
- -

range() 是可返回介於 beginend 之間所有的值的產生器。有了上面的定義,我們可以如下使用︰

- -
var ten_squares = [i * i for (i in range(0, 10))];
-
- -

這個預先初始化內容的新陣列 ten_squares,內含 0..9 範圍內所有數值的平方。

- -

在初始化陣列的時候,你可以採用任意的條件。如果你想要初始化內含 0 到 20 之間的偶數的陣列,你可以使用下面的代碼︰

- -
var evens = [i for (i in range(0, 21)) if (i % 2 == 0)];
-
- -

在 JavaScript 1.7 以前,就必須編寫成像下面這個樣子︰

- -
var evens = [];
-for (var i=0; i <= 20; i++) {
-  if (i % 2 == 0)
-    evens.push(i);
-}
-
- -

陣列簡約式不只是更加的緊密,一旦熟悉了這個概念,就會發現陣列簡約式也真的更加易讀。

- -

作用域規則

- -

陣列簡約式中包含在方括號內部的所有東西具有內含的區塊,就像隱含了 let 宣告一樣。

- -

使用 let 的區塊作用域

- -

let 可用來管理資料和函數的區塊作用域,在此有許多種方式︰

- - - -

let 語法

- -
-

The let block and let expression syntax is non-standard and will be removed in the future. Do not use them! See {{bug(1023609)}} for more details.

-
- -

let 語法可提供給變數一個局域作用域。他會作用於被約束在單一區塊範圍內零個以上的變數;否則,他就和 區塊語法 完全一樣。須特別注意的是,在 let 語法內部使用以 var 宣告過的變數,如果變數已在 let 語法外部宣告過,其作用域仍和外部的一樣;這樣的變數仍具有函數作用域。

- -

例如︰

- -
var x = 5;
-var y = 0;
-
-let (x = x+10, y = 12) {
-  print(x+y + "\n");
-}
-
-print((x + y) + "\n");
-
- -

程式的輸出結果會是︰

- -
27
-5
-
- -

代碼區塊的規則和 JavaScript 中的任何代碼區塊完全一樣。他會有自己的使用 let 宣告所確立的局域變數。

- -
附註: 當使用 let 語法的時候,let 後面的圓括弧是必要的。漏掉圓括弧將導致語法錯誤。
- -

作用域規則

- -

let 所定義的變數其作用域即為 let 區塊本身,也包括其內部的區塊,除非內部區塊定義了相同名稱的變數。

- -

let 表達式

- -
-

The let block and let expression syntax is non-standard and will be removed in the future. Do not use them! See {{bug(1023609)}} for more details.

-
- -

你可以使用 let 來確立只對單一表達式有效的變數:

- -
var x = 5;
-var y = 0;
-document.write( let(x = x + 10, y = 12) x+y  + "<BR>\n");
-document.write(x+y + "<BR>\n");
-
- -

結果為:

- -
27
-5
-
- -

在這個例子中,將 x 和 y 指定為 x+1012 只對 x+y 這個表達式有效。

- -

作用域規則

- -

假設有一個 let 表示式:

- -
let (decls) expr
-
- -

這裡的 expr 也會被隱含的區塊所包圍。

- -

let 定義

- -

let 關鍵字也可以用來定義在區塊中的變數。

- -
附註: 如果你有更多有趣的例子是有關於 let 定義的使用方式,可以考慮加到此處。
- -
if (x > y) {
-  let gamma = 12.7 + y;
-  i = gamma * x;
-}
- -

你可以在擴充套件的代碼中使用 let 定義假命名空間的別名。(詳見 擴充套件中安全性的最佳實踐。)

- -
let Cc = Components.classes, Ci = Components.interfaces;
-
- -

當使用到內部函數的時候,有時 let 語法、表達式和定義可使代碼更為簡潔。

- -
var list = document.getElementById("list");
-
-for (var i = 1; i <= 5; i++) {
-  var item = document.createElement("LI");
-  item.appendChild(document.createTextNode("Item " + i));
-
-  let j = i;
-  item.onclick = function (ev) {
-    alert("Item " + j + " is clicked.");
-  };
-  list.appendChild(item);
-}
-
- -

上面的例子有意如此運作,五個(匿名)內部函數的實體分別參考到五個不同變數 j 的實體。注意,如果你改用 var 取代 let,或是移除變數 j 並簡單的在內部函數中使用變數 i,他就不再如此運作。

- -

作用域規則

- -

使用 let 宣告的變數其作用域不僅是限於所在的區塊,也可用於所在區塊的任意子區塊之中,只要這些子區塊未再次定義同樣的變數。在這個方式下,let 的運作就非常類似 var。主要的不同點在於 var 變數的作用域的範圍是整塊函數︰

- -
  function varTest() {
-    var x = 31;
-    if (true) {
-      var x = 71;  // 相同的變數!
-      alert(x);  // 71
-    }
-    alert(x);  // 71
-  }
-
-  function letTest() {
-    let x = 31;
-    if (true) {
-      let x = 71;  // 不同的變數
-      alert(x);  // 71
-    }
-    alert(x);  // 31
-  }
-
- -

= 右邊的表達式受限於區塊的內部。和 let 表達式 以及 let 語法 的作用範圍不同︰

- -
  function letTests() {
-    let x = 10;
-
-    // let 語法
-    let (x = x + 20) {
-      alert(x);  // 30
-    }
-
-    // let 表達式
-    alert(let (x = x + 20) x);  // 30
-
-    // let 定義
-    {
-      let x = x + 20;  // 此處的 x 會被求值成 undefined
-      alert(x);  // undefined + 20 ==> NaN
-    }
-  }
-
- -

在程式或類別中,let 並不會像 var 那樣在全域物件上建立屬性;取而代之的是,在對某個內容的語句求值之際,隱含的區塊會被建立,let 便會在隱含的區塊中建立屬性。其本質上的意義是 let 並不會覆蓋先前使用 var 定義的變數。例如︰

- -
var x = 'global';
-let x = 42;
-document.write(this.x + "<br>\n");
-
- -

代碼所顯示的輸出將會是 "global" 而非 "42"。

- -

隱含的區塊並不使用圓括弧來界定,他是由 JavaScript 引擎暗中建立的。

- -

在函數中,以 eval() 執行的 let 並不像 var 那樣在變數物件上(活動中的物件或最內部的區塊)建立屬性;取而代之的是,在對程式中的語句求值之際,隱含的區塊會被建立,let 便會在隱含的區塊中建立屬性。這是 eval() 在程式上以前述規則作用的結果。

- -

換句話說,當你使用 eval() 來執行代碼的時候,這些代碼會被視為獨立的程式,這些程式的代碼會被隱含的區塊所包圍。

- -

for 迴圈裡加上 let 的變數

- -

你可以使用 let 關鍵字把局域變數限制在 for 迴圈的作用域裡,就像使用 var 一般。

- -
** 加入 obj **
-   var i=0;
-   for ( let i=i ; i < 10 ; i++ )
-     document.write(i + "<BR>\n");
-
-   for ( let [name,value] in obj )
-     document.write("名稱: " + name + ", 值: " + value + "<BR>\n");
-
- -

作用域規則

- -
for (let expr1; expr2; expr3) statement
-
- -

在本例中,expr2expr3statement 都會被含括在隱含的區塊裡,而這個區塊裡內含以 let expr1 宣告的區塊局域變數。這是前述的第一個迴圈的示例。

- -
for (let expr1 in expr2) statement
-for each(let expr1 in expr2) statement
-
- -

這兩種情況都會有一個內含每一個 statement 的隱含區塊。其中第一個是前述的第二個迴圈。

- -

分割代入

- -

分割代入是利用反映出陣列或物件結構的字面表達的語法,從陣列或物件抽取資料。

- -

陣列或物件的字面表達式可提供簡易的方式來建立特用的資料封包。這些資料封包一經建立之後,就能以任意方式來做想做的事。你甚至可以從函數裡返回這些資料封包。

- -

分割代入其中一件特別實用的用法是以單一的語句讀取整個結構,不過還有很多有趣的使用方式,並會在隨後小節中顯示完整的範例。

- -

這種能力很類似 Perl 或 Python 等語言所具有的機能。

- -

範例

- -

分割代入最好的解釋方式就是使用範例,所以這裡有一些可供你閱讀並從中學習。

- -

避免臨時變數

- -

你可以使用分割代入交換變數值,例如︰

- -
var a = 1;
-var b = 3;
-
-[a, b] = [b, a];
-
- -

執行代碼之後,b 變成 1 且 a 變成 3。如果沒有分割代入,就需要臨時變數交換兩個變數值(在某些低階語言中,可以使用 XOR-交換技巧)。

- -

同樣的,也可以用來交換三個以上的變數︰

- -
var a = 'o';
-var b = "<font color = 'green'>o</font>";
-var c = 'o';
-var d = 'o';
-var e = 'o';
-var f = "<font color = 'blue'>o</font>";
-var g = 'o';
-var h = 'o';
-
-for (lp=0;lp<40;lp++)
-	{[a, b, c, d, e, f, g, h] = [b, c, d, e, f, g, h, a];
-	 document.write(a+''+b+''+c+''+d+''+e+''+f+''+g+''+h+''+"<br />");}
-
- -

執行代碼時,就會顯示變動的色彩循環效果。

- -

回到我們先前費伯納契數產生器的範例,我們可以去掉臨時變數 "t",改在單一的群組代入語法中計算 "i" 和 "j" 的新值︰

- -
function fib() {
-  var i = 0, j = 1;
-  while (true) {
-    yield i;
-    [i, j] = [j, i + j];
-  }
-}
-
-var g = fib();
-for (let i = 0; i < 10; i++)
-  print(g.next());
-
- -

返回多重值

- -

感謝有了分割代入,函數因此能夠返回多重值。儘管一直都可以從函數返回陣列,不過分割代入可提供更進一步的靈活性。

- -
function f() {
-  return [1, 2];
-}
-
- -

如你所見,返回值是以類似陣列的記法把所有要返回的值含括在方括號內來完成的。你可以使用這個方式來返回任意數目的結果。在本例中,f() 返回變數 {{ mediawiki.external('1, 2') }} 作為他的輸出。

- -
var a, b;
-[a, b] = f();
-document.write ("A is " + a + " B is " + b + "<BR>\n");
-
- -

指令 {{ mediawiki.external('a, b') }} = f() 會把函數返回的結果依序代入到方括號裡的變數︰a 會被設成 1 而 b 會被設成 2。

- -

你也可以如同陣列一般取回返回值︰

- -
var a = f();
-document.write ("A is " + a);
-
- -

在本例中,a 是內含有值 1 和值 2 的陣列。

- -

在物件上循環

- -

你也可以使用分割代入從物件取出資料︰

- -
var obj = { width: 3, length: 1.5, color: "orange" };
-
-for (let[name, value] in obj) {
-  document.write ("Name: " + name + ", Value: " + value + "<BR>\n");
-}
-
- -

這個循環會遍歷 obj 物件所有的鍵值對,並顯示這些鍵值對的名稱和值。在本例中,其輸出如下︰

- -
Name: width, Value: 3
-Name: length, Value: 1.5
-Name: color, Value: orange
-
- -

在 JavaScript 1.7 中,圍繞著 objIterator() 並不是必要的;不過在 JavaScript 1.8 則是必要的。這是為了使分割代入可用於陣列(詳見 {{ Bug(366941) }})。

- -

在物件的陣列中的值上循環

- -

你可以遍歷物件上的陣列,在每一個物件上取出感興趣的資料欄位︰

- -
var people = [
-  {
-    name: "Mike Smith",
-    family: {
-      mother: "Jane Smith",
-      father: "Harry Smith",
-      sister: "Samantha Smith"
-    },
-    age: 35
-  },
-  {
-    name: "Tom Jones",
-    family: {
-      mother: "Norah Jones",
-      father: "Richard Jones",
-      brother: "Howard Jones"
-    },
-    age: 25
-  }
-];
-
-for each (let {name: n, family: { father: f } } in people) {
-  document.write ("Name: " + n + ", Father: " + f + "<BR>\n");
-}
-
- -

本例會取出 namefamily.father 欄位,存在 nf 裡,並輸出其內容。這會對 people 陣列裡的每一個物件進行處理。其輸出如下︰

- -
Name: Mike Smith, Father: Harry Smith
-Name: Tom Jones, Father: Richard Jones
-
- -

忽略部分返回值

- -

你也可以忽略不想要的返回值︰

- -
function f() {
-  return [1, 2, 3];
-}
-
-var [a, , b] = f();
-document.write ("A is " + a + " B is " + b + "<BR>\n");
-
- -

執行這個代碼之後,a 變成 1 而 b 變成 3。值 2 會被忽略。你可以按這個方式忽略任意(或全部)的返回值。例如︰

- -
[,,,] = f();
-
- -

從正規表達式的比對結果取值

- -

當正規表達式的 exec() 方法找到符合結果時,就會返回比對結果的陣列。其中第一項是要比對的完整字串,之後是符合正規表達式中的每一個圓括弧的子字串。分割代入可讓你更簡單的從陣列中取出一部分資料,忽略不需要的比對結果。

- -
// 使用簡單的正規表達式比對 http / https / ftp 形式的 URL。
-var parsedURL = /^(\w+)\:\/\/([^\/]+)\/(.*)$/.exec(url);
-if (!parsedURL)
-  return null;
-var [, protocol, fullhost, fullpath] = parsedURL;
-
- -

{{ languages( { "en": "en/New_in_JavaScript_1.7", "es": "es/Novedades_en_JavaScript_1.7", "fr": "fr/Nouveaut\u00e9s_dans_JavaScript_1.7", "it": "it/Novit\u00e0_in_JavaScript_1.7", "ja": "ja/New_in_JavaScript_1.7", "pl": "pl/Nowo\u015bci_w_JavaScript_1.7" } ) }}

diff --git a/files/zh-tw/web/javascript/new_in_javascript/1.8.1/index.html b/files/zh-tw/web/javascript/new_in_javascript/1.8.1/index.html deleted file mode 100644 index 699ff53f02..0000000000 --- a/files/zh-tw/web/javascript/new_in_javascript/1.8.1/index.html +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: JavaScript 1.8.1 新鮮事 -slug: Web/JavaScript/New_in_JavaScript/1.8.1 -tags: - - ECMAScript5 - - Firefox 3.5 - - Gecko 1.9.1 - - JavaScript - - JavaScript 1.8.1 - - JavaScript_version_overviews -translation_of: Archive/Web/JavaScript/New_in_JavaScript/1.8.1 ---- -
{{jsSidebar("New_in_JS")}}
-
-

{{ gecko_minversion_header("1.9.1") }}

- -

  JavaScript 1.8.1 僅只修改了一小部份語法。主要的改變可以看 Tracemonkey just-in-time compiler,大多是關於效能增進的部份。

- -

  以下列舉一些值得注意的 API 變動 (細節詳見 detailed in this newsgroup posting):

- -

語言新增

- -
-
Object.getPrototypeOf()
-
這個新函式可以回傳物件的 prototype。
-
Using native JSON
-
Firefox 3.5 可以原生支援 JSON 的操作了。
-
增加了新的 trim 函式到 String 物件
-
現在 String 物件擁有 trim()trimLeft() 和 trimRight() 函式。
-
- -

其他改良

- - - -

{{ languages( { "ja": "ja/New_in_JavaScript_1.8.1"} ) }}

-
- -

 

diff --git a/files/zh-tw/web/javascript/new_in_javascript/1.8.5/index.html b/files/zh-tw/web/javascript/new_in_javascript/1.8.5/index.html deleted file mode 100644 index 3515191b8b..0000000000 --- a/files/zh-tw/web/javascript/new_in_javascript/1.8.5/index.html +++ /dev/null @@ -1,132 +0,0 @@ ---- -title: New in JavaScript 1.8.5 -slug: Web/JavaScript/New_in_JavaScript/1.8.5 -tags: - - ECMAScript5 - - JavaScript - - JavaScript 1.8.5 -translation_of: Archive/Web/JavaScript/New_in_JavaScript/1.8.5 ---- -
{{jsSidebar("New_in_JS")}}
- -

以下為 JavaScript 1.8.5 的更新日誌,此版本被涵蓋於 Firefox 4 之中。

- -

JavaScript 1.8.5 新功能

- -

新函數

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
函數敘述
{{jsxref("Object.create()")}} -

基於一個特定的原型物件和屬性,建立一個新物件。{{bug("492840")}}

-
{{jsxref("Object.defineProperty()")}}Adds the named property described by a given descriptor to an object.
{{jsxref("Object.defineProperties()")}}Adds the named properties described by the given descriptors to an object.
{{jsxref("Object.getOwnPropertyDescriptor()")}}Returns a property descriptor for a named property on an object. {{bug("505587")}}
{{jsxref("Object.keys()")}}Returns an array of all enumerable properties on an object. {{bug("307791")}}
{{jsxref("Object.getOwnPropertyNames()")}}Returns an array of all enumerable and non-enumerable properties on an object. {{bug("518663")}}
{{jsxref("Object.preventExtensions()")}}Prevents any extensions of an object. {{bug("492849")}}
{{jsxref("Object.isExtensible()")}}Determine if extending of an object is allowed. {{bug("492849")}}
{{jsxref("Object.seal()")}} -

避免其他程式碼刪除一個物件的屬性。 {{bug("492845")}}

-
{{jsxref("Object.isSealed()")}}Determine if an object is sealed. {{bug("492845")}}
{{jsxref("Object.freeze()")}}凍結一個物件:其他程式碼無法刪除或更便任何屬性。{{bug("492844")}}
{{jsxref("Object.isFrozen()")}}辨識一個物件是否遭凍結。{{bug("492844")}}
{{jsxref("Array.isArray()")}}檢查一個變數是否為陣列。{{bug("510537")}}
{{jsxref("Date.prototype.toJSON()")}}回傳一個 JSON 格式的字串 給Date 物件。
{{jsxref("Function.prototype.bind()")}} -

Creates a new function that, when called, itself calls this function in the context provided (with a given sequence of arguments) {{bug("429507")}}

-
- -

New ECMAScript5 features

- - - -

Other standardization work

- -

Various non-standard syntaxes for defining getters and setters have been removed; ECMAScript 5 defined syntax has not been changed. These were all pretty esoteric and rarely used; if this affects you, see this blog post for details.

- -

新物件

- - - - - - - - - - - - - - -
ObjectDescription
{{jsxref("Proxy")}}Offers support for creating Object and Function proxies that enable meta-programming in JavaScript.
- -

Changed functionality in JavaScript 1.8.5

- - diff --git a/files/zh-tw/web/javascript/new_in_javascript/1.8/index.html b/files/zh-tw/web/javascript/new_in_javascript/1.8/index.html deleted file mode 100644 index 63ab0e81b0..0000000000 --- a/files/zh-tw/web/javascript/new_in_javascript/1.8/index.html +++ /dev/null @@ -1,125 +0,0 @@ ---- -title: JavaScript 1.8 新鮮事 -slug: Web/JavaScript/New_in_JavaScript/1.8 -tags: - - JavaScript - - JavaScript_version_overviews -translation_of: Archive/Web/JavaScript/New_in_JavaScript/1.8 ---- -
{{jsSidebar("New_in_JS")}}
-

{{ Fx_minversion_header(3) }} JavaScript 1.8 是 Gecko 1.9(包含於 Firefox 3)的一部分。相較於 JavaScript 1.7 此版只是個小更新,不過部分更新是為了跟進 ECMAScript 4/JavaScript 2。此次的釋出版本包含所有在 JavaScript 1.6JavaScript 1.7 出現的新機能。

- -

詳見 {{ Bug(380236) }} 以追蹤 JavaScript 1.8 的開發狀態。本文件的狀態可見 {{ Bug(421027) }}。

- -

使用 JavaScript 1.8

- -

為了在 HTML 中使用 JavaScript 1.8 的新機能,需要像下面那樣來使用︰

- -
 <script type="application/javascript;version=1.8"> ... 你的代碼 ... </script>
-
- -

另一個方式(不推薦)是使用已廢棄的 <script> 語言屬性並把他定義為 "JavaScript1.8"。

- -

如果是使用 JavaScript shell,JavaScript XPCOM 元件,或 XUL <script> 元件,會自動({{ Bug(381031) }}, {{ Bug(385159) }})使用最新的 JS 版本(在 Mozilla 1.9 中是 JS1.8)。

- -

如果某一機能需要使用到新關鍵字 "yield" 和 "let",你就要指定 1.7 以上的版本,因為現存的代碼可能會使用這些關鍵字作為變數或函數名。至於未使用到新關鍵字的機能(例如產生器表達式)可以直接使用,不需指定 JavaScript 版本。

- -

表達式化簡

- -

表達式化簡(Expression closures)提供類似 典型 Lambda 記法 的語法,除了用於簡單函數的簡寫以外,並未帶來其他新機能。

- -

JavaScript 1.7 及早期版本︰

- -
 function(x) { return x * x; }
-
- -

JavaScript 1.8︰

- -
 function(x) x * x
-
- -

這個語法可讓你省略花括弧和 'return' 語法 - 使這些隱含化。以這種風格編寫的代碼除了簡短以外,並沒有其他額外的優點。

- -

範例:

- -

連結事件接收器的簡寫︰

- -
 document.addEventListener("click", function() false, true);
-
- -

在來自 JavaScript 1.6 的 some 中使用這個記法︰

- -
 elems.some(function(elem) elem.type == "text");
-
- -

產生器表達式

- -

This addition allows you to simply create generators (which were introduced in JavaScript 1.7). Typically you would have to create a custom function which would have a yield in it, but this addition allows you to use array comprehension-like syntax to create an identical generator statement.

- -

In JavaScript 1.7, you might write something like the following in order to create a custom generator for an object:

- -
 function add3(obj) {
-   for ( let i in obj )
-     yield i + 3;
- }
-
- let it = add3(someObj);
- try {
-   while (true) {
-     document.write(it.next() + "<br>\n");
-   }
- } catch (err if err instanceof StopIteration) {
-   document.write("End of record.<br>\n");
- }
-
- -

In JavaScript 1.8, you can circumvent having to create a custom generator function by using a generator expression instead:

- -
 let it = (i + 3 for (i in someObj));
- try {
-   while (true) {
-     document.write(it.next() + "<br>\n");
-   }
- } catch (err if err instanceof StopIteration) {
-   document.write("End of record.<br>\n");
- }
-
- -

Generator expressions can also be passed in, as values, to a function. This is particularly noteworthy since generators aren't run until they are absolutely needed (unlike for typical array comprehension situations, where the arrays are constructed ahead of time). An example of the difference can be seen here:

- -

Using JavaScript 1.7 Array Comprehension

- -
 handleResults([ i for ( i in obj ) if ( i > 3 ) ]);
-
- function handleResults( results ) {
-   for ( let i in results )
-     // ...
- }
-
- -

Using JavaScript 1.8 Generator Expressions

- -
 handleResults( i for ( i in obj ) if ( i > 3 ) );
-
- function handleResults( results ) {
-   for ( let i in results )
-     // ...
- }
-
- -

The significant difference between the two examples being that by using the generator expressions, you would only have to loop over the 'obj' structure once, total, as opposed to once when comprehending the array, and again when iterating through it.

- -

陣列更進一步的擴充

- -

There are two new iterative Array methods included in JavaScript 1.8, specifically:

- - - -

for..in 分割代入的變更

- -

One change that occurred in the release of JavaScript 1.8 was a bug fix related to the key/value destructuring of arrays introduced in JavaScript 1.7. Previously it was possible to destructure the keys/values of an array by using for ( var [key, value] in array ). However that made it impossible to destructure the values of an array - that were arrays. This has been resolved now. ({{ Bug(366941) }}).

- -

{{ languages( { "en": "en/New_in_JavaScript_1.8", "es": "es/Novedades_en_JavaScript_1.8", "fr": "fr/Nouveaut\u00e9s_dans_JavaScript_1.8", "ja": "ja/New_in_JavaScript_1.8", "pl": "pl/Nowo\u015bci_w_JavaScript_1.8", "pt": "pt/Novidades_no_Javascript_1.8", "ko": "ko/New_in_JavaScript_1.8" } ) }}

diff --git a/files/zh-tw/web/javascript/new_in_javascript/index.html b/files/zh-tw/web/javascript/new_in_javascript/index.html deleted file mode 100644 index 0dd24e1d1d..0000000000 --- a/files/zh-tw/web/javascript/new_in_javascript/index.html +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: JavaScript 新鮮事 -slug: Web/JavaScript/New_in_JavaScript -tags: - - NeedsTranslation - - TopicStub -translation_of: Archive/Web/JavaScript/New_in_JavaScript ---- -
{{jsSidebar("New_in_JS")}}
- -

This chapter contains information about JavaScript's version history and implementation status for Mozilla/SpiderMonkey-based JavaScript applications, such as Firefox.

- -

ECMAScript versions

- -
-
Language resources
-
Learn more about the ECMAScript standards on which the JavaScript language is based on.
-
ECMAScript 5 support
-
Implementation status for the current standard ECMA-262 Edition 5.1 in Mozilla-based engines and products.
-
ECMAScript 2015 support
-
Implementation status for the draft ECMA-262 Edition 6 (ES2015 or ES6) in Mozilla-based engines and products.
-
ECMAScript Next support
-
Implementation status for upcoming ECMA-262 features as per the yearly (ES2016/ES2017/ES2018/...) release schedule in Mozilla-based engines and products.
-
- -

JavaScript release notes

- -
-
Firefox JavaScript changelog
-
See this changelog for JavaScript features implemented in Firefox 5 and later.
-
- -

JavaScript versions

- -

Deprecated ({{deprecated_inline}}). The explicit versioning and opt-in of language features was Mozilla-specific and is in process of being removed. Firefox 4 was the last version which referred to an JavaScript version (1.8.5). With new ECMA standards, JavaScript language features are now often mentioned with their initial definition in ECMA-262 Editions such as Edition 6 (ES2015/ES6).

- -

JavaScript was released as version 1.0 in March 1996 in Netscape Navigator 2.0 and Internet Explorer 2.0.

- -
-
JavaScript 1.1
-
Version shipped in Netscape Navigator 3.0. Released on August 19, 1996.
-
JavaScript 1.2
-
Version shipped in Netscape Navigator 4.0-4.05. Released on June 11, 1997.
-
JavaScript 1.3
-
Version shipped in Netscape Navigator 4.06-4.7x. Released on October 19, 1998.
- Standardization work to be compliant with ECMA-262 1st and 2nd Edition.
-
JavaScript 1.4
-
Version shipped in Netscape's server side JavaScript. Released in 1999.
-
JavaScript 1.5
-
Version shipped in Netscape Navigator 6.0 and Firefox 1.0. Release on November 14, 2000.
- Standardization work to be compliant with ECMA-262 3rd Edition.
-
JavaScript 1.6
-
Version shipped in Firefox 1.5. Released in November 2005.
- Includes ECMAScript for XML (E4X), new Array methods plus String and Array generics.
-
JavaScript 1.7
-
Version shipped in Firefox 2. Released in October 2006.
- Includes generators, iterators, array comprehensions, let expressions, and destructuring assignment.
-
JavaScript 1.8
-
Version shipped in Firefox 3. Released in June 2008.
- Includes expression closures, generator expressions and Array.reduce()
-
JavaScript 1.8.1
-
Version shipped in Firefox 3.5. Released on June 30, 2009.
- Includes the TraceMonkey JIT and supports native JSON.
-
JavaScript 1.8.2
-
Version shipped in Firefox 3.6. Released June 22, 2009.
- Includes only minor changes.
-
JavaScript 1.8.5
-
Version shipped in Firefox 4. Released July 27, 2010.
- Includes many new features for ECMA-262 Edition 5 compliance.
- This is the last JavaScript version.
-
diff --git "a/files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/java_\345\220\221_javascript_\347\232\204\351\200\232\350\250\212/index.html" "b/files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/java_\345\220\221_javascript_\347\232\204\351\200\232\350\250\212/index.html" deleted file mode 100644 index aaf64ed784..0000000000 --- "a/files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/java_\345\220\221_javascript_\347\232\204\351\200\232\350\250\212/index.html" +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: Java 向 JavaScript 的通訊 -slug: >- - Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/LiveConnect_概要/Java_向_JavaScript_的通訊 -translation_of: Archive/Web/LiveConnect/LiveConnect_Overview ---- -

 

-

如果你想要在 Java 中使用 JavaScript 物件,你必須在你的 Java 原始碼中引入 netscape.javascript 包裝。這個包裝定義了下面的類別︰

- -

詳見 Core JavaScript 參考 以取得關於此類別的更多資訊。

-

LiveConnect 類別的位置

-

在舊版 Netscape 瀏覽器中,這些類別是連同瀏覽器一起散佈的。從 JavaScript 1.2 開始,這些類別是放在 .jar 檔案中散佈的;在稍早的 JavaScript 版本中,這些類別是放在 .zip 檔案中散佈的。例如,Windows NT 版本的 Netscape Navigator 4,這些類別是放在 Navigator 底下的 Program\Java\Classes 目錄裡的 java40.jar 檔案中散佈的。

-

最近這些類別已改和昇陽的 Java Runtime 一同散佈;一開始是放在 Java Runtime 的散佈版本(JRE 1.3)底下的 "jre/lib" 目錄裡的 "jaws.jar" 檔案中,然後改放在同一目錄下的 "plugin.jar" 檔案中(JRE 1.4 以上)。

-

在 JDK 中使用 LiveConnect 類別

-

若要存取 LiveConnect 類別,有如下兩種方式可以指定 JDK 編譯器的 CLASSPATH 裡的 .jar 或 .zip 檔案位置︰

- -

要在 Windows NT 下指定環境變數,你可在控制台中雙擊系統圖示,並建立稱作 CLASSPATH 的使用者環境變數,其中的值類似下面︰

-
C:\Program Files\Java\jre1.4.1\lib\plugin.jar
-
-

詳見昇陽 JDK 文件,以取得有關 CLASSPATH 的更多資訊。

-

附註: 因為 Java 是強類型語言,而 JavaScript 是弱類型,當你使用 LiveConnect 的時候,JavaScript 執行時期引擎會為其他語言把參數值轉換成適當的資料類型。詳見 資料類型的轉換 取得完整資訊。

-

{{ PreviousNext("Core_JavaScript_1.5_教學:LiveConnect_概要:JavaScript_向_Java_的通訊", "Core_JavaScript_1.5_教學:LiveConnect_概要:Java_向_JavaScript_的通訊:LiveConnect_類別的使用") }}

-

{{ languages( { "en": "en/Core_JavaScript_1.5_Guide/LiveConnect_Overview/Java_to_JavaScript_Communication", "es": "es/Gu\u00eda_JavaScript_1.5/Concepto_general_de_LiveConnect/Comunicaci\u00f3n_de_Java_con_JavaScript", "ja": "ja/Core_JavaScript_1.5_Guide/LiveConnect_Overview/Java_to_JavaScript_Communication", "pl": "pl/Przewodnik_po_j\u0119zyku_JavaScript_1.5/Podgl\u0105d_klas_LiveConnect/Komunikacja_mi\u0119dzy_Java_a_JavaScript" } ) }}

diff --git "a/files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/java_\345\220\221_javascript_\347\232\204\351\200\232\350\250\212/liveconnect_\351\241\236\345\210\245\347\232\204\344\275\277\347\224\250/index.html" "b/files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/java_\345\220\221_javascript_\347\232\204\351\200\232\350\250\212/liveconnect_\351\241\236\345\210\245\347\232\204\344\275\277\347\224\250/index.html" deleted file mode 100644 index e66427fab8..0000000000 --- "a/files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/java_\345\220\221_javascript_\347\232\204\351\200\232\350\250\212/liveconnect_\351\241\236\345\210\245\347\232\204\344\275\277\347\224\250/index.html" +++ /dev/null @@ -1,105 +0,0 @@ ---- -title: LiveConnect 類別的使用 -slug: >- - Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/LiveConnect_概要/Java_向_JavaScript_的通訊/LiveConnect_類別的使用 -translation_of: Archive/Web/LiveConnect/LiveConnect_Overview ---- -

 

-

LiveConnect 類別的使用

-

所有在 Java 代碼中的 JavaScript 物件都是以 netscape.javascript.JSObject 的實體呈現的。當你在你的 Java 代碼內部呼叫方法時,你可以把 JavaScript 物件當作方法的其中一個參數來傳入。要做到這一點,你必須定義能夠對應於 JSObject 類型的方法的參數形式。

-

除此之外,當你在 Java 代碼中使用 JavaScript 物件的任何時候,你就要把使用到 JavaScript 物件的呼叫放置於 try...catch 語法之中,並處理 netscape.javascript.JSException 類型的例外。如此一來,當執行 JavaScript 代碼並出現 JSException 類型的例外時,就可讓你的 Java 代碼處理這些錯誤。

-

使用 JSObject 存取 JavaScript

-

舉例來說,假定你正在使用稱為 JavaDog 的 Java 類別。如同下面的代碼所示,JavaDog 建構子可接受 JavaScript 物件 jsDog,這個物件被定義成和參數一樣的 JSObject 類型︰

-
import netscape.javascript.*;
-
-public class JavaDog
-{
-    public String dogBreed;
-    public String dogColor;
-    public String dogSex;
-
-    // define the class constructor
-    public JavaDog(JSObject jsDog)
-    {
-        // use try...catch to handle JSExceptions here
-        this.dogBreed = (String)jsDog.getMember("breed");
-        this.dogColor = (String)jsDog.getMember("color");
-        this.dogSex = (String)jsDog.getMember("sex");
-    }
-}
-
-

注意 JSObjectgetMember 方法是用來存取 JavaScript 物件的屬性。這個例子中使用 getMember 把 JavaScript 的 jsDog.breed 屬性值代給 Java 的資料成員 JavaDog.dogBreed

-

附註: 更接近實際使用的例子會把 getMember 的呼叫放置在 try...catch 語法的內部,以處理 JSException 類型的錯誤。詳見 在 Java 中處理 JavaScript 例外 以取得更多資訊。

-

為了獲得對 getMember 如何運作的良好感覺,仔細閱讀自訂 JavaScript 的物件 Dog 的定義︰

-
function Dog(breed,color,sex) {
-   this.breed = breed
-   this.color = color
-   this.sex = sex
-}
-
-

你可以如下呼叫 gabby 來建立 JavaScript 的 Dog 實體︰

-
gabby = new Dog("lab","chocolate","female")
-
-

如果你對 gabby.color 求值,你會看到他的值是 "chocolate"。現在假定你在你的 JavaScript 代碼中把 gabby 物件傳給建構子並建立 JavaDog 的實體如下︰

-
javaDog = new Packages.JavaDog(gabby)
-
-

如果你對 javaDog.dogColor 求值,你會看到他的值也是 "chocolate",因為在 Java 的建構子中的 getMember 方法會把 gabby.color 的值代給 dogColor

在 Java 中處理 JavaScript 例外

-

當在 Java 裡被呼叫的 JavaScript 代碼在執行時期失敗的時候,他就會拋出例外。如果你有意在 Java 裡呼叫 JavaScript 代碼,你可以在 try...catch 區塊裡捕捉例外。在你的 Java 代碼中可以取得形如 netscape.javascript.JSException 實體的 JavaScript 例外。

-

JSException 即包裝了由 JavaScript 拋出的所有例外類型的 Java 包裝器,類似於用在 JavaScript 物件的包裝器 JSObject 實體的運作方式。當你在 Java 代碼中對 JavaScript 求值時可以使用 JSException

-

當你在 Java 中對 JavaScript 代碼求值的時候,下列情況便會導致執行時期錯誤︰

- -

舉例來說,假設 Java 物件 eTest 會對你所傳入的字串 jsCode 求值。你可以藉由例外處理器的實行,來回應求值時所產生的任何一種執行時期錯誤的類型︰

-
import netscape.javascript.JSObject;
-import netscape.javascript.JSException;
-
-public class eTest {
-    public static Object doit(JSObject obj, String jsCode) {
-        try {
-            obj.eval(jsCode);
-        } catch (JSException e) {
-            if (e.getWrappedException()==null)
-                return e;
-            return e.getWrappedException();
-        }
-        return null;
-    }
-}
-
-

在本範例中,在 try 區塊裡的代碼試圖對你所傳入的字串 jsCode 求值。就讓我們假設你傳入了字串 "myFunction()" 當作 jsCode 的值。如果 myFunction 並未定義成 JavaScript 的函數,JavaScript 解譯器無法對 jsCode 求值。解譯器便會產生錯誤訊息,Java 處理器捕捉到錯誤訊息,然後 doit 方法會返回 netscape.javascript.JSException 的實體。

-

然而,假設 myFunction 已在 JavaScript 中定義如下︰

-
function myFunction() {
-   try {
-      if (theCondition == true) {
-         return "Everything's ok";
-      } else {
-         throw "JavaScript error occurred" ;
-      }
-   } catch (e) {
-      if (canHandle == true) {
-         handleIt();
-      } else {
-         throw e;
-      }
-   }
-}
-
-

如果 theCondition 為 false,函數就會拋出例外。例外會在 JavaScript 代碼中被捕捉,如果 canHandle 為 true,JavaScript 就會處理例外。如果 canHandle 為 false,就會再度拋出例外,Java 處理器捕捉到例外,然後 doit 方法返回 Java 字串︰

-
JavaScript error occurred
-
-

詳見 例外處理語法 以取得有關 JavaScript 例外的完整資訊。

向後相容性

-

在 JavaScript 1.3 及早期版本中,JSException 類別具有三個公開的建構子可選擇性的接受字串參數,這個參數可指明詳細的訊息或其他有關例外的資訊。getWrappedException 無法使用。

-

使用 try...catch 語法如下,以在 JavaScript 1.3 及其早期版本中處理 LiveConnect 例外︰

-
try {
-   global.eval("foo.bar = 999;");
-} catch (Exception e) {
-   if (e instanceof JSException) {
-      jsCodeFailed()";
-   } else {
-      otherCodeFailed();
-   }
-}
-
-

在本例子中,如果 foo 尚未定義,eval 語句就會失敗。如果 eval 語句在 try 區塊中拋出 JSExceptioncatch 區塊就會執行 jsCodeFailed 方法;如果 try 區塊拋出其他的錯誤,就會執行 otherCodeFailed 方法。

-

{{ PreviousNext("Core_JavaScript_1.5_教學:LiveConnect_概要:Java_向_JavaScript_的通訊", "Core_JavaScript_1.5_教學:LiveConnect_概要:資料類型的轉換") }}

-

{{ languages( { "en": "en/Core_JavaScript_1.5_Guide/LiveConnect_Overview/Java_to_JavaScript_Communication/Using_the_LiveConnect_Classes", "es": "es/Gu\u00eda_JavaScript_1.5/Concepto_general_de_LiveConnect/Comunicaci\u00f3n_de_Java_con_JavaScript/Utilizar_las_clases_de_LiveConnect", "ja": "ja/Core_JavaScript_1.5_Guide/LiveConnect_Overview/Java_to_JavaScript_Communication/Using_the_LiveConnect_Classes", "pl": "pl/Przewodnik_po_j\u0119zyku_JavaScript_1.5/Podgl\u0105d_klas_LiveConnect/Komunikacja_mi\u0119dzy_Java_a_JavaScript/U\u017cywanie_klas_LiveConnect" } ) }}

diff --git "a/files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/javascript_\345\220\221_java_\347\232\204\351\200\232\350\250\212/index.html" "b/files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/javascript_\345\220\221_java_\347\232\204\351\200\232\350\250\212/index.html" deleted file mode 100644 index df24e60251..0000000000 --- "a/files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/javascript_\345\220\221_java_\347\232\204\351\200\232\350\250\212/index.html" +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: JavaScript 向 Java 的通訊 -slug: >- - Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/LiveConnect_概要/JavaScript_向_Java_的通訊 -translation_of: Archive/Web/LiveConnect/LiveConnect_Overview ---- -

 

-

JavaScript 向 Java 的通訊

-

當你參考 Java 的包裝 (package) 或類別的時候,或者運用 Java 物件或陣列的時候,你就使用了獨特的 LiveConnect 物件。所有 JavaScript 向 Java 的存取動作都會使用到這個物件,有關這些的摘要已列在下表中。

- -
物件 說明
JavaArray 已包裝的 Java 陣列,會在 JavaScript 中的代碼存取。
JavaClass JavaScript 對 Java 類別的參考。
JavaObject 已包裝的 Java 物件,會在 JavaScript 中的代碼存取。
JavaPackage JavaScript 對 Java 包裝(package)的參考。
-

表 9.1 LiveConnect 物件

-


-附註: 因為 Java 是強類型的語言,而 JavaScript 是弱類型,當你使用 LiveConnect 的時候,JavaScript 執行時期引撉會針對其他的語言把參數值轉換成適當的資料類型。參閱 資料類型的轉換 以取得完整資訊。

-

某方面來看,LiveConnect 物件是一種隱形的存在,因為你會以相當直觀的方法與 Java 互動。例如,你可以使用 new 運算子和 Java 的建構子建立 Java 的 String 物件,並把這個物件代入給 JavaScript 的變數 myString,如下︰

-
var myString = new java.lang.String("Hello world")
-
-

在這個例子中,變數 myString 就是 JavaObject,因為他握有 Java 物件 String 的實體。就如同 JavaObjectmyString 也可以存取 java.lang.String 公開的實體方法,以及他的親類別 java.lang.Object。這些 Java 方法就在 JavaScript 中作為 JavaObject 的方法來使用,你可以按如下方式呼叫︰

-
myString.length() // 返回 11
-
-

可在 JavaClass 物件上直接呼叫靜態成員。

-
alert(java.lang.Integer.MAX_VALUE); // 警報 2147483647
-
-

Packages 物件

-

如果有某一個 Java 類別並不屬於 javasunnetscape 包裝,你就使用到 Packages 來存取那個類別。例如,假設 Redwood 公司使用了稱為 redwood 的 Java 包裝用來容納各種該公司所實裝的 Java 類別。若要建立 redwood 裡的 HelloWorld 類別的實體,你可如下存取類別的建構子︰

-
var red = new Packages.redwood.HelloWorld()
-
-

你也可以存取位在預設包裝中的類別(也就是無須明確表示包裝名稱的類別)。例如,如果 HelloWorld 類別正好位在 CLASSPATH 裡而不在包裝裡,你可如下來做存取︰

-
var red = new Packages.HelloWorld()
-
-

LiveConnect 的 javasunnetscape 物件針對常用的 Java 包裝提供簡寫。例如,你可如下使用︰

-
var myString = new java.lang.String("Hello world")
-
-

以取代較長的形式︰

-
var myString = new Packages.java.lang.String("Hello world")
-

Java 陣列的運用

-

當你在 JavaScript 中使用任意的 Java 方法建立陣列並加以參照的時候,你已經使用到 JavaArray。例如,下面的代碼以 10 個類型為 int 的元素建立了 JavaArray x

-
x = java.lang.reflect.Array.newInstance(java.lang.Integer, 10)
-
-

就如同 JavaScript Array 物件,JavaArray 也有可返回元素數目的 length 屬性。有別於 Array.lengthJavaArray.length 是唯讀的屬性,因為 Java 陣列中的元素數目在建立的時候就已經固定住了。

包裝和類別的參考

-

在 JavaScript 中建立 JavaPackage 和 JavaClass 物件,就能簡單的參照 Java 包裝和類別。在稍早的 Redwood 公司的例子中,參考 Packages.redwood 的就是 JavaPackage 物件。同樣的,參考諸如 java.lang.String 的也是 JavaClass 物件。

-

大多數時候,你不必為 JavaPackageJavaClass 物件而擔心—你只需使用 Java 包裝和類別來做事,LiveConnect 會默默的建立這些物件。在此有一個 LiveConnect 載入類別時會失敗的例子,而且需要你如下手工載入︰

-
var Widgetry = java.lang.Thread.currentThread().getContextClassLoader().loadClass("org.mywidgets.Widgetry");
-
-

在 JavaScript 1.3 及早期版本中,當你把 JavaClass 物件傳給 Java 方法作為參數的時候,這些物件並不會自動轉換成 java.lang.Class 的實體—你必須建立 java.lang.Class 實體的包裝器 (wrapper)。在下面的範例中,forName 方法建立了包裝器物件 theClass,然後把他傳給 newInstance 方法來建立陣列。

-
// JavaScript 1.3
-theClass = java.lang.Class.forName("java.lang.String")
-theArray = java.lang.reflect.Array.newInstance(theClass, 5)
-
-

在 JavaScript 1.4 以後的版本中,你可以直接把 JavaClass 物件傳送給方法,就如同下面的例子︰

-
// JavaScript 1.4
-theArray = java.lang.reflect.Array.newInstance(java.lang.String, 5)
-

char 類型的參數

-

在 JavaScript 1.4 和以後的版本中,你可以把單一字元的字串傳給所需參數的類型為 char 的 Java 方法。例如,你可以把字串 "H" 傳給 Character 建構子如下︰

-
c = new java.lang.Character("H")
-
-

在 JavaScript 1.3 和早期版本中,你就必須給這些方法傳入與字元的 Unicode 值相對應的整數。例如,下面的代碼會把值 "H" 代入給變數 c

-
c = new java.lang.Character(72)
-

在 JavaScript 中處理 Java 的例外

-

當 Java 代碼在執行時期失敗的時候,他就會丟出例外。如果你的 JavaScript 代碼存取 Java 的資料成員或方法並且失敗的時候,Java 的例外會被傳送到 JavaScript 以供你處理。從 JavaScript 1.4 開始,你可以在 try...catch 區塊裡捕捉這些例外。(雖然這個機能連同其他部分已在 Gecko 1.9 中失效 (詳見 bug 391642),不再於 Mozilla 內部維護 Mozilla 特有的 LiveConnect 代碼,但已在 Java 6 更新的 11 和 12 的建置版本中,在 Mozilla 實裝的通用 (跨瀏覽器) NPAPI 插件的代碼中提供對 Java 的支援,並修復此問題。)

-

例如,假設你使用 Java 的 forName 方法把 Java 類別的名稱代給稱為 theClass 的變數。如果你傳給他的值並不是 Java 類別的名稱,forName 方法就會丟出例外。把 forName 的代入語句放在 try 區塊以處理例外,如下︰

-
function getClass(javaClassName) {
-   try {
-      var theClass = java.lang.Class.forName(javaClassName);
-   } catch (e) {
-      return ("The Java exception is " + e);
-   }
-   return theClass
-}
-
-

在這個例子中,如果 javaClassName 可求出合理的類別名稱,例如 "java.lang.String",代入就會成功。如果 javaClassName 求出無效的類別名稱,例如 "String",getClass 函數會捕捉例外,並返回類似下面的東西︰

-
The Java exception is java.lang.ClassNotFoundException: String
-
-

若要針對例外的類型做特別的處理,可以使用 instanceof 運算子︰

-
try {
-  // ...
-} catch (e) {
-  if (e instanceof java.io.FileNotFound) {
-     // handling for FileNotFound
-  } else {
-    throw e;
-  }
-}
-
-

參閱 例外處理語法 以取得更多有關於 JavaScript 例外的資訊。

-

{{ PreviousNext("Core_JavaScript_1.5_教學:LiveConnect_概要:包裝器的運用", "Core_JavaScript_1.5_教學:LiveConnect_概要:Java_向_JavaScript_的通訊") }}

-

{{ languages( { "en": "en/Core_JavaScript_1.5_Guide/LiveConnect_Overview/JavaScript_to_Java_Communication", "es": "es/Gu\u00eda_JavaScript_1.5/Concepto_general_de_LiveConnect/Comunicaci\u00f3n_de_JavaScript_con_Java", "ja": "ja/Core_JavaScript_1.5_Guide/LiveConnect_Overview/JavaScript_to_Java_Communication", "pl": "pl/Przewodnik_po_j\u0119zyku_JavaScript_1.5/Podgl\u0105d_klas_LiveConnect/Komunikacja_mi\u0119dzy_JavaScript_a_Java" } ) }}

diff --git "a/files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/\345\214\205\350\243\235\345\231\250\347\232\204\351\201\213\347\224\250/index.html" "b/files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/\345\214\205\350\243\235\345\231\250\347\232\204\351\201\213\347\224\250/index.html" deleted file mode 100644 index 91b98b1697..0000000000 --- "a/files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/\345\214\205\350\243\235\345\231\250\347\232\204\351\201\213\347\224\250/index.html" +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: 包裝器的運用 -slug: >- - Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/LiveConnect_概要/包裝器的運用 -translation_of: Archive/Web/LiveConnect/LiveConnect_Overview ---- -

 

-

包裝器的運用

-

在 JavaScript 中,包裝器 (wrapper) 是一種目的語言資料類型的物件,可包裝來源語言的物件。當在 JavaScript 中設計程式的時候,你可以使用包裝器物件存取 Java 物件的方法和欄位;呼叫或存取包裝器裡的方法或屬性,用以在 Java 物件上產生呼叫。對 Java 而言,JavaScript 物件是被包裝在類別為 netscape.javascript.JSObject 的實體之中,並傳送給 Java。

-

當 JavaScript 物件傳送給 Java 的時候,執行時期引撉會建立類型為 JSObject 的 Java 包裝器;當 JSObject 從 Java 傳送到 JavaScript 的時候,執行時期引撉會解開包裝,還原為原本的 JavaScript 物件類型。JSObject 類別提供了可呼叫 JavaScript 方法和檢查 JavaScript 屬性的介面。

-

{{ PreviousNext("Core_JavaScript_1.5_教學:LiveConnect_概要", "Core_JavaScript_1.5_教學:LiveConnect_概要:JavaScript_向_Java_的通訊") }}

- -

{{ languages( { "en": "en/Core_JavaScript_1.5_Guide/LiveConnect_Overview/Working_with_Wrappers", "es": "es/Gu\u00eda_JavaScript_1.5/Concepto_general_de_LiveConnect/Trabajando_con_envoltorios", "ja": "ja/Core_JavaScript_1.5_Guide/LiveConnect_Overview/Working_with_Wrappers", "pl": "pl/Przewodnik_po_j\u0119zyku_JavaScript_1.5/Podgl\u0105d_klas_LiveConnect/Praca_z_klas\u0105_opakowuj\u0105c\u0105" } ) }}

diff --git "a/files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/\350\263\207\346\226\231\351\241\236\345\236\213\347\232\204\350\275\211\346\217\233/index.html" "b/files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/\350\263\207\346\226\231\351\241\236\345\236\213\347\232\204\350\275\211\346\217\233/index.html" deleted file mode 100644 index b541dc1aaf..0000000000 --- "a/files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/\350\263\207\346\226\231\351\241\236\345\236\213\347\232\204\350\275\211\346\217\233/index.html" +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: 資料類型的轉換 -slug: >- - Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/LiveConnect_概要/資料類型的轉換 -translation_of: Archive/Web/LiveConnect/LiveConnect_Overview ---- -

 

-

資料類型的轉換

-

因為 Java 是一種強類型的語言,而 JavaScript 是弱類型,JavaScript 執行時期引擎會在使用 LiveConnect 的時候,為其他的語言把參數值轉換成適當的資料類型。這些轉換過程會在以下的章節中詳述︰

- -

{{ PreviousNext("Core_JavaScript_1.5_教學:LiveConnect_概要:Java_向_JavaScript_的通訊:LiveConnect_類別的使用", "Core_JavaScript_1.5_教學:LiveConnect_概要:資料類型的轉換:從_JavaScript_到_Java_的轉換") }}

-

 

- -

{{ languages( { "en": "en/Core_JavaScript_1.5_Guide/LiveConnect_Overview/Data_Type_Conversions", "es": "es/Gu\u00eda_JavaScript_1.5/Concepto_general_de_LiveConnect/Conversiones_de_tipos_de_datos", "ja": "ja/Core_JavaScript_1.5_Guide/LiveConnect_Overview/Data_Type_Conversions", "pl": "pl/Przewodnik_po_j\u0119zyku_JavaScript_1.5/Podgl\u0105d_klas_LiveConnect/Konwersja_typu_danych" } ) }}

diff --git "a/files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/\350\263\207\346\226\231\351\241\236\345\236\213\347\232\204\350\275\211\346\217\233/\345\276\236_java_\345\210\260_javascript_\347\232\204\350\275\211\346\217\233/index.html" "b/files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/\350\263\207\346\226\231\351\241\236\345\236\213\347\232\204\350\275\211\346\217\233/\345\276\236_java_\345\210\260_javascript_\347\232\204\350\275\211\346\217\233/index.html" deleted file mode 100644 index 258cd81717..0000000000 --- "a/files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/\350\263\207\346\226\231\351\241\236\345\236\213\347\232\204\350\275\211\346\217\233/\345\276\236_java_\345\210\260_javascript_\347\232\204\350\275\211\346\217\233/index.html" +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: 從 Java 到 JavaScript 的轉換 -slug: >- - Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/LiveConnect_概要/資料類型的轉換/從_Java_到_JavaScript_的轉換 -translation_of: Archive/Web/LiveConnect/LiveConnect_Overview ---- -

 

-

從 Java 到 JavaScript 的轉換

-

從 Java 傳給 JavaScript 的值將如下做轉換︰

- -

注意,java.lang.Double 或 java.lang.Integer 的實體會被轉換成 JavaScript 物件,而非 JavaScript 數字。同樣的,java.lang.String 實體也會被轉換成 JavaScript 物件,而非 JavaScript 字串。

-

Java 的 String 物件也可對應於 JavaScript 的包裝器。如果你呼叫需要 JavaScript 字串的 JavaScript 方法,並且把包裝器傳給這個方法,你會碰到錯誤。正確方法是,藉由附加空的字串把包裝器轉換成 JavaScript 字串,如下所示︰

-
var JavaString = JavaObj.methodThatReturnsAString();
-var JavaScriptString = JavaString + "";
-
-

{{ Previous("Core_JavaScript_1.5_教學:LiveConnect_概要:資料類型的轉換:從_JavaScript_到_Java_的轉換") }}

-

{{ languages( { "en": "en/Core_JavaScript_1.5_Guide/LiveConnect_Overview/Data_Type_Conversions/Java_to_JavaScript_Conversions", "es": "es/Gu\u00eda_JavaScript_1.5/Concepto_general_de_LiveConnect/Conversiones_de_tipos_de_datos/Conversiones_de_Java_a_JavaScript", "ja": "ja/Core_JavaScript_1.5_Guide/LiveConnect_Overview/Data_Type_Conversions/Java_to_JavaScript_Conversions", "pl": "pl/Przewodnik_po_j\u0119zyku_JavaScript_1.5/Podgl\u0105d_klas_LiveConnect/Konwersja_typu_danych/Konwersja_Java_do_JavaScript" } ) }}

diff --git "a/files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/\350\263\207\346\226\231\351\241\236\345\236\213\347\232\204\350\275\211\346\217\233/\345\276\236_javascript_\345\210\260_java_\347\232\204\350\275\211\346\217\233/index.html" "b/files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/\350\263\207\346\226\231\351\241\236\345\236\213\347\232\204\350\275\211\346\217\233/\345\276\236_javascript_\345\210\260_java_\347\232\204\350\275\211\346\217\233/index.html" deleted file mode 100644 index a928ec1a0d..0000000000 --- "a/files/zh-tw/web/javascript/obsolete_pages/obsolete_pages/obsolete_pages/liveconnect_\346\246\202\350\246\201/\350\263\207\346\226\231\351\241\236\345\236\213\347\232\204\350\275\211\346\217\233/\345\276\236_javascript_\345\210\260_java_\347\232\204\350\275\211\346\217\233/index.html" +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: 從 JavaScript 到 Java 的轉換 -slug: >- - Web/JavaScript/Obsolete_Pages/Obsolete_Pages/Obsolete_Pages/LiveConnect_概要/資料類型的轉換/從_JavaScript_到_Java_的轉換 -translation_of: Archive/Web/LiveConnect/LiveConnect_Overview ---- -

 

-

從 JavaScript 到 Java 的轉換

-

當你從 JavaScript 呼叫 Java 的方法並傳入參數的時候,你所傳入的參數的資料類型會按下列規則而被轉換︰

- -

netscape.javascript.JSObject 的方法的返回值永遠會被轉換成 java.lang.Object 的實體。這些返回值的轉換規則也會在這些小節中描述。

-

舉例來說,如果 JSObject.eval 返回了 JavaScript 數值,你可以在 {{ Anch("數值") }} 中找到數字轉成 java.lang.Object 實體的規則。

-

數值

-

當你給 Java 方法傳入 JavaScript 數字類型當作參數的時候,Java 會按照描述在下表中的對應規則做轉換︰

- -
Java 參數類型 轉換規則
double
  • 值會被分毫不差的傳給 Java,而不經過捨入、或精度、符號的損失。
  • NaN 會被轉換成 NaN。
java.lang.Double
java.lang.Object
java.lang.Double 的新實體會被建立,值會被分毫不差的傳給 Java,而不經過捨入、或精度、符號的損失。
float
  • 值會被捨入成浮點精度。
  • 過大或過小的值會被表示為捨入過的正無限大或負無限大。
  • NaN 會被轉換成 NaN。
byte
char
int
long
short
  • 值會以捨入至負無限大的方向進行捨入。
  • 過大或過小的值將導致執行時期錯誤。
  • 無法轉換 NaN 並導致執行時期錯誤。
java.lang.String 值會被轉換成字串。例如︰
  • 237 變成 "237"
boolean
  • 0 和 NaN 值會被轉換成 false。
  • 其他的值會被轉換成 true。
-

當 JavaScript 的數字被當作參數傳給 Java 的方法時,Java 的方法預期的是 java.lang.String 的實體,數字會被轉換成字串。使用 equals() 方法來和其他的字串值比較轉換的結果。

真假值

-

當你把 JavaScript 的布林類型當作參數傳給 Java 方法的時候,Java 會按照描述在下表中的對應規則做轉換︰

- -
Java 參數類型 轉換規則
boolean 所有的值全都直接被轉換成 Java 的等價物。
java.lang.Boolean
java.lang.Object
java.lang.Boolean 的新實體會被建立。每一個參數都會建立一個新實體,而非一個實體持有同一原始值。
java.lang.String 值會被轉換成字串。例如︰
  • true 變成 "true"
  • false 變成 "false"
byte
char
double
float
int
long
short
  • true 變成 1
  • false 變成 0
-

當 JavaScript 的真假值被當作參數傳給 Java 方法的時候,Java 方法預期的是 java.lang.String 的實體,真假值會被轉換成字串。使用 == 運算子與其他的字串值和轉換的結果做比較。

字串值

-

當你把 JavaScript 的字串類型當作參數傳給 Java 方法的時候,Java 會按照描述在下表中的對應規則做轉換︰

- -
Java 參數類型 轉換規則
java.lang.String
java.lang.Object

JavaScript 1.4︰

  • JavaScript 字串會被轉換成以 Unicode 值表示的 java.lang.String 實體。

JavaScript 1.3 及早期版本︰

  • JavaScript 字串會被轉換成以 ASCII 值表示的 java.lang.String 實體。
byte
double
float
int
long
short
所有的值都會被轉換成 ECMA-262 所述的數字。JavaScript 字串值會根據 ECMA-262 所述的規則轉換成數字。
char

JavaScript 1.4︰

  • 單一字元的字串會被轉換成 Unicode 字元。
  • 其餘的值會被轉換成數字。

JavaScript 1.3 及早期版本︰

  • 所有的值都會被轉換成數字。
boolean
  • 空字串會變成 false。
  • 其餘的值會變成 true。
-

Undefined 值

-

當你把 JavaScript 的 undefined 類型當作參數傳給 Java 方法的時候,Java 會按照描述在下表中的對應規則做轉換︰

- -
Java 參數類型 轉換規則
lava.lang.String
java.lang.Object
值會被轉換成 java.lang.String 實體,且其值為字串 "undefined"。
boolean 值會變成 false。
double
float
值會變成 NaN。
byte
char
int
long
short
值會變成 0。
-

undefined 的值轉換只能出現在 JavaScript 1.3 及其後版本。JavaScript 的早期版本並不支援 undefined 值。

-

當 JavaScript 的 undefined 被當作參數傳給 Java 的方法時,Java 的方法預期的是 java.lang.String 的實體,undefined 值會被轉換成字串。使用 == 運算子來和其他的字串值比較轉換的結果。

Null 值

-

當你把 JavaScript 的 null 值當作參數傳給 Java 方法的時候,Java 會按照描述在下表中的對應規則做轉換︰

- -
Java 參數類型 轉換規則
所有的類別
所有的界面類型
值會變成 null。
byte
char
double
float
int
long
short
值會變成 0。
boolean 值會變成 false。
-

JavaArray 以及 JavaObject 物件

-

在大多數情況下,當你把 JavaScript 的 JavaArray 或 JavaObject 當作參數傳給 Java 方法的時候,Java 只是簡單的把物件解開;在少數情況下,物件會根據描述在下表中的規則,強制轉換成其他的資料類型。

- -
Java 參數類型 轉換規則
任何與解開後的物件具代入相容性的界面或類別。 直接解開物件。
java.lang.String 直接解開物件,解開後的 Java 物件的 toString 方法會被呼叫,並返回 java.lang.String 的新實體。
byte
char
double
float
int
long
short

直接解開物件,並發生下列其中一種情況︰

  • 如果解開後的 Java 物件具有 doubleValue 方法,JavaArray 或 JavaObject 就會被轉換成這個方法的返回值。
  • 如果解開後的 Java 物件沒有 doubleValue 方法,就會發生錯誤。
boolean

在 JavaScript 1.3 及其後版本中,會直接解開物件並發生下列其中一種情況︰

  • 如果物件是 null,就會把他轉換成 false。
  • 如果物件具有任何其他的值,就會把他轉換成 true。

在 JavaScript 1.2 及早期版本中,會直接解開物件並發生下列其中一種情況︰

  • 如果解開後的物件具有 booleanValue 方法,來源物件就會被轉換成這個方法的返回值。
  • 如果物件沒有 booleanValue 方法,轉換就會失敗。
-

如果解開後的物件是 Java 參數類型的實體,界面或類別就與這個解開後的物件具有代入相容性。也就是說,下面的語句必須返回 true︰

-
unwrappedObject instanceof parameterType
-
-

JavaClass 物件

-

當你把 JavaScript 的 JavaClass 物件當作參數傳給 Java 方法的時候,Java 會按照描述在下表中的對應規則做轉換︰

- -
Java 參數類型 轉換規則
java.lang.Class 直接解開物件。
netscape.javascript.JSObject
java.lang.Object
JavaClass 物件會被包裝在新的 netscape.javascript.JSObject 實體。
java.lang.String 直接解開物件,解開後的 Java 物件的 toString 方法會被呼叫,並返回新的 java.lang.String 實體。
boolean

在 JavaScript 1.3 及其後版本中,會直接解開物件並發生下列其中一種情況︰

  • 如果物件是 null,就會把他轉換成 false。
  • 如果物件具有任何其他的值,就會把他轉換成 true。

在 JavaScript 1.2 及早期版本中,會直接解開物件並發生下列其中一種情況︰

  • 如果解開後的物件具有 booleanValue 方法,來源物件就會被轉換成這個方法的返回值。
  • 如果物件沒有 booleanValue 方法,轉換就會失敗。

其他的 JavaScript 物件

-

當你把 JavaScript 的任何其他的物件當作參數傳給 Java 方法的時候,Java 會按照描述在下表中的對應規則做轉換︰

- -
Java 參數類型 轉換規則
netscape.javascript.JSObject
java.lang.Object
物件會被包裝在新的 netscape.javascript.JSObject 實體。
java.lang.String 直接解開物件,解開後的 Java 物件的 toString 方法會被呼叫,並返回新的 java.lang.String 實體。
byte

char
double
float
int
long

short
物件會使用在 ECMA-262 中所述的 ToPrimitive 運算子的邏輯轉換成值。運算子所使用的 PreferredType 提示是 Number。
boolean

在 JavaScript 1.3 及其後版本中,會直接解開物件並發生下列其中一種情況︰

  • 如果物件是 null,就會把他轉換成 false。
  • 如果物件具有任何其他的值,就會把他轉換成 true。

在 JavaScript 1.2 及早期版本中,會直接解開物件並發生下列其中一種情況︰

  • 如果解開後的物件具有 booleanValue 方法,來源物件就會被轉換成這個方法的返回值。
  • 如果物件沒有 booleanValue 方法,轉換就會失敗。
-

{{ PreviousNext("Core_JavaScript_1.5_教學:LiveConnect_概要:資料類型的轉換", "Core_JavaScript_1.5_教學:LiveConnect_概要:資料類型的轉換:從_Java_到_JavaScript_的轉換") }}

-

{{ languages( { "en": "en/Core_JavaScript_1.5_Guide/LiveConnect_Overview/Data_Type_Conversions/JavaScript_to_Java_Conversions", "es": "es/Gu\u00eda_JavaScript_1.5/Concepto_general_de_LiveConnect/Conversiones_de_tipos_de_datos/Conversiones_de_JavaScript_a_Java", "ja": "ja/Core_JavaScript_1.5_Guide/LiveConnect_Overview/Data_Type_Conversions/JavaScript_to_Java_Conversions", "pl": "pl/Przewodnik_po_j\u0119zyku_JavaScript_1.5/Podgl\u0105d_klas_LiveConnect/Konwersja_typu_danych/Konwersja_JavaScript_do_Java" } ) }}

diff --git a/files/zh-tw/web/javascript/reference/global_objects/object/watch/index.html b/files/zh-tw/web/javascript/reference/global_objects/object/watch/index.html deleted file mode 100644 index 9dc8afa27f..0000000000 --- a/files/zh-tw/web/javascript/reference/global_objects/object/watch/index.html +++ /dev/null @@ -1,191 +0,0 @@ ---- -title: Object.prototype.watch() -slug: Web/JavaScript/Reference/Global_Objects/Object/watch -translation_of: Archive/Web/JavaScript/Object.watch ---- -
{{JSRef}}
- -
-

Warning: Generally you should avoid using watch() and {{jsxref("Object.prototype.unwatch", "unwatch()")}} when possible. These two methods are implemented only in Gecko, and they're intended primarily for debugging use. In addition, using watchpoints has a serious negative impact on performance, which is especially true when used on global objects, such as window. You can usually use setters and getters or proxies instead. See {{anch("Browser compatibility")}} for details. Also, do not confuse {{jsxref("Object.prototype.watch", "Object.watch")}} with {{jsxref("Object.prototype.observe", "Object.observe")}}.

-
- -

The watch() method watches for a property to be assigned a value and runs a function when that occurs.

- -

語法

- -
obj.watch(prop, handler)
- -

參數

- -
-
prop
-
所需要監聽其值是否改變的物件屬性
-
handler
-
當監聽的變數其數值變換時所執行的function
-
- -

回傳值

- -

{{jsxref("undefined")}}.

- -

Description

- -

Watches for assignment to a property named prop in this object, 呼叫 handler(prop, oldval, newval) whenever prop is set and storing the return value in that property. A watchpoint can filter (or nullify) the value assignment, by returning a modified newval (or by returning oldval).

- -

當你刪掉所監聽的物件屬性,並不會結束針對該物件屬性的監聽。當你重新產生該屬性時,監聽依舊維持作用。

- -

要停止該次監聽, 須使用 {{jsxref("Object.unwatch", "unwatch()")}} 函式. By default, the watch method is inherited by every object descended from {{jsxref("Object")}}.

- -

The JavaScript debugger has functionality similar to that provided by this method, as well as other debugging options. For information on the debugger, see Venkman.

- -

In Firefox, handler is only called from assignments in script, not from native code. For example, window.watch('location', myHandler) will not call myHandler if the user clicks a link to an anchor within the current document. However, window.location += '#myAnchor' will call myHandler.

- -
-

Note: Calling watch() on an object for a specific property overrides any previous handler attached for that property.

-
- -

範例

- -

使用watch 和 unwatch

- -
var o = { p: 1 };
-
-o.watch('p', function (id, oldval, newval) {
-  console.log('o.' + id + ' changed from ' + oldval + ' to ' + newval);
-  return newval;
-});
-
-o.p = 2;
-o.p = 3;
-delete o.p;
-o.p = 4;
-
-o.unwatch('p');
-o.p = 5;
-
- -

上述程式執行結果:

- -
o.p changed from 1 to 2
-o.p changed from 2 to 3
-o.p changed from undefined to 4
-
- -

使用 watch 驗證物件的屬性

- -

You can use watch to test any assignment to an object's properties. This example ensures that every Person always has a valid name and an age between 0 and 200.

- -
Person = function(name, age) {
-  this.watch('age', Person.prototype._isValidAssignment);
-  this.watch('name', Person.prototype._isValidAssignment);
-  this.name = name;
-  this.age = age;
-};
-
-Person.prototype.toString = function() {
-  return this.name + ', ' + this.age;
-};
-
-Person.prototype._isValidAssignment = function(id, oldval, newval) {
-  if (id === 'name' && (!newval || newval.length > 30)) {
-    throw new RangeError('invalid name for ' + this);
-  }
-  if (id === 'age'  && (newval < 0 || newval > 200)) {
-    throw new RangeError('invalid age for ' + this);
-  }
-  return newval;
-}
-
-will = new Person('Will', 29);
-console.log(will);   // Will, 29
-
-try {
-  will.name = '';
-} catch (e) {
-  console.log(e);
-}
-
-try {
-  will.age = -4;
-} catch (e) {
-  console.log(e);
-}
-
- -

上述程式執行結果:

- -
Will, 29
-RangeError: invalid name for Will, 29
-RangeError: invalid age for Will, 29
-
- -

規格

- -

Not part of any specifications. Implemented in JavaScript 1.2.

- -

瀏覽器相容性

- -
{{CompatibilityTable}}
- -
- - - - - - - - - - - - - - - - - - - -
FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari
Basic support{{CompatNo}}{{CompatVersionUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
FeatureAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Basic support{{CompatNo}}{{CompatNo}}{{CompatVersionUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

Compatibility notes

- - - -

參閱

- - -- cgit v1.2.3-54-g00ecf