JavaScript】基本データ型と参照データ型の違い(およびString、Boolean、Numberの基本データ型に属性と方法がある理由)


基本データ型JavaScript基本データ型には、undefined、null、number、boolean、stringが含まれます.基本データ型は値によってアクセスされます.つまり、変数に保存されている実際の値を操作できます.
1)基本データ型の値は可変ではない
文字列などの基本的なタイプの値は、どの方法でも変更できません.
	var name = "change";
	name.substr();//hang
	console.log(name);//change
	
	var s = "hello";
	s.toUpperCase()//HELLO;
	console.log(s)//hello

この2つの例では、元に定義された変数nameの値は常に変化していないことがわかりますが、substr()メソッドとtoUpperCase()メソッドを呼び出すと、元に定義された変数nameとは関係のない新しい文字列が返されます.
次のような疑問があるかもしれません.コードを見てください.
	var name = "change";
	name = "change1";
	console.log(name)//change1

このようにしてnameの値が「変わった」ように見えるのは、var name=「change」であり、ここでのベースタイプはstring、すなわち「change」であり、ここでの「change」は変更できない.nameは「change」のポインタを指すだけであり、ポインタの指向は変更可能であり、name=「change 1」である.このときnameは「change 1」を指す.ここでの「change 1」も同様に変更できません.つまり、ここであなたが考えている変化は「ポインタの指向変化」にすぎません.
2)基本データ型は属性と方法を追加できない
	var p = "change";
	p.age = 29;
	p.method = function(){console.log(name)};
	console.log(p.age)//undefined
	console.log(p.method)//undefined

3)基本データ型の賦課は単純賦課である
ある変数から別の変数に基本タイプの値を割り当てると、変数オブジェクトに新しい値が作成され、その値が新しい変数に割り当てられた場所にコピーされます.
var a = 10;
var b = a;
a++;
console.log(a)//11
console.log(b)//10

上記のコードでは、aに保存する値は10である.aの値を用いてbを初期化すると、bにも値10が保存される.しかし、bの10とaの10は完全に独立している.bの値はaの値のコピーにすぎない.したがって、この2つの変数は、相互に影響を与えることなく、任意の操作に関与することができる.
4)基本データ型の比較値の比較
var person1 = '{}';
var person2 = '{}';
console.log(person1 == person2); // true

5)基本データ型はスタック領域に格納されている
次の基本タイプの変数がいくつかある場合:
var name = "jozo";
var city = "guangzhou";
var age = 22;

スタック領域には、変数の識別子と変数の値が含まれます.
リファレンスデータ型JavaScriptでは、基本データ型の他にリファレンスデータ型(オブジェクトともいえる)です.例えば、Object、Array、Function、Dataなど.
1)参照タイプの値は変更可能
var o = {x:1};
o.x = 2;  //              
o.y = 3;  //       ,        

var a = [1,2,3];
a[0] = 0; //          
a[3] = 4; //          

2)参照タイプ属性とメソッドを追加できる
var person = {};
person.name = "change";
person.say = function(){alert("hello");}
console.log(person.name)//change
console.log(person.say)//function(){alert("hello");}

3)参照タイプの割り当てはオブジェクト参照
	1.var a = {};
	2.var b= a;
	3.a.name = "change";
	4.console.log(a.name)//change;
	5.console.log(b.name)//change
	6.b.age = 29;
	7. console.log(a.age)//29
	8. console.log(b.age)//29

1つの変数から別の変数に参照タイプの値を割り当てると、同じように変数に格納されたオブジェクトの値も、新しい変数に割り当てられた空間にコピーする.参照タイプは変数に保存されるオブジェクトのスタックメモリ内のアドレスであるため、基本データ型の単純な割り当てとは異なり、この値のコピーは実際にはポインタであり、このポインタはスタックメモリに格納されているオブジェクトを指します.では、付与操作後、2つの変数は同じオブジェクトアドレスを保存し、この2つのアドレスは同じオブジェクトを指します.したがって、いずれかの変数を変更すると、互いに影響します.
4)参照タイプの比較参照の比較
	1.var person1 = {};
	2.var person2 = {};
	3.console.log(person1 == person2)//false

なぜ2つのオブジェクトは同じように見えるが、等しくないのだろうか.
参照タイプの比較は参照の比較であるため、言い換えれば、2つのオブジェクトがスタック領域に保存されているポインタメモリのアドレスが同じかどうかを比較することである.この場合、p 1とp 2はいずれも「{}」のように見えるが、スタック領域に保存されているポインタメモリのアドレスは異なるため、2つのオブジェクトは等しくない
5)参照タイプはスタック領域とスタック領域に同時に保存される
リファレンスタイプのストレージは、メモリのスタック領域とスタック領域で共同で完了する必要があります.スタック領域には変数識別子とスタックメモリへのアドレスが保存されます.
次のオブジェクトがある場合:
	1.var person1 = {name:"change1"};
	2.var person2 = {name:"change2"};
	3.var person3 = {name:"change3"};

この3つのオブジェクトがメモリに保存されている場合は、次の図のようになります.
基本パッケージタイプ(パッケージオブジェクト)は、以下のコードを参照してください.
 1 var s1 = "helloworld";
 2. var s2 = s1.substr(4);

文字列が基本データ型であり、方法があるべきではないと述べたが、なぜs 1はsubstr()を呼び出すことができるのか.
JavaScript権威ガイド第3.6章と上級プログラム設計第5.6章をめくると、ECMAScriptは3つの特殊な参照タイプBoolean、String、Numberを提供していることがわかります.この3つの特殊な参照タイプを基本包装タイプと呼び、包装対象とも呼ばれています.
字面量で作成:var a="String";この場合、基本データ型です.関数を構築する方法で作成:var a=new String(「String」);オブジェクトタイプです.
すなわちstring、boolean、numberの3つの基本データ型を読み出すと、バックグラウンドに対応する基本パッケージ型オブジェクトが作成され、これらのデータを操作するためのいくつかの方法を呼び出すことができます.
したがって、2行目のコードがs 1にアクセスすると、バックグラウンドは自動的に次の操作を完了します.
1    String       ;// var s1 = new String(“helloworld”);
2           ;// var s2 = s1.substr(4);
3        ;// s1 = null;

3番目のステップという破棄の動作があるだけに、基本データ型に属性と方法を追加できない理由を理解することができます.これは、基本パッケージタイプと参照タイプの主な違いです.オブジェクトの生存期間です.newオペレータを使用して作成する参照タイプのインスタンスは、実行フローが現在の役割ドメインから離れるまでメモリに保存されています.自動作成された基本パッケージタイプのオブジェクトは、1行のコードの実行瞬間にのみ存在します.すぐに破棄されます(詳しくは、JSエンジンは、内部で対応するパッケージタイプの一時オブジェクトを一時的に作成し、基本タイプの操作をこの一時オブジェクトにエージェントすることで、基本タイプの属性へのアクセスをオブジェクトのように見せることができます.しかし、操作が完了すると一時オブジェクトは破棄され、次回の再アクセス時に一時オブジェクトが再構築され、ただし、以前のテンポラリオブジェクトの変更は有効ではありません.)