JSの中のメモリとスタックのメモリを簡単に分析します.
2817 ワード
最近はチームの中のオーディエンスの面接についてこんな問題がありました.
Q:var、let、constの違いを説明します.
A:balabalabalabla…
Q.const定義の値を変更できますか?
A:私をからかう?できないでしょう
みなさんはどう思いますか?答えは部分的に変えられますが、部分的には変えられません.const定義の基本タイプは変更できませんが、定義の対象はオブジェクト属性を変更するなどの方法で変更できます.のように
jsの中のヒープメモリとスタックメモリ
jsエンジンにおける変数の格納は主に二つの位置があり、メモリとスタックメモリがあります.
Javaのメモリ処理と同様に、スタックメモリは主にボア、Number、String、Unidefined、Null、*およびオブジェクト変数のポインタを格納するために使用され、この時点でスタックメモリは線形配列の空間のように感じられ、各セルの大きさはほぼ同じである.
また、ヒープメモリは主にオブジェクトObjectのような変数タイプの記憶を担当しています.
スタックメモリの変数は一般的に既知のサイズまたは範囲の上限があり、簡単な記憶としてカウントされます.ヒープメモリに格納されているオブジェクトタイプのデータは、サイズについては一般的に未知です.個人的には、なぜnullがobjectタイプの変数としてスタックメモリに保存されているのかと考えています.
したがって、私たちがconstオブジェクトを定義するとき、私たちが話している定数はポインタであり、constオブジェクトに対応するメモリの指し方は不変ですが、メモリの中のデータ自体の大きさや属性は可変です.const定義の基礎変数に対して、この値はconstオブジェクトのポインタに相当し、可変ではない.
constがメモリに保存されていることを知っている以上、const、letが定義している変数は2回定義できないプロセスも容易に推測できます.毎回constまたはletを使って一つの変数を初期化すると、まず現在のメモリスタックを巡回して、重名変数があるかどうかを確認します.
ここでは、非常に無視しやすい点があります.これまでも自分では気づかなかったのですが、newキーワードを使って初期化した後はスタックメモリに保存されていません.なぜですか?newみんなはすべて知っていて、構造関数によって新しい実例を生んで、この時に発生するのは対象で、基本的なタイプではありません.もう一つの例を見ます
ここで、もう一回考えてみてください.私たちがよく話している値の種類と引用のタイプは実はスタックメモリ変数とメモリ変数です.また、値の伝達と引用伝達、深コピーと浅いコピーを考えてみてください.全部スタックメモリをめぐって展開します.一つは処理値です.一つは処理ポインタです.
メモリ割り当てとゴミ回収
一般的にスタックメモリは線形秩序記憶であり、容量が小さく、システム割当効率が高い.メモリを蓄積するには、まずメモリの中に記憶領域を新たに割り当てる必要があります.その後、スタックメモリにポインタを保存します.効率は相対的に低くなります.ごみの回収の方面、スタックのメモリの変数はほぼ使い終わって回収して、メモリの中の変数を押して多くの不確定な引用が存在するため、すべての呼び出しの変数がすべて廃棄した後にようやく回収することができます.
続けて考えてみると、その中にはまだたくさんのことを学ばなければならないので、今日はここに来て、あとで補充します.
ところで~NaNもメモリに保存されているのではないですか?皆さん、考えてみましょう.皆さん、一緒に討論しましょう.
Q:var、let、constの違いを説明します.
A:balabalabalabla…
Q.const定義の値を変更できますか?
A:私をからかう?できないでしょう
みなさんはどう思いますか?答えは部分的に変えられますが、部分的には変えられません.const定義の基本タイプは変更できませんが、定義の対象はオブジェクト属性を変更するなどの方法で変更できます.のように
>>> const a = 1
>>> a
<<< 1
>>> a = 2
<<< VM1750:1 Uncaught TypeError: Assignment to constant variable.
at :1:3
(anonymous) @ VM1750:1
>>> const b = {}
>>> b
<<< {}
>>> b.name = 1
>>> b
<<< {name: 1}
>>> b = {}
<<< VM1785:1 Uncaught TypeError: Assignment to constant variable.
at :1:4
constは定数を定義しているのではないですか?どうして変えられますか?これが今日私たちが話すポイントです.jsの中のヒープメモリとスタックメモリ
jsエンジンにおける変数の格納は主に二つの位置があり、メモリとスタックメモリがあります.
Javaのメモリ処理と同様に、スタックメモリは主にボア、Number、String、Unidefined、Null、*およびオブジェクト変数のポインタを格納するために使用され、この時点でスタックメモリは線形配列の空間のように感じられ、各セルの大きさはほぼ同じである.
また、ヒープメモリは主にオブジェクトObjectのような変数タイプの記憶を担当しています.
スタックメモリの変数は一般的に既知のサイズまたは範囲の上限があり、簡単な記憶としてカウントされます.ヒープメモリに格納されているオブジェクトタイプのデータは、サイズについては一般的に未知です.個人的には、なぜnullがobjectタイプの変数としてスタックメモリに保存されているのかと考えています.
したがって、私たちがconstオブジェクトを定義するとき、私たちが話している定数はポインタであり、constオブジェクトに対応するメモリの指し方は不変ですが、メモリの中のデータ自体の大きさや属性は可変です.const定義の基礎変数に対して、この値はconstオブジェクトのポインタに相当し、可変ではない.
constがメモリに保存されていることを知っている以上、const、letが定義している変数は2回定義できないプロセスも容易に推測できます.毎回constまたはletを使って一つの変数を初期化すると、まず現在のメモリスタックを巡回して、重名変数があるかどうかを確認します.
ここでは、非常に無視しやすい点があります.これまでも自分では気づかなかったのですが、newキーワードを使って初期化した後はスタックメモリに保存されていません.なぜですか?newみんなはすべて知っていて、構造関数によって新しい実例を生んで、この時に発生するのは対象で、基本的なタイプではありません.もう一つの例を見ます
var a = new String('123')
var b = String('123')
var c = '123'
console.log(a==b, a===b, b==c, b===c, a==c, a===c)
>>> true false true true true false
console.log(typeof a)
>>> 'object'
newはStringで、対象が出てきますが、直接字面の量の割り当てと工場のパターンが出てくるのは文字列です.しかし、上記の分析サイズによっては、相対的に固定されています.対象であっても、スタック内に記憶されています.例えば、nullは、なぜこれは違いますか?続きを見ますvar a = new String('123')
var b = new String('123')
console.log(a==b, a===b)
>>> false false
明らかに、a、bがスタックメモリに記憶されているなら、両者は明らかに等しいはずであり、null==nullがtrueであるように、しかし結果は両者は等しくなく、両者がヒープメモリに記憶されているということで、ポインタが一致しないことを示している.ここで、もう一回考えてみてください.私たちがよく話している値の種類と引用のタイプは実はスタックメモリ変数とメモリ変数です.また、値の伝達と引用伝達、深コピーと浅いコピーを考えてみてください.全部スタックメモリをめぐって展開します.一つは処理値です.一つは処理ポインタです.
メモリ割り当てとゴミ回収
一般的にスタックメモリは線形秩序記憶であり、容量が小さく、システム割当効率が高い.メモリを蓄積するには、まずメモリの中に記憶領域を新たに割り当てる必要があります.その後、スタックメモリにポインタを保存します.効率は相対的に低くなります.ごみの回収の方面、スタックのメモリの変数はほぼ使い終わって回収して、メモリの中の変数を押して多くの不確定な引用が存在するため、すべての呼び出しの変数がすべて廃棄した後にようやく回収することができます.
続けて考えてみると、その中にはまだたくさんのことを学ばなければならないので、今日はここに来て、あとで補充します.
ところで~NaNもメモリに保存されているのではないですか?皆さん、考えてみましょう.皆さん、一緒に討論しましょう.