JavaScript函数更改对象参数和所有相关变量

JavaScript函数更改对象参数和所有相关变量,javascript,object,Javascript,Object,链接:如果需要,这些只是主代码的链接。第一个链接是源,第二个链接是运行环境 功能博览会有一个非常关键的问题。我将解释它的作用,然后我将解释确切的问题以及我试图解决的问题。因此,该函数用于计算长达264-1位的指数。(答案)它通过多次运行乘法函数(在第196-197行:final=multi(num1,num1);For(var i=“2”;isLessThan(i,num2);i=add({num:i.split(“”),isNeg:false,decimals:0},{num:[“1”],is

链接:如果需要,这些只是主代码的链接。第一个链接是源,第二个链接是运行环境

功能博览会有一个非常关键的问题。我将解释它的作用,然后我将解释确切的问题以及我试图解决的问题。因此,该函数用于计算长达264-1位的指数。(答案)它通过多次运行乘法函数(在第196-197行:
final=multi(num1,num1);For(var i=“2”;isLessThan(i,num2);i=add({num:i.split(“”),isNeg:false,decimals:0},{num:[“1”],isNeg:false,decimals:0}))final=multi(final,num1);

您看到的对象被传递到
isLessThan()
函数中,这些对象就是我将预解析的数字传递给函数的例子,而不必重新解析它们并占用计算机资源。传递预解析对象就是错误所在。在第197行,您可以看到
final=multi(final,num1)
由于明显的原因,
final
变量没有预先解析,但num1是。但是,如果您进入chrome调试器并查看
num1
变量,则
multi()
函数会将属性
num1.num
的内容从(如果您执行了264)从
[“2”]
更改为
[“0”,“2”]
,从而导致错误答案

我已经测试过强制删除此行为是针对
multi
函数的,但它不应该修改参数。我尝试过用const将变量命名为其他名称,并尝试将对象设置为只读,但没有任何效果。我甚至试过这样的方法:

num1save = num1;
final = multi(num1, num1);
for (var i="2"; isLessThan(i, num2); i=add({num:i.split(""),isNeg:false,decimals:0}, {num:["1"],isNeg:false,decimals:0})) {
    final = multi(final, num1);
    num1 = num1save;
}
但是,不知何故,该变量设法更改num1save。在某个点引用到对象的任何变量都将更改。我不知道为什么会这样。第197行的
isLessThan()函数和变量
num2
也会发生同样的情况

这只包括所需的代码,因此这些行不匹配:

//根据Apache许可证2.0版(“许可证”)获得许可;除非遵守许可证,否则不得使用此文件。您可以通过以下方式获得许可证副本:http://www.apache.org/licenses/LICENSE-2.0
// https://github.com/VirxEC/CalcPlus/blob/master/LICENSE
函数parseNums(num1pre、num2pre、mode){
if([“string”,“object”].indexOf(typeof num1pre)==-1)抛出新的TypeError(“第一个数字不是字符串(或对象)。它必须是字符串(或对象)。请注意,对象输入需要提交预解析的数字。”);
if([“string”,“object”].indexOf(typeof num2pre)==-1)抛出新的TypeError(“第二个数字不是字符串(或对象)。它必须是字符串(或对象)。请注意,对象输入需要提交预解析的数字。”);
if(typeof mode!=“number”|[1,2,3,4,5].indexOf(mode)==-1)抛出新的TypeError(“模式必须是1-5之间的数字”);
var num1=num1pre,
num2=num2pre,
skip=false,
stringMode1=true,
stringMode2=true,
负=[假,假,假],
十进制=0,
小数点1=0,
小数点2=0,
num1pos、num2pos、maxChar、numl;
如果(num1.num!=未定义)neg[1]=num1pre.isNeg,小数1=num1pre.decimals,num1=num1pre.num,stringMode1=false;
如果(num2.num!=未定义)neg[2]=num2pre.isNeg,小数2=num2pre.decimals,num2=num2pre.num,stringMode2=false;
如果(stringMode1&&num1.split(“-”).length==2)num1=num1.split(“-”[1],则neg[1]=true;
如果(stringMode2&&num2.split(“-”).length==2)num2=num2.split(“-”[1],则neg[2]=true;
如果(neg[1]!=neg[2]&&mode!=1&&mode!=2)neg[0]=true;
如果(stringMode1)num1=num1.split(“”).filter(w=>w!=“,”);
如果(stringMode2)num2=num2.split(“”).filter(w=>w!=“,”);
num1pos=num1.indexOf(“.”),decimal1=num1pos!=-1?num1.filter(w=>w!=”).length-num1pos:0,num2pos=num2.indexOf(“.”),decimal2=num2pos!=-1?num2.filter(w=>w!=”).length-num2pos:0,decimal=mode==1 | mode==2?数学最大值(DECIMAX1,DECIMAX2):mode==3?DECIMAX11+DECIMAX2=2(num1.长度,num2.长度);
对于(var i=0;!skip&&num2.length==maxChar&&i+num1[i])负[0]=true,则skip=true;
如果(十进制<0)十进制=0;
如果(maxChar==num2.length&&mode==3)num1=[num2,num2=num1][0]
if(小数1!=小数2&[1,2].indexOf(mode)>-1){
如果(小数1==小数)
对于(var i=0;i-1){
numl=[num1.length,num2.length];
if(maxChar==numl[0])
对于(var i=0;i(e==true)))neg[0]=false;
返回{
num1:{
num:num1,
isNeg:neg[1],
小数:小数1
},
num2:{
num:num2,
isNeg:neg[2],
小数:小数2
},
isNeg:neg[0],
maxChar:maxChar,
小数:十进制
};
}
函数格式nums(final、decimals、neg){
if(typeof final==“string”){
如果(小数>0){
final=final.split(“”);
最终拼接(最终长度-小数,0,“.”;
final=final.join(“”);
}
}else if(typeof final==“object”){
如果(小数>0){
final=final.reverse();
最终拼接(最终长度-小数,0,“.”;
final=final.join(“”);
}else final=final.reverse().join(“”);
}
最终=负[0]?“-”+最终:最终;
final=[“”,“,”-“])。indexOf(final)>-1?“0”:final;
返回最终结果;
}
函数add(){
函数tempadd(n
var num1save = JSON.parse(JSON.stringify(num1));
var num2save = JSON.parse(JSON.stringify(num2));
num1 = JSON.parse(JSON.stringify(num1save));
num2 = JSON.parse(JSON.stringify(num2save));