📜  JS++ |类型系统

📅  最后修改于: 2022-05-13 01:55:43.307000             🧑  作者: Mango

JS++ |类型系统

RGBtoHex:在 JS++ 中使用 JavaScript

我们将创建两个文件,一个 JavaScript 文件和一个 JS++ 文件,来介绍它们如何交互。我们将使用经典的 'rgbToHex' 示例来理解 JS++ 类型保证。

首先,创建一个名为 rgbtohex.js (JavaScript) 的文件并输入以下代码:

(不要担心试图理解这段 JavaScript 代码。我们只是将其用作示例。)

function rgbToHex(red, green, blue) {
    if (typeof red !==  "number")   
      throw new TypeError("Expected numeric 'red' value");
    if (typeof green !==  "number") 
      throw new TypeError("Expected numeric 'green' value");
    if (typeof blue !==  "number")  
      throw new TypeError("Expected numeric 'blue' value");

    if (red < 0   || red > 255)     
      throw new RangeError("Expected 'red' value between 0 and 255 (inclusive)");
    if (green < 0 || green > 255)   
      throw new RangeError("Expected 'green' value between 0 and 255 (inclusive)");
    if (blue < 0  || blue > 255)    
      throw new RangeError("Expected 'blue' value between 0 and 255 (inclusive)");

    var r = red.toString(16);
    var g = green.toString(16);
    var b = blue.toString(16);

    while (r.length < 2) r = "0" + r;
    while (g.length < 2) g = "0" + g;
    while (b.length < 2) b = "0" + b;

    return "#" + r + g + b;
}

将上面的 JavaScript 代码保存到 rgbtohex.js 并创建一个新的 main.jspp 文件:

external alert;
external rgbToHex;

alert(rgbToHex(255, 255, 255));

我们首先将“警报”声明为“外部”。 'alert' 实际上是 Web 浏览器的原生函数(通过“DOM API”),它允许我们显示消息框。接下来,我们将我们刚刚编写的自定义 JavaScript函数('rgbToHex') 声明为“external”。这允许我们使用 JS++ 中的函数。

编译 main.jspp。现在创建一个 index.html 文件:



    RGB to Hex Conversion






确保 JavaScript 依赖项 (rgbtohex.js) 的

在您的网络浏览器中打开 index.html。您应该会看到一个带有“#ffffff”的消息框。恭喜!您刚刚将一个 JavaScript函数更改为 JS++。

其他注意事项

正如我们在上一章中了解的 JavaScript 一样,我们直观地了解了预期的数据类型。

然而,对于所有 JavaScript 值,并不总是有一个兼容的 JS++ 类型。这可以用 jQuery 来说明。例如,让我们重温第 5 章中关于循环的示例:

external $;

for (int i = 0; i < 2; i++) {
    $("#content").append("i is now ", i, "; ");
}

这是一个有趣的例子,因为它涵盖了很多内容。首先,如果我们想分解 jQuery 方法调用,以便将选择的 #content(ID 为“content”的页面元素)保存到变量中怎么办?这里没有兼容的 JS++ 类型,所以我们可以只使用 'var':

external $;

for (int i = 0; i < 2; i++) {
    var content = $("#content");
    content.append("i is now ", i, "; ");
}

理论上,最好是零不安全代码。然而,在实践中,'external'、'var' 和 ' 函数' 是与 JavaScript 兼容所必需的。换句话说,需要外部类型。理想情况下,我们永远不会在“完美的 JS++ 代码”中使用外部,但现实世界的编程几乎从来都不是理想的。

精明的观察者可能也注意到了相反方向的转变:从内部到外部。我们将“for”循环计数器变量“i”声明为“int”,一种内部 JS++ 类型。但是,当我们将它作为参数传递给 jQuery 时,它会被转换为“外部”:

content.append("i is now ", i, "; ");

默认情况下,“原始类型”(例如“int”、“字符串”、“bool”、“unsigned int”等)定义了与“external”之间的隐式默认转换。这是因为 JavaScript 对内部 JS++ 原始类型具有自然兼容的数据类型。因此,转换也是自然的。用户定义的类型和用户定义的转换会变得更加复杂,但我们将在后面的章节中介绍这些内容。

了解前向保证后向保证之间的区别很重要。在前瞻性保证中,我们不担心过去,专注于未来。例如,考虑浏览器消息框函数('alert')的简单包装:

external alert;

void messageBox(string message) {
    alert(message);
}

在上面的代码中,如果你用不安全的代码调用'messageBox'并不重要,因为由于类型保证,'message'变量保证对于' messageBox '函数内的所有逻辑都是' 字符串 '。

最后说明

为什么需要 JS++ 类型保证?因为,使用不安全的 JavaScript,即使是像 GoDaddy 这样有资源的大型网站,也可能会因单个 TypeError 而导致结账失败:

GoDaddy TypeError

在上面,“继续”按钮永远不会起作用,因此无法完成购物车结帐。

奇怪的是,检出失败来自于我们在第 9 章中探讨过的相同的 'toLowerCase' 方法。由于 JS++ 是唯一可靠的、渐进类型的 JavaScript 编程语言,类型保证不仅仅意味着向 JavaScript 添加“类型”。这意味着当您声明类型时,可以保证它们是正确的,并且不存在可能导致运行时失败的极端情况(与 Microsoft 和 Facebook 尝试添加数据类型不同)。

不要因为有人告诉你改用 JavaScript 编写代码而破坏关键代码。您需要的不仅仅是类型和类型检查,还需要类型保证