JavaScript はリテラルのスクリプト言語であり、型のサポートが組み込まれた、動的に型付けされた弱い型付けのプロトタイプベースの言語です。したがって、JavaScript は非常に基本的な知識であり、この記事では、JavaScript を必要とする友人が参照できるように、基本的なデータ型と参照データ型がどのように格納されているかを中心に紹介します。
基本データ構造
スタック
スタックは、セクション内での挿入または削除操作のみを許可する線形テーブルであり、先入れ後出しのデータ構造です。
Heap
Heapはハッシュアルゴリズムに基づいたデータ構造です。
Queue
Queue は先入れ先出し (FIFO) データ構造です。
JavaScript におけるデータ型の保存
JavaScript のデータ型は、基本データ型と参照データ型に分けられます。それらの違いの 1 つは、保存場所の違いです。
基本データ型
JavaScript の基本データ型は次のとおりであることは誰もが知っています:
String
Number
Boolean
Unknown
ヌル
シンボル (今は無視してください)
基本データ型は単純なデータセグメントであり、スタックメモリに格納されます。
参照データ型
JavaScript の参照データ型は次のとおりです:
Array
Object
参照データ型はヒープメモリに保存され、ペアをスタックに保存しますメモリ ヒープ メモリ内の実際のオブジェクトへの参照。したがって、JavaScript での参照データ型の操作は、実際のオブジェクトではなくオブジェクトへの参照に対して行われます。
スタックメモリにはアドレスが格納されており、このアドレスはヒープメモリ内の実際の値と関連付けられていることが分かります。
イラスト
それでは、いくつかの変数を宣言して試してみましょう:
var name="axuebin"; var age=25; var job; var arr=[1,2,3]; var obj={age:25};
次の図を使用して、メモリ内のデータ型の格納状況を表すことができます:
現時点ではname
,age
,job
3 つの基本データtype はスタック メモリに直接存在しますが、arr と obj はヒープ メモリへの参照を表すためにスタック メモリにアドレスを格納するだけです。
コピー
基本データ型
基本データ型の場合、コピーすると、システムはスタックメモリ内の新しい変数に新しい値を自動的に割り当てます。これは理解しやすいです。
参照データ型
配列やオブジェクトなどの参照データ型の場合、コピー時に違いが生じます。
システムはスタック メモリ内の新しい変数に値を自動的に割り当てますが、この値は単なる値です。アドレス。つまり、コピーされた変数は元の変数と同じアドレス値を持ち、ヒープ メモリ内の同じオブジェクトを指します。
表示されている場合、var objCopy=obj を実行した後、obj と objCopy は同じアドレス値を持ち、ヒープ メモリ内の同じ実際のオブジェクトを実行します。
違いは何ですか?
obj または objCopy を変更すると、別の変数が変更されます。
なぜですか?
なぜ基本データ型はスタック上に存在するのに、参照データ型はヒープ上に存在するのでしょうか?
ヒープはスタックより大きく、スタックの比較は高速です。
基本的なデータ型は比較的安定しており、使用するメモリは比較的少なくなります。
参照データ型のサイズは動的で無制限です。
ヒープ メモリは順序付けされていないストレージであり、参照に基づいて直接取得できます。
参考記事
jsのメモリ割り当てを理解する
プリミティブ値と参照値
ECMAScriptでは変数にプリミティブ値と参照値の2種類の値を格納できます。
プライマリ値とは、元のデータ型(基本データ型)を表す値、つまり、Unknown、Null、Number、String、Boolean 型で表される値を指します。
参照値とは、複合データ型、つまりオブジェクト、関数、配列、カスタムオブジェクトなどの値を指します。
スタックとヒープ
元の値に対応するメモリの構造は2つありますおよび参照値、つまりスタックとヒープ
スタックは後入れ先出しのデータ構造です。JavaScript では、スタックの動作は Array を通じてシミュレートできます
元の値は、に格納されている単純なデータです。スタック、つまり、値は訪問先の変数に直接保存されます。
ヒープはハッシュアルゴリズムに基づいたデータ構造であり、JavaScriptでは参照値がヒープに格納されます。
参照値はヒープに格納されているオブジェクトです。つまり、変数に格納されている値 (つまり、スタックに格納されているオブジェクトを指す変数) は、ヒープに格納されている実際のオブジェクトを指すポインタです。
例:var obj = new Object(); obj存储在栈中它指向于new Object()这个对象,而new Object()是存放在堆中的。
那为什么引用值要放在堆中,而原始值要放在栈中,不都是在内存中吗,为什么不放在一起呢?那接下来,让我们来探索问题的答案!
首先,我们来看一下代码:
function Person(id,name,age){ this.id = id; this.name = name; this.age = age; } var num = 10; var bol = true; var str = "abc"; var obj = new Object(); var arr = ['a','b','c']; var person = new Person(100,"笨蛋的座右铭",25);
然后我们来看一下内存分析图:
变量num,bol,str为基本数据类型,它们的值,直接存放在栈中,obj,person,arr为复合数据类型,他们的引用变量存储在栈中,指向于存储在堆中的实际对象。
由上图可知,我们无法直接操纵堆中的数据,也就是说我们无法直接操纵对象,但我们可以通过栈中对对象的引用来操作对象,就像我们通过遥控机操作电视机一样,区别在于这个电视机本身并没有控制按钮。
现在让我们来回答为什么引用值要放在堆中,而原始值要放在栈中的问题:
记住一句话:能量是守衡的,无非是时间换空间,空间换时间的问题
堆比栈大,栈比堆的运算速度快,对象是一个复杂的结构,并且可以自由扩展,如:数组可以无限扩充,对象可以自由添加属性。将他们放在堆中是为了不影响栈的效率。而是通过引用的方式查找到堆中的实际对象再进行操作。相对于简单数据类型而言,简单数据类型就比较稳定,并且它只占据很小的内存。不将简单数据类型放在堆是因为通过引用到堆中查找实际对象是要花费时间的,而这个综合成本远大于直接从栈中取得实际值的成本。所以简单数据类型的值直接存放在栈中。
相关推荐:
以上がJavaScript の基本的なデータ型の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。