0

我做了一个温度转换函数,我很好奇是否有自动将参数转换为字符串。

例如, convertTemp(72, F) --> convertTemp(72, 'F') 然后启动函数。

我知道我可以将参数作为字符串输入,但这让我想知道是否有一种方法可以将(以某种方式错误输入的)变量声明转换为字符串,而无需处理说参数不是的引用错误定义(声明)。

一直在看toString()方法String()等,但它们都转换值而不是像 format 这样的隐式变量。

如果不可能,那很好,只是好奇。

谢谢!

function convertTemp(temperature, format) {
    if (format == 'C') return CtoF();
    else if (format == 'F') return FtoC();
    else return 'Invalid Metric';

    function CtoF() {
        let F = Math.floor((1.8) * temperature + 32);
        return F;
    }

    function FtoC() {
        let C = Math.floor(((temperature - 32) * 5) / 9);
        return C;
    }
}

TLDR;函数输入为:convertTemp(72, F) 而不是 convertTemp(72, 'F'),这可以自动更正吗?

4

2 回答 2

1

从技术上讲,您的问题的答案是“不”。

你必须做一些非常 hacky 的东西来避免 aReferenceError并且没有一个是有效的并且必然会导致错误,但只是为了好玩,我想出了应该让大多数程序员畏缩的那种 hack。

免责声明:在任何情况下,我都不建议这样做

首先让我们考虑一个简单地输出其参数的函数

function doStuff(...args){
  console.log("Args:", ...args)
}

如果您尝试将此函数传递给一个变量,则该变量必须在某处定义。正如其他用户所说,全局变量将是确保在任何范围内定义变量的唯一方法,我们稍后将使用它。

如果您使用 try/catch 包围引用错误,则可以捕获引用错误的消息。然后使用正则表达式,您可以提取缺少的参数,幸运的是它已经是一个字符串,将其添加到全局范围,然后再次调用该函数。

try {
  doStuff(A)
} catch (e) {
  const [,arg] = e.message.match(/^(.*?) is not defined$/i)
  window[arg] = arg
  doStuff(A)
}

但这是多余且毫无意义的,所以现在让我们采用此逻辑并将其放入一个函数中,该函数将在全局范围内为您自动定义变量,然后再次调用该函数,如下所示:

function wrapError(fn){
  try {
    fn()
  }catch(e){
    const [, arg] = e.message.match(/^(.*?) is not defined$/i)
    window[arg] = arg
    wrapError(fn)
  }
}

不幸的是,您必须将函数传递给wrapError,否则doStuff将内联评估并将其错误抛出到 try/catch 块之外。

wrapError(()=>doStuff(A, B, C))

最后你会得到以下结果,这是在 Mac 上的 Chrome 上测试的。抛出的错误消息可能具有不同的格式或结构,并且此正则表达式不是那么健壮,因此请记住这一点。

function doStuff(...args){
  console.log("Args:", ...args)
}

function wrapError(fn){
  try {
    fn()
  }catch(e){
    const [,arg] = e.message.match(/^(.*?) is not defined$/i)
    window[arg] = arg
    wrapError(fn)
  }
}

// With wrapper
wrapError(()=>doStuff(PLZ, DONT, DO, THIS))

// Without wrapper
doStuff(Hello, Error) // ReferenceError

结论:永远不要这样做,我希望没有人认真对待这一点。

于 2019-01-21T17:10:56.773 回答
1

没有预处理器是不可能的,它会提前清理代码。

你可以拿一个constfor 'F'。但我不会推荐它。

const F = 'F';
于 2019-01-21T16:19:49.560 回答