自动将参数(变量)转换为字符串

时间:2019-01-21 16:16:32

标签: javascript

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

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

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

我一直在研究toString()方法,String()等,但是它们都转换值,而不是像格式那样的隐式变量。

如果不可能的话,请好奇。

谢谢!

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'),可以自动更正吗?

2 个答案:

答案 0 :(得分:1)

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

您可以将key1 key2 key3 key4 key2 value1 value2 value3 NaN value20 value4 NaN value6 value2 NaN 换成const。但是我不推荐。

'F'

答案 1 :(得分:1)

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

您必须做一些非常棘手的事情,才能避免使用ReferenceError,但它们都不是有效的,并且肯定会导致错误,但是为了好玩,我想出了一种黑客应该会使大多数程序员畏缩。

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

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

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

结论:永远不要这样做,我希望没人认真对待这个问题。