JavaScript中的类型转换
作者:互联网
例:
function action(value) {
// I want to operate on a string
String(value)...;
}
当我们将动态值传递给JavaScript的主要类型(字符串,数字,布尔值,对象等)时,我们可以(想要一个更好的词)将值转换为指定的类型.
是否可以在自定义类型中构建此功能,我将如何处理?
我想做的事的例子:
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的主要类型吗?
解决方法:
您的自定义构造函数可以只检查传递的参数的类型并相应地执行操作.从技术上讲,这不是“强制性的”,而是编写代码来检查参数的类型,然后确定适当的行为,包括从一种类型转换为另一种类型.
有关如何检查发送到任何函数的参数,然后根据参数的类型和位置以及参数的存在情况来调整功能行为的详细说明,请参见How to overload functions in javascript?.可以使用相同的功能来执行“投射”之类的操作(尽管我们通常不考虑使用Javascript进行转换,而只是考虑转换).
如果您可以更具体地了解要在Point构造函数中“转换”的类型,我们可以为您提供实际的代码示例.
有一些简单的“ 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});
标签:oop,casting,ecmascript-5,javascript 来源: https://codeday.me/bug/20191028/1950121.html