データのコピー、受け渡し、および比較

JScript がデータをコピー、受け渡し、および比較する方法は、データの格納方法によって決まります。また、データの格納方法は、データの型によって決まります。 JScript は、データを値または参照によって格納します。

"値" と "参照" によるデータのコピー、受け渡し、および比較

JScript では、数値およびブール値 (truefalse) のコピー、受け渡し、および比較を、"値によって" 実行します。 この処理では、コンピューター メモリに領域が割り当てられ、元の値がこの領域にコピーされます。 元の値とコピーされた値は別の要素と見なされるため、元の値を変更しても、コピーされた値には影響ありません (逆の場合も同様です)。 2 つの数値またはブール値が同じ値である場合、2 つの値は等しいと見なされます。

オブジェクト、配列、および関数の場合、コピー、受け渡し、および比較は "参照によって" 行われます。 この処理では、元の項目への参照が作成され、作成された参照がコピーのように使用されます。 元の項目に変更を加えると、元の項目とコピーされた項目の両方が変更されます (逆の場合も同様です)。 実際に存在する項目は 1 つだけであり、コピーされた項目はデータへの別の参照です。

参照による比較を正しく行うには、2 つの変数が同じ項目を参照している必要があります。 たとえば、2 つの異なる Array オブジェクトは、まったく同じ要素を持っていても、比較においては常に等しくないものとして識別されます。 比較処理を正しく行うには、一方の変数がもう一方の変数の参照である必要があります。 2 つの Array オブジェクトが同じ要素を持つかどうかを確認するには、toString() メソッドの結果を比較します。

文字列は、参照によってコピーおよび受け渡しされます。 文字列の比較方法は、文字列がオブジェクトかどうかによって決まります。 new String ("something") で作成された String オブジェクトどうしは、参照によって比較されます。 文字列のいずれか (または両方) がリテラルかプリミティブ文字列値である場合は、値によって比較されます。 詳細については、「JScript の代入と等価比較」を参照してください。

注意

ASCII 文字セットと ANSI 文字セットの構成方法により、文字の順序の中で大文字は小文字よりも先に来ます。 たとえば、"Zoo" は "aardvark" より小さいと評価されます。 大文字と小文字を区別しない一致検証を行うには、双方の文字列で toUpperCase() または toLowerCase() を呼び出します。

関数パラメーター

関数に値渡しでパラメーターを渡す場合は、そのパラメーターの新しいコピーが作成されます。作成されたコピーは、その関数の中だけで存在します。 オブジェクトや配列は参照によって渡されますが、関数内の新しい値で直接上書きする場合、関数の外ではこの新しい値は反映されません。 関数の外でも有効なのは、オブジェクトのプロパティや配列の要素に対する変更だけです。

たとえば、次のプログラムには 2 つの関数があります。 最初の関数は入力パラメーターを上書きしています。これにより、パラメーターが変更されても入力された元の引数が影響を受けないようにします。 2 番目の関数は、オブジェクトを上書きせずに、オブジェクトのプロパティを変更しています。

function clobber(param) {
   // Overwrite the parameter; this will not be seen in the calling code
   param = new Object();
   param.message = "This will not work.";
}

function update(param) {
    // Modify the property of the object; this will be seen in the calling code.
    param.message = "I was changed.";
}

// Create an object, and give it a property.
var obj = new Object();
obj.message = "This is the original.";

// Call clobber, and print obj.message.
clobber(obj);
print(obj.message);

// Call update, and print obj.message.
update(obj);
print(obj.message);

このコードの出力は次のようになります。

This is the original.
I was changed.

データの比較

JScript では、データを値または参照によって比較できます。 値による比較を実行する場合は、2 つの項目を比較して、お互いに等しいかどうかを調べます。 通常、この比較はバイトごとに実行されます。 参照による比較では、2 つの項目が同じ項目を参照しているかどうかを確認します。 参照先の項目が同じである場合、両者は等しいと評価されます。参照先の項目が異なる場合は、値渡しで比較した場合に等しくなる値が格納されていても、両者は等しくないと評価されます。

文字列は、オブジェクトかどうかに応じて、値または参照によって比較されます。 両方の文字列が String オブジェクトである場合、文字列は参照によって比較されます。それ以外の場合は、値によって比較されます。 したがって、2 つの文字列が個別に作成されていても、それぞれの内容が同じであると、2 つの文字列は等しいと評価されます。 2 つの String オブジェクトの値を比較するには、まず toString または valueOf メソッドを使用してオブジェクトを非オブジェクトの文字列に変換し、変換された文字列を比較します。 詳細については、「JScript の代入と等価比較」を参照してください。

参照

概念

JScript の代入と等価比較

データ型の概要

その他の技術情報

JScript 言語の紹介

JScript の関数