Javascript JS中跳过名称的两部分代码之间的差异

Javascript JS中跳过名称的两部分代码之间的差异,javascript,diff,Javascript,Diff,我试图在模糊代码中找到一个差异,这意味着同一代码的变量/函数名称可能不同。 下面是一个例子: 代码A: 功能A(A){ var b=a*4; 控制台日志(b); } 代码B: 功能B(B){ var c=b*4+2; 控制台日志(c); } 因此,我想在代码的这些部分之间找到的唯一区别就是+2部分,而不是函数和变量名称的区别 正如@blex在评论中提到的,变量/函数名称并不重要,但逻辑更改确实重要。下面是另一个例子: 代码A: 功能A(A、b、c){ 返回a*b+c; } 代码B: 函数B

我试图在模糊代码中找到一个差异,这意味着同一代码的变量/函数名称可能不同。 下面是一个例子:
代码A:

功能A(A){
var b=a*4;
控制台日志(b);
}
代码B:

功能B(B){
var c=b*4+2;
控制台日志(c);
}
因此,我想在代码的这些部分之间找到的唯一区别就是
+2
部分,而不是函数和变量名称的区别

正如@blex在评论中提到的,变量/函数名称并不重要,但逻辑更改确实重要。下面是另一个例子:
代码A:

功能A(A、b、c){
返回a*b+c;
}
代码B:

函数B(x,y,z){
返回y*z+x
}
在本例中,我希望看到区别:
a*b+c
=>
y*z+x

这有可能吗?

这个怎么样

功能A(b){
var c=b*4+2;
返回(c)
}
职能B(B){
var c=b*4;
返回(c);
}

console.log(B(10)-A(4))
您可以使用类似的缩小库来生成一个损坏的输出,该输出应具有相同的函数和变量名:

const{minify}=Terser;
常数A=`函数A(A){
var b=a*4;
控制台日志(b);
}`
常数B=`函数B(B){
var c=b*4+2;
控制台日志(c);
}`
Promise.all([A,B].map(x=>minify(x,{mangle:{toplevel:true})))
.then(([A,B])=>console.log(`Calculate-between${A.code}和${B.code}`)

很难做到可靠。例如,如果函数采用了两个参数
(x,y)
,并且采用了
var z=x*2+y,该怎么办var z=y*2+x
x
y
已反转-未考虑变量名称更改)?如果您不关心变量名,那么很难发现这种变化。要发现它,您需要解析代码并对其进行分析。不仅仅是“diff”选项,还有一个选项是将代码作为一个实例来使用,并比较生成的树。这绝非小事,更像是一种理论上的可能性,但你可以利用这个想法。兴趣的一个可能实现是,但我自己并不熟悉。@blex,你说得对。我的问题不完全正确。我会尝试重新措辞。我不关心变量的名称,但我关心逻辑(顺序)。所以,如果逻辑发生了变化,我想知道它。@Etheryte非常感谢!我会检查的。我越想它,就越觉得它不可能100%可靠。使用@Etheryte或Guerric P的解决方案所建议的AST似乎很聪明,可以在基本用例中工作,但在更常见的用例中,您将无法可靠地将函数映射到彼此(如果它们在代码中移动、添加、更改…)。出于好奇,你能解释一下你为什么要这样做吗?也许还有另一种方法不幸的是,它对我没有帮助。我需要找到不同的源代码。源代码在哪里?源代码可以来自任何地方。这里有两个源代码示例,您不理解我的问题。我需要找到源代码的文本差异。如果添加了新行,我希望看到这种差异,如果函数被删除了,我也需要知道它。如果某个分支被添加到If语句中,我需要知道这一点。这个问题没有连接到一些特定的数字或值。我以前的评论是关于你最近的编辑…我想到了这个,但是它不会创造出不正确的函数名吗?例如,在代码中间插入了一个新函数?是的,在这种情况下它可能不起作用。我认为在您的用例中唯一的输入差异是静态的不幸的是,它是一个有数百个函数和IIFE的大型库。但我会努力的。非常感谢。那你就无法绘制地图了。你如何确定某个东西是新的还是重命名的?我的想法是这样的:如果有一个函数具有相同的内容但名称不同=它是相同的。就像Git做的一样。