ホームページ >ウェブフロントエンド >jsチュートリアル >JSのメモリライフサイクル、スタックメモリとヒープメモリ、JSシリーズの深いコピーと浅いコピーを1枚の紙で理解する(2)
先頭に書いてください: javascript 列の下に、これは私がこれから書き始めようとしているシリーズです。主にフレームワークが横行する時代に、仕事中にもかかわらずフレームワークを使用していますが、面接や技術向上のために基礎となるJSの基礎知識はおまけであり、必ず習得しなければならない知識でもあります。車について詳しく知るためには、車の一般的な機能を習得するだけで十分です。しかし、車の知識があれば、同様に、より上手に運転することができます。もちろん、記事は一つの知識だけを語るのではなく、関連する知識が連続してつながっていくのが一般的で、自分の学びを記録しながら、自分の学びを共有し、励まし合いましょう!できれば、「いいね」もお願いします。あなたの「いいね」が更新の励みにもなります。
(固定サイズ) 、ボリューム 軽量、比較的シンプル)
(サイズは必ずしも確実ではありません。大きなスペースであり、比較的複雑です)
var a=true; //布尔型,基本数据类型var b='jack'; //字符型,基本数据类型var c=18; //数值型,基本数据类型var d={name:'jack'}; //对象,引用数据类型var d=[0,1,2,3,4,5]; //数组,引用数据类型复制代码
a 、
b 、
c がすべてであることがわかります。基本データ型
d と
e は両方とも参照データ型です。これらには格納方法に本質的な違いがあります。
基本データ型の値はスタック メモリに格納されますが、基本データ型の値はスタック メモリに格納されます。参照データ型の値はヒープ メモリに格納されます。スタック メモリはその参照 (つまり、ヒープ メモリ内のアドレス) のみをスタック メモリに格納します。その名前と同様、参照データ型 ##メモリ アクセスのメカニズム
var name='jack';var obj={ age:24};var nameCopy=name;var objCopy=obj; nameCopy='bob'; objCopy.age=15;console.log(name); //jackconsole.log(obj.age); //15复制代码
name
は影響を受けず、名前付けはobjCopy.age を変更するものであることがわかります。 , なぜまだ影響を受けているのでしょうか?
obj.age, これはダークコピーとシャローコピーの問題が原因です。下の図を見てみましょう
の 参照アドレス
が objCopy
にコピーされるため、2 つのオブジェクトは実際には同じオブジェクトを指します。 , 変更 objCopy は obj
の値も変更します。この状況を 浅いコピー
と呼びます。これはオブジェクトの参照をコピーするだけで、新しいファイルは開きません1. メモリが不足しており、コピー スペースが浅すぎます。 (浅いコピーは参照型でのみ発生します)
深いコピー
var name='jack';var obj={ age:24};var nameCopy=name;var objCopy=JSON.parse(JSON.stringify(obj)); nameCopy='bob'; objCopy.age=15;console.log(name); //jackconsole.log(obj.age); //24复制代码JSON.parse(JSON.stringify(obj))
による変換後、シャロー コピーは存在しなくなっていることがわかります。このウェーブは
ディープ コピー、ディープ コピー開発です新しいヒープ メモリ アドレスが取得され、オブジェクトの参照は新しく開かれたメモリ アドレスを指します。以前にコピーされたオブジェクトから完全に独立しています。自立しており、深くコピーされます。スキルを学び、スキルを学びます。の気持ち。
var objCopy=Object.assign({},obj); //对象深拷贝的方法 Object.assign var arrayCopy=array.concat(); //数组深拷贝的方法 concat() (数组无嵌套对象或者数组可用) var arrayCopy=array.slice(); //数组深拷贝的方法 slice() (数组无嵌套对象或者数组可用) JSON.parse(JSON.stringify(array)) //顺带提下,JSON.parse(JSON.stringify()) 数组和对象通用复制代码
接着上面的数组容易踩坑的地方 ,来看一个例子
var array = [{name: 'jack'}, ['old']];var arrCopy = array.concat(); arrCopy[0].name='new';console.log(array); // [{name: 'new'}, ['old']]console.log(arrCopy); // [{name: 'new'}, ['old']]复制代码
可以清楚地看到(数组无嵌套对象或者数组可用的情况下用 concat
和 slice
才有效)
更多相关免费学习推荐:javascript(视频)
以上がJSのメモリライフサイクル、スタックメモリとヒープメモリ、JSシリーズの深いコピーと浅いコピーを1枚の紙で理解する(2)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。