jsスタックの理解、浅いコピーと深いコピーを実現します.

2355 ワード

1.スタックとは
ヒープ(heap)はデータタイプ(配列、オブジェクト、関数)を参照して空間を割り当て、プログラマによってリリースされ、スタックメモリからヒープメモリのデータ構造を指す.スタック(stack)は、基本的なデータタイプを保存するために、コンパイラによって自動的に割り当てられて解放され、先進的なデータ構造の一種である.
2.スタックの例:
2.1スタック:基本データタイプ、5種類のデータタイプ:Boolean、Number、String、Udefined、Null.
1.var a=2
スタックメモリ
a.
2
2.var b=a
スタックメモリ
a.
2
b
2
スタックメモリのbはaをコピーしていますが、新たにスタックのキューを作成しました.
2.2ヒープ:参照データタイプ、3種類のデータタイプ:配列、オブジェクト、関数.
1.var obj 1={name:'limi'}
スタックメモリ
Obj 1
ポインタ
メモリ
{name:''limi'}
2.var obj 2=obj 1
スタックメモリ
Obj 1
ポインタ
Obj 2
ポインタ
メモリ
{name:''limi'}
データタイプを参照してコピーすると、スタックメモリには2つのポインタがありますが、彼らが指しているのは同じメモリの積み重ねです.問題は、Obj 2のオブジェクトに変数が発生すると、同じobj 1も同じ対象を指すために変更されます.
3.浅いコピーと深いコピー
目的:参照データタイプのデータスタックのメモリが同じヒープメモリを指す問題を解決します.3.1コピー
    var obj = {
         num:1,
         array : ['miss', 'alias']
     }
    function shallowCopy(object) {
       var map = {};
       for (var i in object) { 
          map[i] = object[i];
       }
       return map;
    }

  var newObj = shallowCopy(obj)
  newObj.name = '  '
  newObj.array.push('wuli') 
  console.log(newObj) //{ ["miss", "alias", "wuli"], name: "  ", num: 1}
  console.log(obj)//{ ["miss", "alias", "wuli"],  num: 1}
この時、浅いコピーは基本的なデータのタイプに対して変えないことができますが、引用データの種類によっては同じように上の方向に問題があります.この時、解決策としては、参照タイプが参照タイプの中の基本的なデータのタイプに対してもう一度浅いコピーをすることによって、深くコピーすることです.
3.2ディープコピー
    var obj = {
         num:1,
         array : ['miss', 'alias']
     }
   function shallowCopy(object, map) {
    var map = map || {};
    for (var i in object) { 
      if (typeof object[i] === 'object') {
        map[i] = (object[i].constructor === Array) ? [] : {};
        shallowCopy(object[i], map[i]);
      } else {
        map[i] = object[i];
      }  
    }
    return map;
  }

  var newObj = shallowCopy(obj)
  newObj.name = '  '
  newObj.array.push('wuli') 
  console.log(newObj) //{ ["miss", "alias", "wuli"], name: "  ", num: 1}
  console.log(obj)//{ ["miss", "alias"],  num: 1}
深くコピーするのは浅いコピーの再帰的な実現に相当しますが、ここではimmer.jsをより簡単に実現しました.深度コピー機能に相当し、性能最適化した方案です.
これで終わります.