blog

JSの世界とメモリー

コンピュータの電源がオンになると、電源はコンピュータ内のファームウェアに直接リンクされます。ファームウェアとは、ブートローダを含むコンピュータに組み込まれた記憶装置のことです。この時、このコンピュータ...

Feb 1, 2020 · 3 min. read
シェア

スイッチを入れるとどうなりますか?

コンピュータの電源がオンになると、その電源はコンピュータ内のファームウェアに直接リンクします。ファームウェアは、ブートプログラムを含むコンピュータに組み込まれた記憶装置です。このコンピュータ・システムが起動すると、オペレーティング・システムがメモリ内で起動します。

オペレーティング・システムが起動した後はどうなりますか?

1.オペレーティングシステムのカーネルは

2、初期化プロセスを開始、最初のプロセスのpid番号は1、各プロセスは独自の番号を持っています

3.すべてのプロセスがロードされた後、ユーザーのログインを待ちます。

4.ユーザーがログインすると、シェルが開かれます。シェルにはbashシェルがあり、ビューインターフェイスもシェルとみなすことができます。

5、シェルを実行すると、オペレーティングシステムと対話することができます

ブラウザを開くとどうなりますか?

ブラウザを開いた後、最初のすべてのブラウザプロセスをロードし、この時間は、メインブラウザプロセスに分割され、補助的なプロセスは、ユーザーが新しいテーブルバーページを開くと、また、プロセスを開きます。jsはシングルスレッドエンジンですが、レンダリングエンジンとの相互作用は、スレッド通信と呼ばれています。

主にjsエンジンについてお話ししましょう。

jsエンジンには関数が含まれています:

  • 実行可能コード
  • 最適化されたコード
  • ゴミ収集
  • コードのコンパイル

この実行コードの中身について詳しく教えてください。

まず、いくつかの事前準備が必要です:

ブラウザはwindowオブジェクト、documentオブジェクト、navigatorオブジェクト、Settimeoutなどを用意します。これらはブラウザに属するものであり、jsに属するものではありません。これらをruntime env(実行時環境)と呼びます。

jsコードが書かれると、ブラウザはjsエンジンを通して実行するためにそれをコンパイルします。

どこで実行されるのですか?

メモリ上で動いています。そうです オペレーティングシステムのように osは実際に動いているプログラムなのです

今メモリに何があるの?osや、ブラウザのプロセスなど様々なプロセスがあります。図にしてみましょう。

この時点で、メモリにはスタックとヒープという2つの領域があり、スタックはシーケンシャルな順序で、ヒープはランダムな分布で特徴付けられることがわかります。この時点で変数aをvarとします。

aが文字列や数値などの非オブジェクトの場合、このデータの内容はStack領域に格納され、変数名はDon't Know What領域に別途格納されます。

a がオブジェクトの場合、変数名 a は don't-know-what ゾーンに残り、オブジェクト・データはヒープ・ゾーンに置かれます。しかし、変数名とヒープ領域を接続するために、同時にスタック領域にアドレスが生成されます。

なぜそのような言い方をしたのですか?

オブジェクトはミュータブル(変更可能)であることが前提で、配列も含めて、自分自身を変更するプッシュ・メソッドを持っています。スタック領域に格納されているものは、スタック領域がシーケンシャルであるため、コンピュータの一番下は010101の数字であるとします。オブジェクトの値を変更するには、オブジェクトの下にいくつかのデータがある場合は、まずこれらのデータが010101が1つ下に戻って、データにデータを挿入するためにさせる必要があり、これは非常に遅い効率につながります。ヒープ領域の内容はランダムに配置されているので、一般的にそのような問題はありません。

var a=bどうなりますか?

(変数名とデータの関係がわかりましたね)。変数名は変数データを指します。

bがオブジェクトでない場合は、スタック内のbのデータをaにコピーします。

bがオブジェクトの場合、スタック領域内のbのデータをaにコピーします。

つまり、スタック領域の中身をコピーする点は同じですが、スタック内部の中身がデータであることと、アドレスであることが違うのです。そうすると、最終的にはオブジェクトが改ざんされていることがわかります。

var b={}; var a =b; b.name=1; console.log(a.name);// 1

window

ウィンドウオブジェクトがブラウザから与えられたものであることはご存知でしょう。では、このウィンドウの中には何があるのでしょうか?これを印刷してください。

まずはコンソール、オブジェクト、配列に集中してください。

プロトタイプは、オブジェクトのすべてのインスタンスに共通のプロパティとメソッドを保持します。これはプロトタイプと呼ばれ、オブジェクトのすべてのインスタンスで利用できるようにしてメモリを節約することが目的です。

インスタンス・オブジェクトとプロトタイプはどのようにリンクされているのですか?

答え: __proto__

新しいオブジェクトや配列などが生成されるたびに、このデフォルトが生成され、プロトタイプに接続されたアドレスが保持されます。通常、__proto__はインスタンスオブジェクトにぶら下がります。

なぜObjectとArrayにもあるのですか?

関数はオブジェクトでもあるので、ObjectとArrayはどちらもコンストラクタであり、当然この属性を持ちますが、Arrayの__proto__はObjectのPrototypeのアドレスを保存し、Objectの__proto__はnullを指します。

Read next

JavaScriptのパラメータ・パス

値が基本的なデータ型の場合、コピーとして関数に直接渡されます。 val => _val 値が複雑なデータ構造である場合、コピーはパフォーマンスの問題を引き起こし、関数内での修正は元の値に影響を与えます。 値がコピーされたデータ構造である場合、直接参照を渡すのではなく、値の参照のコピーを渡すことがわかります。 o.value...

Feb 1, 2020 · 1 min read