覆盖函数参数值是一种好习惯吗?

时间:2019-07-07 10:32:37

标签: javascript

在JavaScript中,请考虑我试图附加一个新值并返回它。

下面是有关覆盖参数值的示例

下面的函数接收一个字符串值作为参数,并用新值覆盖该参数并返回它。

function test(value) {
  value = value + "hi";
  return value;
}
console.log(test("Hello"));

下面的函数接收一个字符串值作为参数。我想附加一个新值并返回它。因此,我将值分配给了局部变量,然后将Strong附加到了新变量上并返回了它。

function test(value) {
  let temp = value;
  temp = value + "hi";
  return temp;
}
console.log(test("Hello"));

我正在调用它并传递值

  test(“Hello”);

从上方推荐哪个?

5 个答案:

答案 0 :(得分:3)

这完全是风格问题。有些人认为您应该不理会参数值,而其他人则认为可以更改它们。¹

从实际角度看,它不会造成任何伤害。也就是说,这样做没有任何隐藏的副作用。特别是,由于JavaScript纯粹是按值传递,因此重新分配参数不会对用于填充该参数的任何参数产生任何影响:

function test(value) {
    value = value + "hi";
    return value;
}

let a = "let's say ";
let b = test(a);
console.log(b);       // "let's say hi"
console.log(a === b); // false, `a` was not modified

您使用temp的版本可以更简单:

function test(value) {
    let temp = value + "hi";
    return temp;
}

(甚至

function test(value) {
    return value + "hi";
}

,但我认为此问题已高度简化。)


¹(我碰巧是在后一个营地,但那儿不在那儿。)

答案 1 :(得分:1)

是的,这完全没有错,通常是由许多程序员使用多种语言完成的。这是一种常见的做法。

如果要在函数中使用参数值但对其进行某些修改后,可以使用它。

例如,我可能想使用函数add(a, b)加两个数字,其中ab可以是stringsintegers或{{1 }}。

但是为了确定这一点,我可以通过以下方式定义floats函数:

add

并且完全很好。这样,我始终可以确定不会抛出异常,或者如果参数以function add(a,b) { a = parseFloat(a); b = parseFloat(b); return a + b; } 的形式传递,则实际上它不会返回strings(如果我说过12)应该是add(1,2)

通过重写参数并将其合并到您的编码样式中,您可以避免浏览器创建或定义新变量,而只是修改这些变量值。这在小型应用中可能没有多大意义,但是在大规模的大型应用中,尤其是在低端设备上,这可能会产生明显的不同。

答案 2 :(得分:1)

简单的答案是:这只是样式问题。

但是,这并非总是 。传递对象时,它们 将通过引用传递,这意味着您对参数所做的每次更改都会影响原始对象:

const obj = {originalValue: true};

function modifyObject(input) {
  input.originalValue = false; // The change happens here
  return input;                // So it will take place regardless of this line
}

console.log('before:', obj);
modifyObject(obj);             // See? we don't even retrieve the return value
console.log('after:', obj);

答案 3 :(得分:0)

如果我们在谈论Java,那么创建一个新变量将是一个好习惯。因为有一种叫做垃圾收集器的东西,可以收集未使用的变量等并丢弃它们。因此,保持到原始变量的链接将不允许收集器丢弃该变量。 (我在某处阅读过此书,但有人对我说,它并不是真的可以这样工作,所以如果需要,可以在线阅读更多内容)

但是,在JavaScript中,这并不重要。这取决于你。你的风格。它也取决于情况,因为有时可能会有用。但是,实际上并不重要。随便做。

如果要简化它,可以按照@ T.JCrowder所说的做:

from collections import Counter

def most_occurring_char(string):
    counter = Counter(string)
    max_char_count = max(counter.values())
    is_unique = len([char_count for char_count in counter.values() if char_count == max_char_count]) == 1
    if is_unique:
        char = [char for char, count in counter.items() if count == max_char_count][0]
        return char        
    return None

# Tests
assert most_occurring_char('abac') == 'a'
assert most_occurring_char('abab') is None

就是这样。

答案 4 :(得分:0)

使用ES6模板文字

function test(value){
return `${value} hi`;
}