從 JavaScript 到 Java 的轉換

 

從 JavaScript 到 Java 的轉換

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

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

舉例來說,如果 JSObject.eval 返回了 JavaScript 數值,你可以在 數值 中找到數字轉成 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 方法,轉換就會失敗。

Document Tags and Contributors

Contributors to this page: happysadman
最近更新: happysadman,