правильные копии или ссылки, распространяемые при деструкции и распространении в javascript - PullRequest
0 голосов
/ 25 апреля 2020

Я пришел к любопытному моменту в приложении, которое писал некоторое время, и хотел бы узнать немного больше. К сожалению, переписывание является большим, и настроить тест, чтобы понять это прямо сейчас, немного сложно, но это будет зависеть от того, как обращаться с конечным продуктом senario. Мой пример не является точным кодом, но должен описывать поток. Я почти уверен, что в результате я получу правильные копии (которые я бы не предпочел) из-за распространения, но мое любопытство заключается в том, что в зависимости от того, что «распространяется» на объект перед его передачей, и глубины ценность идет (функции могут быть переданы) Я, вероятно, узнаю через час или два, каким образом я должен это сделать, но я понял, какого черта, почему бы не бросить ее в стек и посмотреть, что у великих волшебников есть сказать.

Вот случай:

const state = { a: [1], b: [2], c: [3]};

function foo(a){
     a.push(Math.floor(Math.random()*1000));        
}
function bar(o){
     Object.keys(o).forEach(k => {
          foo(o[k]);
     })
}

while(true){
      const o = {...state};

      bar(o);
}

Теперь за пределами очевидной бесконечности l oop и тривальной природы примера, которая является основами.

Я полагаю, что на каждой итерации его состояние out будет исходным объектом и потребует, чтобы произведение 'bar' было возвращено назад и было установлено состояние, подобное следующему, чтобы иметь возможность вносить какие-либо изменения в объекты в объекте.

function bar(o){
     Object.keys(o).forEach(k => {
         foo(o[k]);
     })
}

while(true){
      const o = {...state};
      bar(o);
      state = o;
}

||

function bar(o){
     Object.keys(o).forEach(k => {
         foo(o[k]);
     })
     reutrn o;
}

while(true){
      const o = {...state};
      state = bar(o);
}

, хотя я не совсем уверен, что второй будет работать, так как я не выполнял код явно, но это больше начальный случай Ульд никогда не обновляет основное состояние, где делают два других. В этом небольшом примере я понимаю, что он может иметь не совсем смысл, а основываться на условном выборе того, что из объекта использовать. настроить его в отдельном объекте, передав его, выполнив необходимые для него опции, а затем отразить это в первичном объекте. Теперь другое, чем распространение значений, создание объектов без него, которые будут переданы в группу функций, были бы не очень хороши, так как в конечном итоге вам нужно было бы определять все вручную, но при этом вы будете иметь ссылки, противоположные правильные копии, которые затем сплавят первый, который будет работать с этим параметром в первой строке l oop.

const o = {
      a: state.a,
      b: state.b,
      c: state.c,
};

Наконец. Если мои наблюдения верны (если в моих примерах есть какие-то незначительные ошибки кодирования, я извиняюсь за визуальную ссылку на то, о чем я говорю), каковы другие способы, позволяющие объединить данные объекта и сохранить ссылки нетронутыми? Это единственное решение, просто написание функции, которая устанавливает o = {key: state [otherKey]}, чтобы ссылки оставались нетронутыми

. Еще раз прошу прощения, если это не подходящий вопрос для стека. Я размышляю вслух, это заставило меня задуматься, как я уже сказал, я, вероятно, узнаю через несколько часов, но, возможно, у кого-то есть какой-то лучший способ организовать и обработать такие аргументы, пытаясь сохранить эти ссылки в переменных, которые передаются через 4 или 5 вызовов функций, поэтому нет необходимости возвращать данные и устанавливать их явно. Даже если подумать, я полагаю, что это может быть просто практикой программирования в целом, так как найти установщик может быть трудно отладить, и приложение также тогда будет глубоко связано.

РЕДАКТИРОВАТЬ:

while(true){
  const {a, b, c} = state;

  foo(a);
  foo(b);
  foo(c);
      //would also need to be store back in state after modification if im not mistaken
}
...