Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 修改值-按引用传递_Javascript_Node.js - Fatal编程技术网

Javascript 修改值-按引用传递

Javascript 修改值-按引用传递,javascript,node.js,Javascript,Node.js,修改通过引用传递的CalculateNetotals()中的值是否是一种不良做法?如果是,我是否需要克隆一行然后返回 示例演示如下: const数据={ 线路:[ { 标题:“第一项”, 大小:“大”, ProductId:“5535-43”, 价格:10,, 总税项:0, 不含税总额:0, 税项:0, 税率:20,, 数量:2, } ] }; 函数计算数据(数据){ for(数据行的常量行){ 计算总计(行); } 返回数据; } 函数计算器计算器(行){ 常量数量=行数量 常量价格=行价格

修改通过引用传递的
CalculateNetotals()
中的值是否是一种不良做法?如果是,我是否需要克隆一行然后返回

示例演示如下:

const数据={
线路:[
{
标题:“第一项”,
大小:“大”,
ProductId:“5535-43”,
价格:10,,
总税项:0,
不含税总额:0,
税项:0,
税率:20,,
数量:2,
}
]
};
函数计算数据(数据){
for(数据行的常量行){
计算总计(行);
}
返回数据;
}
函数计算器计算器(行){
常量数量=行数量
常量价格=行价格;
const taxRate=line.TaxPercent;
const totalIncTax=价格*数量;
const TotalExclutax=totalIncTax/(税率+100)/100);
施工税=(totalIncTax-TotalExclutax);
line.TotalIncTax=TotalIncTax;
line.totalExclutax=totalExclutax;
行。税=税;
回流线;
}
console.log(calculateData(数据))
修改通过引用传递的
CalculateNetotals()
中的值是否是一种不良做法

不一定。这取决于您的应用程序用例。如果你不需要原始数据进一步向下,完全可以对其进行变异。在您的示例中,写入的属性看起来是空的(值为
0
),可以使用一个填充结果的函数。尽管如此,命名和记录相应的变异函数是一种很好的做法。您甚至可以删除
return
值,以向调用者表明他不会获得新值

如果是,我是否需要克隆一行然后返回

是的,尽管使用现代ES6语法,它不是“克隆”,而是创建一个全新的对象

function calculateLineTotals(line) {
  const {Qty: qty, Price: price, TaxPercent: taxRate} = line;

  const totalIncTax = price * qty;
  const totalExclTax = totalIncTax / ((taxRate + 100) / 100);
  const tax = (totalIncTax - totalExclTax);

  return {...line, TotalIncTax: totalIncTax, TotalExclTax: totalExclTax, Tax: tax};
}

function calculateData(data) {
  return {lines: data.lines.map(calculateLineTotals)};
}

这取决于下游是否会介意这些变化。您正在对源代码进行变异,可能是好的(清除/有用的),也可能是坏的(破坏性的/混乱的)。@dandavis您能提供示例回答如何避免对源代码进行变异吗用于显示的简单一级对象代码。如果深入,那么您希望使用
line=JSON.parse(JSON.stringify(line))
代替顶行。谢谢Bergi。您知道我如何单独提取每个计算,例如
const totalexclustax=totalIncTax/((税率+100)/100)这样就可以使用jest进行测试了?其次,我可以遵循什么样的设计模式?在
calculateLineTotals()
中需要大量的映射和计算,比如说30个字段。将它们分解成更小的函数,这些函数完成部分逻辑,或者彼此之间的关系更密切()。不,没有理由把它分成单独的陈述。您仍然可以使用类似于
expect(calculateLineTotals({…})).toHaveProperty(“TotalExclutax”,…)
的东西来测试这一点。