在 JavaScript 中进行类型转换

Type casting in JavaScript

示例:

function action(value) {
     // I want to operate on a string
     String(value)...;
}

当我们将动态值传递给 JavaScript 的主要类型(StringNumberBooleanObject 等)时,我们可以(缺少更好的词)将值转换为指定类型。

是否可以在自定义类型中构建此功能,我该怎么做?

我想做的事的例子:

function action(value) {
    Point(value)...;
    // Value at this point (excuse the pun) is a point
    // // *** Would like to see that intellisense is aware of the type at this point, but please don't assume this is ONLY for intellisense***
}

是否可以通过这种方式调用构造函数并将构造函数 "cast" 的值赋给其自身的实例 - 或者这是否仅适用于 JavaScript 的主要类型?

您的自定义构造函数可以只检查 typeof 它传递的参数并相应地运行。这在技术上不是 "cast",而是编写代码来检查参数的类型,然后决定正确的行为,包括从一种类型转换为另一种类型。

有关如何检查发送到任何函数的参数,然后根据参数的类型、位置和存在情况调整函数行为的详细说明,请参阅 How to overload functions in javascript?。同样的功能可以用来做类似 "cast" 的事情(虽然我们通常不考虑在 Javascript 中进行转换,而只是转换)。

如果您可以更具体地说明要在 Point 构造函数中 "cast" 的类型,我们可以为您提供实际的代码示例。

有一些简单的例子 "cast" 比如:

function delay(fn, t) {
    // if t is passed as a string represeantation of a number, 
    // convert it to an actual number
    return setTimeout(fn, +t);
}

或者,一个更有趣的例子,可以采用毫秒数,一个在末尾带有单位的字符串或一个带有属性的对象:

function delay(fn, t) {
    var typeT = typeof t, ms, matches, num, multiplier,
        suffixes = {ms: 1, sec: 1000, min: 1000 * 60, hr: 1000 * 60 * 60};
    if (typeT === "string") {
        matches = t.match(/^([\d.]+)(.+)$/);
        if (matches) {
            num = +matches[1];
            multiplier = suffixes[matches[2]];
            if (multiplier) {
                ms = num * multiplier;
            }
        }
    } else if (typeT === "number") {
        // plain number is milliseconds
        ms = t;
    } else if (typeT === "object" && t.units && t.value) {
        multiplier = suffixes[t.units];
        if (multiplier) {
           ms = t.value * multiplier;
        }            
    }
    if (ms === undefined) {
        throw new Error("Invalid time argument for delay()");
    }
    return setTimeout(fn, ms);
}


delay(myFn, "2.5hr");
delay(myFn, "25sec");
delay(myFn, 150);
delay(myFn, {units: "sec", value: 25});

如果你认真对待类型强制 (并且有很多充分的理由)...... 并且您想继续使用 Javascript... 也许你应该试试 TypeScript

它强制执行类型检查并编译为 Javascript 这使您可以选择发布用于内联编译的 TypeScript...

或者如果你对你的工作有点兴趣(像我一样)... 你可以开发一个项目,在上传之前吐出Javascript...在这个阶段你可以优化'thing'... 通过一个 Linter、一个 Minifier 和一个混淆器…… 并且您将获得高度优化和受保护的代码片段(当然,如果我们谈论的是客户端,则不建议在服务器端进行混淆)。

另一个大-大-大优势(至少对我而言)是您可以免费使用最好的 Intellitype/Intellisense/Refactor IDE (VS 2013R4 CE)。

在此处查看 TypeScript 的最新功能... TypeScript at Build/2014 by Anders Hejlsberg (channel9)

ZEE