Безопасны ли массивы в качестве аргументов по умолчанию в Javascript?

Я перехожу на Javascript из Python. В Python, если вы используете список или словарь в качестве аргумента по умолчанию для функции, каждый вызов видит один и тот же объект. Итак, если у вас есть функция вроде:

def append_to_list(lst=[]):
  lst.append(1)
  return lst

а затем назовите это так:

lst1 = append_to_list()
lst2 = append_to_list()

lst2 будет иметь значение [1, 1] вместо просто [1]

Есть ли у Javascript такая же проблема с аргументами по умолчанию?


person hamdog    schedule 09.09.2019    source источник
comment
вы создаете новый массив каждый раз, когда вызывается функция. lst2 и lst1 будут двумя идентичными, но разными копиями массива. другими словами, нет.   -  person I wrestled a bear once.    schedule 09.09.2019
comment
Спасибо за подтверждение. Только что испытал себя. Был удивлен, что не смог найти подобный вопрос на SO, поэтому хотел опубликовать его в качестве краткого справочника.   -  person hamdog    schedule 09.09.2019
comment
зачем минусовать это?   -  person messerbill    schedule 09.09.2019
comment
Возможный дубликат Обрабатываются ли аргументы javascript лениво?   -  person Josh Lee    schedule 10.09.2019
comment
Я не думаю, что смогу угадать поведение в этом случае, основываясь на этом вопросе. Также это говорит о том, что JS охотно оценивает свои аргументы. Python оценивает свои аргументы по умолчанию во время определения функции, что также будет классифицироваться как нетерпеливое.   -  person hamdog    schedule 10.09.2019


Ответы (2)


Похоже, у него нет такой же проблемы. Тестирование с функцией:

function append_to_list(lst=[]) {
  lst.push(1)
  return lst
}

И вызов таким же образом возвращает [1] оба раза.

person hamdog    schedule 09.09.2019

В JS у вас нет такой функциональности, как в Python.

Предполагая, что вы используете ES6:

let appendToList = (a, b=[]) => {
  b.push(1);
  return b;
}

console.log(appendToList(1));
console.log(appendToList(2));

Выход:

> Array [1]
> Array [1]
person lmiguelvargasf    schedule 09.09.2019