修改值-通过引用传递

时间:2019-09-17 20:55:58

标签: javascript node.js

修改引用传递的calculateLineTotals()中的值是否是错误的做法?如果是这样,我是否需要克隆一行然后返回它?

以下示例示例:

const data = {
  lines: [
    {
      Title: "Item One",
      Size: "Large",
      ProductId: "5535-43",
      Price: 10,
      TotalIncTax: 0,
      TotalExclTax: 0,
      Tax: 0,
      TaxPercent: 20,
      Qty: 2,
    }
  ]
};

function calculateData(data) {
  for(const line of data.lines) {
    calculateLineTotals(line);
  }

  return data;
}

function calculateLineTotals(line) {
  const qty = line.Qty
  const price = line.Price;
  const taxRate =  line.TaxPercent;

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

  line.TotalIncTax = totalIncTax;
  line.TotalExclTax = totalExclTax;
  line.Tax = tax;

  return line;
}

console.log(calculateData(data));

1 个答案:

答案 0 :(得分:1)

  

修改引用传递的calculateLineTotals()中的值是否是错误的做法?

不一定。这取决于您的应用程序用例。如果您仍然不需要原始数据,则对它进行突变是完全可以的。在您的示例中,写入的属性看起来是 empty (值为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)};
}