分享
三行代码  ›  专栏  ›  技术社区  ›  kevin

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

  •  0
  • kevin  · 技术社区  · 1 年前

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

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

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

    我一直在看 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 回复  |  直到 1 年前
        1
  •  1
  •   Khauri    1 年前

    你的问题的答案在技术上是“不”。

    为了避免 ReferenceError 所有这些都不会有效率,而且一定会引起bug,但为了好玩,我想出了一种让大多数程序员感到害怕的黑客。

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

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

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

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

    如果用try/catch包围引用错误,则可以捕获引用错误的消息。然后,使用regex可以提取缺少的参数(幸运的是,该参数已经是字符串),将其添加到全局范围,然后再次简单地调用函数。

    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上进行了测试。抛出的错误消息可能具有不同的格式或结构,而且这个regex不那么健壮,所以请记住这一点。

    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

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

        2
  •  1
  •   Nina Scholz    1 年前

    如果没有预处理器,就不可能提前清理代码。

    你可以拿一个 const 对于 'F' . 但我不推荐。

    const F = 'F';