是否可以制作正则表达式来确定函数的返回类型?

时间:2017-04-14 18:33:44

标签: javascript regex

给出以下函数的 text

function f3() {
  return Math.random() > 0.5 ? Promise.resolve(true): 'naaah'
}

是否可以编译正则表达式来确定f3()调用的返回类型,而不实际调用该函数?

5 个答案:

答案 0 :(得分:11)

鉴于代码,我们无法通过正则表达式确定此返回类型。矛盾证明:

  1. 假设我们可以使用正则表达式找到返回类型。

  2. 返回类型是在最后一行中通过对random的非确定性调用决定的(事先不知道)。

  3. 正则表达式是确定性的 - 当在同一输入上运行时,它们总是具有相同的输出。

  4. 因此,函数的返回类型必须是静态的,因为我们可以运行正则表达式并找到返回类型(并且正则表达式将始终返回相同的内容)。

  5. 矛盾:函数的返回类型必须是静态的,但由于random

  6. ,函数的返回类型是可变的

    注意:上面假设类型必须是单一类型,并且不会单独考虑Union类型。

    另外,证明我们为什么不能一直这样做。

    1. 假设我们可以某种方式找出函数中使用的每种类型。

    2. 在某些时候,我们会生成字符串a="A"+Math.random()

    3. 稍后我们会生成字符串b="class "+a+"{...}

    4. 在此定义之后,我们执行c= eval("new "+a+"()")

    5. 当我们返回c时,没有正则表达式可以知道类型 - 函数中新命名的类型,随机确定,并且每次执行都不同。

    6. 这假设问题是更一般的“可以javascript正则表达式找到泛型函数的返回类型。”请注意,如果可以找到返回类型,则可以告诉程序暂停(如果它不停止则不能返回,如果它永远不会停止,则返回类型必须是未定义的),停止问题仍未解决。

答案 1 :(得分:6)

不可以,仅使用RegEx以编程方式确定该函数的返回类型。为了理解该函数的作用,您需要解析其代码。但是,JavaScript是Chomsky Type 2语法(context free grammar),RegEx是Chomsky Type 3语法(regular grammar)。从根本上说,使用RegEx解析JavaScript太复杂了。

如果您只是试图处理您将该功能作为文本并且需要对其进行评估这一事实,则可以使用the eval() function

答案 2 :(得分:1)

答案是否定的。由于返回类型是根据Math.random()的结果确定的,因此直到运行时才知道Math.random()的结果。必须执行此特定函数才能知道返回类型。

答案 3 :(得分:0)

编辑基于OP的澄清:

您当然可以使用f3.toString()获取函数的文本。但是构建可靠的正则表达式来解析返回值类型将永远不可靠。函数中的最后一行可能会也可能不会返回值。在某些情况下,您在函数中间明确地具有return语句。你会怎么处理?在开发周期的剩余时间里,你最终会使正则表达式闪烁

因此,如果我理解正确,您需要确定调用后返回的值函数的类型。看起来有两种可能性:布尔值为true,字符串为' naaah'

您可以使用typeof运算符确定返回类型:



function f3() {
  return Math.random() > 0.5 ? Promise.resolve(true): 'naaah'
}
returnVal=f3()
if ((typeof returnVal)=='string')
  console.log("Got String)
if ((typeof returnVal)=='boolean')
  console.log("Got boolean")




如果你真的真的想用正则表达式来确定返回类型:

function f3() {
  return Math.random() > 0.5 ? Promise.resolve(true): 'naaah'
}
returnVal=f3().toString()
var regex = /^naaah$/;
if (regex.test(returnVal))
  console.log("Got String)
else 
  console.log("Got boolean")

答案 4 :(得分:0)

您可以使用.toString()将函数转换为字符串.replace()RegExp /Math\.random\(\)\s[>]\s0\.5/来获取Math.random() > 0.5部分函数,​​我们在替换函数中调用使用.replace()构造函数的Function

因为调用f3的那一部分没有区别,我们只需要Boolean的{​​{1}}结果来促进条件运算符结果。

我们再次使用Math.random() > 0.5检查RegExp仅使用Math.random() > 0.5/return\strue/返回的功能部分,并获取预期类型RegExp.prototype.test() }或Promise

然后我们再次使用String构造函数,传递Function,确信我们在调用时预测了函数return f3的返回类型。

f3