JavaScript中的类型转换

JavaScript中的类型转换,javascript,oop,casting,ecmascript-5,Javascript,Oop,Casting,Ecmascript 5,示例: function action(value) { // I want to operate on a string String(value)...; } function action(value) { Point(value)...; // Value at this point (excuse the pun) is a point // // *** Would like to see that intellisense is awa

示例:

function action(value) {
     // I want to operate on a string
     String(value)...;
}
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***
}
当我们将动态值传递到JavaScript的主要类型(
String
Number
Boolean
Object
,等等)时,我们可以(因为缺少更好的词)将值强制转换为指定的类型

是否可以在自定义类型中构建此功能,我将如何进行

我想做的事情的示例:

function action(value) {
     // I want to operate on a string
     String(value)...;
}
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***
}

是否可以以这种方式调用构造函数,并让构造函数将值“强制”到自身的实例中?或者这仅适用于JavaScript的主要类型?

您的自定义构造函数只需检查它传递的参数的类型,并相应地执行操作。从技术上讲,这不是“强制转换”,而是编写代码来检查参数的类型,然后决定正确的行为,包括从一种类型转换为另一种类型

有关如何检查发送到任何函数的参数,然后根据参数的类型、位置和存在情况调整函数行为的详细说明,请参见。同样的功能也可以用来做一些类似于“强制转换”的事情(尽管我们通常不考虑在Javascript中强制转换,而只是转换)

如果您可以更具体地说明要在点构造函数中“强制转换”哪些类型,我们可以为您提供实际的代码示例

这里有一些简单的类似“演员”的例子:

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);
}

或者,举一个更有趣的例子,可以是一个ms数、一个末尾有单位的字符串或一个具有属性的对象:

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。。。 也许你应该试试打字

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

或者,如果你想为你的工作做点什么(像我一样)。。。 您可以开发一个项目并在上传之前吐出Javascript。。。在此阶段,您可以优化“东西”。。。 通过一个过梁,一个缩小器和一个模糊器。。。 您将得到高度优化和一段受保护的代码(如果我们讨论的是客户端,当然,在服务器端不建议混淆)

另一大优势(至少对我来说)是,您可以使用最好的Intellitype/Intellisense/Refactor IDE(VS 2013R4 CE),这是免费的

请参见此处TypeScript中最后的功能。。。


ZEE

它取决于构造函数参数,如果它可以接受string、int等类型的参数,那么是它可能的否,但您可以使用
var o=object.create(Point.prototype)
创建一个对象,然后将
value
复制到其中。您也可以对其应用构造函数
Point.call(o)
也许您的团队对TypeScript感兴趣……ECMAScript 6的一些特性在这方面提供了更大的灵活性。您需要将函数的结果分配给某些东西,例如
value=Point(value)
。最好将其作为局部变量复制,例如
var localT=+t以避免重写参数。@SebastianNette-这里不需要担心重写。参数
t
已经是这个函数的局部变量,因此不需要再创建另一个局部变量。
t=+t
覆盖了
参数[1]
,这是不应该做的,afaik(跳过内部优化)。“我们通常不考虑在Javascript中强制转换,而只是转换”。绝对地变量是无类型的,值有一个(通常与typeof返回的值无关)。构造函数返回的任何东西都有一个对象类型,但是这是非常无用的。通常构造函数的信息量更大,但不可靠。@SebastianNette-这取决于你在优化什么,以及确切的JS引擎能够进行什么样的优化。你是认真地说,在一个如此简单、没有性能重要性的函数中添加一个额外的局部变量声明是值得的吗?或者,你只是应用了一些笼统的建议,在这个具体的例子中并没有任何结果?