Javascript passing arrays to functions by value, leaving original array unaltered

前端 未结 9 1867
不思量自难忘°
不思量自难忘° 2020-11-28 11:01

I\'ve read many answers here relating to \'by value\' and \'by reference\' passing for sending arrays to javascript functions. I am however having a problem sending an array

9条回答
  •  刺人心
    刺人心 (楼主)
    2020-11-28 11:27

    A generic solution would be...

    // Use the JSON parse to clone the data.
    function cloneData(data) {
      // Convert the data into a string first
      var jsonString = JSON.stringify(data);
    
      //  Parse the string to create a new instance of the data
      return JSON.parse(jsonString);
    }
    
    // An array with data
    var original = [1, 2, 3, 4];
    
    function mutate(data) {
      // This function changes a value in the array
      data[2] = 4;
    }
    
    // Mutate clone
    mutate(cloneData(original));
    
    // Mutate original
    mutate(original);
    

    This works for objects as well as arrays.

    Very effective when you need deep cloning or you don't know what the type is.

    Deep cloning example...

    var arrayWithObjects = [ { id: 1 }, { id: 2 }, { id: 3 } ];
    
    function mutate(data) {
      // In this case a property of an object is changed!
      data[1].id = 4;
    }
    
    // Mutates a (DEEP) cloned version of the array
    mutate(cloneData(arrayWithObjects));
    
    console.log(arrayWithObjects[1].id) // ==> 2
    

    Warnings

    • Using the JSON parser to clone is not the most performant option!

    • It doesn't clone functions only JSON supported data types

    • Cannot clone circular references

提交回复
热议问题