[コアJS]1.データ型


JavaScriptのデータ型は大きく分けて2種類あります.
Primitive Type(ベーシックタイプ)/Reference Type(リファレンスタイプ).

基本タイプには、数値、文字列、boolean、null、undefined、symbol(ES 6に追加)が含まれます.
参照シェイプには、オブジェクト(配列、関数、正規表現など)が含まれます.
それらを区別する理由と違いは、メモリ内の各データの格納形式によって決定されます.

JavaScriptメモリ構造は、スタックメモリとスタックメモリ領域に分けられます.スタック領域には変数付きの基本データが格納され、ヒップホップ領域には参照データが格納されます.ここでは、この2つをメモリ全体として描きます.

きほんデータわりあてじゅん

var a;

宣言変数aは、メモリにデータが含まれる任意の空間(1003)を確保する.取得された空間の名前に識別子(a)を指定します.
a = 'abc';

コード実行時に割り当てられたコマンドが発生した場合、文字列「abc」は空白の他の任意のメモリ領域(5004)に保存される.このアドレスを持って、変数aが存在するアドレスに移動し、5004を値に入れる.
a = 'abcdef';

再割り当ては、新しいメモリに値を格納し、aを検索してアドレスを変更します.

参照によるデータの割当ての順序

var obj = {
  a: 1,
  b: 'bbb'
};
宣言および割当て変数は、基本タイプと同じです.コンピュータは、次のコードに示すように、宣言と割り当てを別々に実行します.
var obj;

obj = {
  a: 1,
  b: 'bbb'
};

宣言時、任意の空間(1002)の名前はobjである.値を割り当てるために任意のスペース(5002)が取得されたが、複数のデータが必要である.任意空間(7103~?)このスペースのデータを取得し、オブジェクトのプロパティとして指定します.名前にProperty名を指定し、任意の空間(5003)に値を割り当て、デフォルトの形状変数を指定するようにアドレスを指定します.5002のアドレスに値を割り当てた後、このアドレスを用いてobjに割り当てる.
obj.a = 2;

再割り当ての場合、任意の空間(5005)に値を指定し、objとすることができる.aを探す.次に、値を5005のアドレスに変更します.
ここで、基本型ではデータのアドレスが変更され、参照型ではobjのアドレスが保持されます.
var obj = {
  x: 3,
  arr: [3, 4]
};

配列も参照データであり、スペースを解放および割り当てることができます.
3のように繰り返し使用されるデータがある場合は、新しいメモリ(値を直接記憶するのではなく、値を記憶するアドレス)を消費することなく、アドレスを複数回参照することが特徴です.欠点は、特定の値を格納するときにこの値を使用したことがあるかどうかを判断する必要がありますが、同じアドレスを表示している場合は、同じ値を無条件に使用するため、比較にかかる時間が減少します.繰り返し使用頻度が高いほど、差が大きくなります.これは、割り当て速度が遅いが、比較を必要とせず、メモリの浪費を減らすことを意味します.これは、同じ値がメモリ領域全体に1つしか存在しないことを意味します.したがって,基本データを不変値と呼ぶ.
obj.arr = 'str';

文字列として再割り当てした後、文字列を新しいメモリに保存し、値を変更します.次に、参照カウントがゼロのデータはゴミ収集器によって削除されます.
var a = 10;
var b = a;
var obj1 = { c: 10, d: 'ddd' };
var obj2 = obj1;

基本タイプでも参照タイプでも、初期コピーの場合は同じ値になります.
b = 15;
obj2.c = 20;

変更すると、既定のシェイプの値はすぐに変更されますが、参照シェイプは同じ値(オブジェクト)を指します.
これは、オブジェクトのコピー後にコピーされたオブジェクトの値を変更すると、元のオブジェクトの値も変更されるためです.
解決策は、概念を新しいオブジェクトを作成するたびに不変のオブジェクトに関連付けることです.