ホームページ  >  記事  >  ウェブフロントエンド  >  javascript_javascriptスキルにおける基本型と参照型の違いの分析

javascript_javascriptスキルにおける基本型と参照型の違いの分析

WBOY
WBOYオリジナル
2016-05-16 15:59:36964ブラウズ

基本型と参照型

ECMAScript には、基本型の値と参照型の値という 2 つの異なるタイプの値が含まれています。プリミティブ型の値は単純なデータ セグメントを指し、参照型の値は複数の値で構成されるオブジェクトを指します。変数に変数を割り当てるとき、パーサーが最初に行う必要があるのは、値が基本型の値であるか参照型の値であるかを確認することです。

一般的な 5 つの基本データ型は次のとおりです:

未定義、Null、ブール値、数値、文字列。これら 5 つの基本データ型は、変数に格納されている実際の値を直接操作できます。

以下の例を見てください:

var a = 10;
var b = a;
   b = 20;
console.log(a); // 10
    
var bl = true;
var bl1 = bl;
   bl1 = false;
console.log(bl); // true

上記では、b で取得される値は a の値のコピーです。2 つの変数の値は等しいですが、2 つの変数には 2 つの異なる基本データ型の値が格納されます。 b は a のコピーのコピーを保存するだけです。したがって、b の値が変化しても、a の値は 10 のままです。
以下では、2 つのブール変数 bl と bl1 も基本データ型であり、2 つの異なる基本データ型値も格納します。 bl1 は bl のコピーを保存します。

次の図は、この基本的なデータ型の割り当てプロセスを示しています。

参照型データを見てみましょう:

JavaScript の参照データ型はヒープ メモリに格納されるオブジェクトであるため、他の言語とは異なり、ヒープ メモリ空間上の場所に直接アクセスしてヒープ メモリ空間を操作することはできません。スタック メモリ内のオブジェクトの参照アドレスに対してのみ操作できます。したがって、スタックメモリに格納される参照型データは、実際にはヒープメモリ上のオブジェクトの参照アドレスとなる。この参照アドレスを通じて、ヒープ メモリに格納されているオブジェクトをすばやく見つけることができます。

以下の例を見てください:

var obj1 = new Object();
var obj2 = obj1;
obj2.name = "我有名字了";
console.log(obj1.name); // 我有名字了

上記の例では、参照データ型変数 obj1 を宣言し、それを別の参照データ型変数 obj2 に割り当てています。 obj2 に name 属性を追加し、「I have a name」という値を割り当てたとき。 obj1 にも obj2 と同じ name 属性があります。これは、これら 2 つの参照データ型変数が同じヒープ メモリ オブジェクトを指していることを意味します。 obj1 が obj2 に割り当てられると、実際にはスタック メモリ内のこのヒープ メモリ オブジェクトの参照アドレスが obj2 にコピーされるだけですが、これらは本質的に同じヒープ メモリ オブジェクトを指します。

この参照データ型の割り当てプロセスを示してみましょう:

当然ですが、obj2にname属性を追加すると、実際にはヒープメモリ上のオブジェクトにname属性が追加されます。obj2とobj1がスタックメモリに保存するのは、ヒープメモリオブジェクトの参照アドレスだけです。指すオブジェクトは同じです。したがって、obj2 を変更すると、obj1 も変更されます。

一般に、基本データ型は固定数のバイトで構成され、数値やブール値などのパーサーの下位レベルで操作できますが、参照データ型には任意の数の属性と要素を含めることができます。したがって、プリミティブ データ型ほど簡単に操作することはできません。参照データ型の値は変化するため、基本データ型と同じ方法で値を渡すのは意味がありません。大量のメモリのコピーと比較が必要になり、効率が低すぎるためです。したがって、参照データ型は参照によって渡され、実際に渡されるのはオブジェクトのアドレスのみです。たとえば、Array と Function は特殊なオブジェクトであるため、両方とも参照型です。さらに、参照型でも属性を追加できますが、テスト後はアクセスできなくなります。

以下のコードを見てください:

var a = 12;
 a.name = "myname";
console.log(a.name); // undefined

文字列は特別な基本データ型です

多くの言語では、String はオブジェクトの形式で表現されますが、ECMAScript ではこの伝統に従っていません。String は基本的なデータ型として使用されますが、比較的特殊な基本型です。

String を参照型として使用する必要があるように見えますが、実際にはオブジェクトではないためそうではありません。それなら基本的なデータ型にして値渡しで操作すれば良さそうです。

以下の例を見てください:

var stra = "这是一个字符串";
var strb = stra;
   stra = "这是另外一个字符串";
console.log(strb); // 这是一个字符串

上記の例では、stra が値の転送を通じてコピーを strb にコピーしていることがわかります。 stra が変化しても strb は変化しません。String が基本的なデータ型であるとすでに結論付けられているようです。

ただし、String は任意の長さで値渡しなので、1 バイトずつコピーする表示効率はまだ非常に低いです。String は参照型としても使用できるようです。

以下の例を見てください:

var a = "myobject";
  a.name = "myname";
console.log(a.name); // undefined

String をオブジェクトとして扱うことができないことを示します。実際、JavaScript の文字列は変更できません。また、JavaScript には文字列を変更するためのメソッドや構文が提供されていません。

var a = "myobject";
  a = a.substring(3,5)
  console.log(a); // bj

Remember that by doing this, the String "myobject" is not changed, only a refers to another string "bj", and "myobject" is recycled.

So it can be said that String does not actually conform to the above two data type classifications. It is a special type with two attributes between the two.

The above is the entire content of this article, I hope you all like it.

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。