在 JavaScript 中进行类型转换
Type casting in JavaScript
示例:
function action(value) {
// I want to operate on a string
String(value)...;
}
当我们将动态值传递给 JavaScript 的主要类型(String
、Number
、Boolean
、Object
等)时,我们可以(缺少更好的词)将值转换为指定类型。
是否可以在自定义类型中构建此功能,我该怎么做?
我想做的事的例子:
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