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コピー
3.2ディープコピー
これで終わります.
ヒープ(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をより簡単に実現しました.深度コピー機能に相当し、性能最適化した方案です.これで終わります.