JScript 可以对不同类型的值执行运算,而不会导致编译器引发异常。JScript 编译器在执行运算之前,自动将一种数据类型更改(强制)为另一种数据类型。其他语言则使用更为严格的控制强制的规则。
强制详细信息
除非证明强制永远不会成功,否则编译器允许使用所有的强制。任何可能 失败的强制在编译时生成一个警告,并且很多强制在失败时会产生运行时错误。例如:
运算 | 结果 |
---|---|
将数字与字符串相加 |
将数字强制为字符串。 |
将布尔值与字符串相加 |
将布尔值强制为字符串。 |
将数字与布尔值相加 |
将布尔值强制为数字。 |
请看下面的示例。
var x = 2000; // A number. var y = "Hello"; // A string. x = x + y; // the number is coerced into a string. print(x); // Outputs 2000Hello.
若要将字符串显式转换为整数,可以使用 parseInt 方法。有关更多信息,请参见 parseInt 方法。若要将字符串显式转换为数字,可以使用 parseFloat 方法。有关更多信息,请参见 parseFloat 方法。请注意,用于比较时,字符串被自动转换为等效的数字,但在相加(串联)时,仍保留为字符串。
因为 JScript 也是一种强类型的语言,所以也可以使用另一种强制机制。新机制使用目标类型名称,就好像它是一个将要转换的表达式作为参数的函数。这对于所有 JScript 基元类型、JScript 引用类型和 .NET Framework 类型都适用。
例如,以下代码将一个整型值转换为布尔值:
var i : int = 23; var b : Boolean; b = i; b = Boolean(i);
因为 i 的值是一个非零值,所以 b 为 true。
新强制机制还适用于许多用户定义的类型。但是,由于 JScript 在转换不相似的类型时可能曲解用户的意图,所以以用户定义的类型作为强制源或强制目标的某些强制可能不能正常工作。当被转换的类型包含几个值时,尤其如此。例如,以下代码创建两个类(类型)。一个类包含单个变量 i(一个整数)。另一个类包含 3 个变量(s、f 和 d),每个变量具有不同的类型。在最后一条语句中,JScript 无法确定如何将第一种类型的变量转换为第二种类型。
class myClass { var i : int = 42; } class yourClass { var s : String = "Hello"; var f : float = 3.142; var d : Date = new Date(); } // Define a variable of each user-defined type. var mine : myClass = new myClass(); var yours : yourClass; // This fails because there is no obvious way to convert // from myClass to yourClass yours = yourClass(mine);