ECMAScriptの参照型

参照型は通常「クラス」と呼ばれます。

このチュートリアルでは、多くの ECMAScript 預定参照型について議論します。

参照型

参照型は通常「クラス」と呼ばれます。つまり、参照値が現れると、扱うのはオブジェクトです。

このチュートリアルでは、多くの ECMAScript 預定参照型について議論します。

ここからは、既に議論された原始的なデータ型と密接に関連する参照型について詳しく論説します。

注意:伝統的な意味では、ECMAScript にはクラスが存在しないと言えます。実際、ECMA-262 では「クラス」という言葉が全く登場していません。ECMAScript は「オブジェクト定義」を定義しており、他のプログラミング言語のクラスと論理的に等価です。

ヒント:このトレーニングでは「オブジェクト」という用語を使用します。

オブジェクトは new 演算子とインスタンス化するオブジェクトの名前で作成されます。例えば、以下のコードは Object オブジェクトのインスタンスを作成します:

var o = new Object();

この文法は Java 言語に似ていますが、パラメータが複数ある場合、ECMAScript では括弧を使用する必要があります。パラメータがなく、以下のコードのようにない場合、括弧は省略できます:

var o = new Object;

注意:括弧は必須ではありませんが、混乱を避けるために括弧を使用するのが良いでしょう。

ヒント:オブジェクトとその動作についてさらに詳しく学ぶのは、オブジェクトの基本の章で行います。

このセクションのポイントは等価な原始データ型を持つリファレンス型です。

Object オブジェクト

Object オブジェクト自体はあまり役に立たないものの、他のクラスを理解する前に知っておくべきです。なぜなら ECMAScript の Object オブジェクトは Java の java.lang.Object に似ているため、ECMAScript のすべてのオブジェクトはこのオブジェクトから派生しており、Object オブジェクトのすべての属性とメソッドは他のオブジェクトにも現れますので、Object オブジェクトを理解することで他のオブジェクトもよりよく理解できます。

Object オブジェクトには以下の属性があります:

constructor
オブジェクトを生成する関数への参照(ポインタ)です。Object オブジェクトの場合、このポインタは元の Object() 関数に指しています。
Prototype
オブジェクトのプロトタイプへの参照です。すべてのオブジェクトでは、デフォルトで Object オブジェクトのインスタンスが返されます。

Object オブジェクトには他にもいくつかのメソッドがあります:

hasOwnProperty(property)
オブジェクトに特定の属性があるかどうかを判断します。属性は文字列で指定する必要があります。(例:o.hasOwnProperty("name"))
IsPrototypeOf(object)
オブジェクトが別のオブジェクトのプロトタイプであるかどうかを判断します。
PropertyIsEnumerable
指定された属性が for...in 文で列挙可能かどうかを判断します。
ToString()
オブジェクトの元の文字列表現を返します。Object オブジェクトの場合、ECMA-262 ではこの値は定義されていませんので、異なる ECMAScript 実装では異なる値が返されます。
ValueOf()
該オブジェクトに最適な元の値を返します。多くのオブジェクトでは、このメソッドが返す値は ToString() の返し値と同じです。

注釈:上面列出的每个属性和方法都会被其他对象覆盖。

Boolean 对象

Boolean 对象是 Boolean 原始类型的引用类型。

要创建 Boolean 对象,只需传递 Boolean 值作为参数:

var oBooleanObject = new Boolean(true);

Boolean 对象将覆盖 Object 对象的 ValueOf() 方法,返回原始值,即 true 和 false。ToString() 方法也会被覆盖,返回字符串 "true" 或 "false"。

遗憾的是,在 ECMAScript 中很少使用 Boolean 对象,即使使用,也不易理解。

问题通常出现在使用 Boolean 对象的 Boolean 表达式中。例如:

var oFalseObject = new Boolean(false);
var bResult = oFalseObject && true;	// 输出 true

在这段代码中,使用 false 值创建 Boolean 对象。然后使用这个值与原始值 true 进行 AND 操作。在 Boolean 运算中,false 和 true 进行 AND 操作的结果是 false。不过,在这行代码中,计算的是 oFalseObject,而不是它的值 false。

正如前面所讨论的,在 Boolean 表达式中,所有对象都会自动转换为 true,因此 oFalseObject 的值是 true。然后 true 与 true 进行 AND 操作,结果为 true。

注意:虽然您应该了解 Boolean 对象的可用性,但最好还是使用 Boolean 原始值,以避免出现本节提到的问题。

参照

有关 Boolean 对象的更多信息,请访问 JavaScript ブールオブジェクトリファレンスマニュアル

Number 对象

正如您可能想到的,Number 对象是 Number 原始类型的引用类型。要创建 Number 对象,请使用以下代码:

var oNumberObject = new Number(68);

您应该已经认识到了本章前面小节中讨论的特殊值(如 Number.MAX_VALUE)所提到的 Number 对象。所有特殊值都是 Number 对象的静态属性。

数字对象的 Number 原始值可以通过 valueOf() 方法获取:

var iNumber = oNumberObject.valueOf();

もちろん、Number クラスにはtoString() メソッドもあります。このメソッドは、タイプ変換のセクションで詳細に説明されています。

Object オブジェクトから継承された標準メソッドの他にも、Number オブジェクトには数を処理するためのいくつかの専用メソッドがあります。

toFixed() メソッド

toFixed() メソッドは、指定された桁数を持つ小数の数字の文字列表現を返します。例えば:

var oNumberObject = new Number(68);
alert(oNumberObject.toFixed(2));  //「68.00」と出力されます

ここでは、toFixed() メソッドのパラメータは2であり、2桁の小数を表示するという意味です。このメソッドは「68.00」と返し、空の桁は0で補完されます。通貨の処理をするアプリケーションには非常に役立ちます。toFixed() メソッドは0から20桁までの小数を持つ数字を表現できますが、その範囲を超える値はエラーを引き起こします。

toExponential() メソッド

フォーマット化された数字に関連する別のメソッドは、toExponential() で、科学記数法で表現された数字の文字列形式を返します。

toFixed() メソッドと同様に、toExponential() メソッドもパラメータを持っており、出力する小数の桁数を指定します。例えば:

var oNumberObject = new Number(68);
alert(oNumberObject.toExponential(1));  //「6.8e+1」と出力されます

このコードの結果は「6.8e+1」となり、先ほど説明したように、それは6.8x10を表します。1問題は、数をどの形式(指定形式または指数形式)で表現するか知らない場合です。toPrecision() メソッドを使うことができます。

toPrecision() メソッド

toPrecision() メソッドは、数の最も意味のある形式に基づいて数の指定形式または指数形式を返します。それには、数を表すための数字の総数(指数を除く)が一つのパラメータです。例えば、

var oNumberObject = new Number(68);
alert(oNumberObject.toPrecision(1));  //「7e+1」と出力されます

このコードのタスクは数字68を1桁の数字で表現することで、「7e+1」となり、別の形式では70です。確かに、toPrecision() メソッドは数に四捨五入を行います。しかし、68を2桁で表現するのはとても簡単です:

var oNumberObject = new Number(68);
alert(oNumberObject.toPrecision(2));  //「68」と出力されます

もちろん、出力されるのは「68」であり、それはその数の正確な表現です。しかし、指定する桁数が必要な桁数よりも多い場合どうでしょう?

var oNumberObject = new Number(68);
alert(oNumberObject.toPrecision(3));  //出力 "68.0"

この場合、toPrecision(3) は toFixed(1) と等価で、"68.0" が输出されます。

toFixed()、toExponential()、toPrecision() メソッドは、正しい小数桁数で数値を正確に表現するために舍入操作を行います。

ヒント:Boolean オブジェクトと同様に、Number オブジェクトも非常に重要ですが、潜在的な問題を避けるために、可能な限り原始の数字の表現を使用してください。

参照

Number オブジェクトに関する詳細情報が必要な場合は、以下を訪問してください。 JavaScript ナンバーオブジェクトリファレンスマニュアル

String オブジェクト

String オブジェクトは String 原始型のオブジェクト表現で、以下のように作成されます:

var oStringObject = new String("hello world");

String オブジェクトの valueOf() メソッドと toString() メソッドは、String クラスの原始値を返します:

alert(oStringObject.valueOf() == oStringObject.toString());	//出力 "true"

このコードを実行すると、出力は "true" で、これらの値が実際に等しいことを示しています。

注釈:String オブジェクトは ECMAScript で複雑な参照型の一つです。同様に、このセクションの重点は String クラスの基本的な機能だけです。より高度な機能については、本チュートリアルの関連セクションを参照してください、または以下を参照してください。 JavaScript ストリングオブジェクトリファレンスマニュアル

length 属性

String オブジェクトには属性 length があります。これは文字列の文字数です:

var oStringObject = new String("hello world");
alert(oStringObject.length);	//出力 "11"

この例では "11" が出力されます、つまり "hello world" 中的文字数です。注意していただきたいのは、文字列が双字节的文字を含んでいても(ASCII文字と比較して、ASCII文字は1バイトしか占めません)、各文字は1文字として数えます。

charAt() 和 charCodeAt() メソッド

String オブジェクトには多くのメソッドがあります。

まず、charAt() 和 charCodeAt() メソッドは文字列の単一文字にアクセスします。これらのメソッドには、操作する文字の位置を指定する引数があります。

charAt() メソッドは指定位置の文字を含む文字列を返します:

var oStringObject = new String("hello world");
alert(oStringObject.charAt(1));	//出力 "e"

文字列 "hello world" の位置 1 にある文字は "e" です。ECMAScript 原始型のセクションで説明したように、最初の文字の位置は 0、次の文字の位置は 1 であり、そのため、charAt(1) を呼び出すと "e" が返されます。

文字ではなく文字コードを取得したい場合、charCodeAt() メソッドを呼び出すことができます:

var oStringObject = new String("hello world");
alert(oStringObject.charCodeAt(1));	// "101" を出力

この例では "101" が表示され、小文字の "e" の文字コードです。

concat() メソッド

次に、concat() メソッドがあります。これは、一つまたは複数の文字列を String オブジェクトの元の値に結合するために使用されます。このメソッドは String 元の値を返し、元の String オブジェクトを変更しません:

var oStringObject = new String("hello ");
var sResult = oStringObject.concat("world");
alert(sResult);		// "hello world" を出力
alert(oStringObject);	// "hello " を出力

このコードのこの部分では、concat() メソッドが "hello world" を返し、String オブジェクトはまだ "hello " を保持しています。そのため、加号(+)を使用して文字列を結合するのが一般的です。なぜなら、この形式は実際の動作を論理的に示しているからです:

var oStringObject = new String("hello ");
var sResult = oStringObject + "world";
alert(sResult);		// "hello world" を出力
alert(oStringObject);	// "hello " を出力

indexOf() と lastIndexOf() メソッド

これまで、文字列を結合する方法や、文字列内の単一の文字にアクセスする方法について話してきました。しかし、ある文字が実際に文字列内に存在するかどうかを確認できない場合、どのメソッドを呼び出すべきでしょうか?その場合、indexOf() と lastIndexOf() メソッドを呼び出すことができます。

indexOf() と lastIndexOf() メソッドは、指定された子文字列が別の文字列内にある位置を返します。子文字列が見つからない場合、-1 を返します。

この二つのメソッドの違いは、indexOf() メソッドは文字列の先頭(位置 0)から文字列を検索し、lastIndexOf() メソッドは文字列の末尾から検索子文字列を開始することです。例えば:

var oStringObject = new String("hello world!");
alert(oStringObject.indexOf("o"));		输出 "4"
alert(oStringObject.lastIndexOf("o"));	输出 "7"

ここでは、最初の「o」文字列は位置4に「hello」の「o」、最後の「o」文字列は位置7に「world」の「o」に位置しています。この文字列に「o」文字列が1つしかない場合、indexOf()とlastIndexOf()メソッドが返す位置は同じです。

localeCompare()メソッド

次のメソッドはlocaleCompare()で、文字列をソートします。このメソッドには1つの引数があります - 比較するための文字列で、以下の3つの値のうちの1つを返します:

  • Stringオブジェクトが引数の文字列の前ろにアルファベット順に配置されている場合、負数を返します。
  • Stringオブジェクトが引数の文字列と等しい場合、0を返します。
  • Stringオブジェクトが引数の文字列の後ろにアルファベット順に配置されている場合、正数を返します。

注釈:返される値が負数の場合、最も一般的には-1ですが、実際に返されるのは実装によって決定されます。返される値が正数の場合も同様に、最も一般的には1ですが、実際に返されるのは実装によって決定されます。

以下に例を示します:

var oStringObject = new String("yellow");
alert(oStringObject.localeCompare("brick"));		//「1」を出力
alert(oStringObject.localeCompare("yellow"));		//「0」を出力
alert(oStringObject.localeCompare("zoo"));		//「-1」を出力

このコードでは、文字列「yellow」が「brick」、「yellow」、および「zoo」の3つの値と比較されています。アルファベット順に並べ替えられているため、「yellow」は「brick」の後ろに位置し、localeCompare()は1を返します。「yellow」は「yellow」と同じため、localeCompare()は0を返します。「zoo」は「yellow」の後ろに位置し、localeCompare()は-1を返します。再び強調しますが、返される値は実装によって決定されるため、localeCompare()メソッドを以下のように呼び出すのが最善です:

var oStringObject1 = new String("yellow");
var oStringObject2 = new String("brick");
var iResult = oStringObject1.localeCompare(oStringObject2);
if(iResult < 0) {
  alert(oStringObject1 + " は " + oStringObject2 + " の前に来ます");
}
  alert(oStringObject1 + " は " + oStringObject2 + " の後ろに来ます");
}
  alert("二つの文字列は等しい");
}

この構造を取ることで、このコードがすべての実装で正しく動作することを保証できます。

localeCompare() メソッドの特徴は、実装される地域(locale、国/地域と言語の両方を指します)がこのメソッドの実行方法を正確に示していることです。アメリカでは、英語が ECMAScript 実装の標準言語であり、localeCompare() は大文字小文字を区別し、大文字は小文字の後ろに配置されます。しかし、他の地域では状況が異なる場合があります。

slice() と substring()

ECMAScript は slice() と substring() のように、文字列値から子文字列を作成するための二つの方法を提供しています。これらの方法はどちらも処理する文字列のサブ文字列を返し、一つまたは二つの引数を受け取ります。最初の引数は取得するサブ文字列の開始位置であり、第二の引数(使用される場合)は取得するサブ文字列の終了位置(つまり、終了位置の文字は返されません)です。第二の引数を省略すると、終了位置はデフォルトで文字列の長さになります。

concat() メソッドと同様に、slice() と substring() メソッドは String オブジェクト自身の値を変更しません。彼らはただ元の String 値を返し、String オブジェクトを変更しません。

var oStringObject = new String("hello world");
alert(oStringObject.slice("3"));		//出力"lo world"
alert(oStringObject.substring("3"));		//出力"lo world"
alert(oStringObject.slice("3", "7"));		//出力"lo w"
alert(oStringObject.substring("3", "7"));	//出力"lo w"

この例では、slice()とsubstring()の使用方法と返り値が同じです。パラメータが3の場合、二つのメソッドはどちらも"lo world"を返します。なぜなら「hello」の二番目の「l」が位置3にあるからです。パラメータが「3」と「7」の二つの場合、二つのメソッドはどちらも「lo w」を返します(「world」の「o」が位置7にあり、そのため結果には含まれません)。

機能が完全に同じ二つのメソッドが二つある理由は何でしょうか?実際には、これら二つのメソッドは完全には同じではありませんが、負の数のパラメータの場合、パラメータの処理方法が少し異なります。

負の数のパラメータに対して、slice()メソッドは文字列の長さにパラメータを加えますが、substring()メソッドはそれを0として処理します(つまり無視します)。例えば:

var oStringObject = new String("hello world");
alert(oStringObject.slice("-3"));		//出力"rld"
alert(oStringObject.substring("-3"));	//出力"hello world"
alert(oStringObject.slice("3, -4"));		//出力"lo w"
alert(oStringObject.substring("3, -4"));	//出力"hel"

これでslice()とsubstring()メソッドの主な違いがわかります。

パラメータ-3のみ指定された場合、slice()は"rld"を返し、substring()は"hello world"を返します。なぜなら、文字列"hello world"に対してslice("-3")はslice("8")に変換され、substring("-3")はsubstring("0")に変換されるからです。

同様に、パラメータ 3 と -4 を使用する場合、明らかな違いがあります。slice() は slice(3, 7) に変換され、前の例と同じように "lo w" を返します。一方、substring() メソッドは 2 つのパラメータを substring(3, 0) として解釈し、実際には substring(0, 3) です。なぜなら substring() は常に小さい数字を開始位置として、大きい数字を終了位置として解釈するからです。したがって、substring("3, -4") は "hel" を返します。最後の行のコードは、これらの方法の使用方法を説明するために使用されています。

toLowerCase()、toLocaleLowerCase()、toUpperCase()、toLocaleUpperCase()

最後に説明する方法セットは、大文字小文字の変換に関連しています。大文字小文字の変換を実行するための 4 種類の方法があります。

  • toLowerCase()
  • toLocaleLowerCase()
  • toUpperCase()
  • toLocaleUpperCase()

名前からも分かるように、これらの方法の用途は、前两种方法は文字列を全て小文字に変換するために使用され、後两种方法は文字列を全て大文字に変換するために使用されます。

toLowerCase() と toUpperCase() メソッドは基本的なものです。java.lang.String における同じメソッドを原型として実装されています。

toLocaleLowerCase() と toLocaleUpperCase() メソッドは特定の地域に基づいて実装されています(localeCompare() メソッドと同じです)。多くの地域では、地域固有の方法は一般的な方法と完全に同じです。ただし、いくつかの言語では Unicode の大文字小文字変換に特定のルールが適用されます(例えば、トルコ語など)、そのため正確な変換を行うには地域固有の方法を使用する必要があります。

var oStringObject = new String("Hello World");
alert(oStringObject.toLocaleUpperCase());	//出力 "HELLO WORLD"
alert(oStringObject.toUpperCase());		//出力 "HELLO WORLD"
alert(oStringObject.toLocaleLowerCase());	//出力 "hello world"
alert(oStringObject.toLowerCase());		//「hello world」を出力

このコードでは、toUpperCase() と toLocaleUpperCase() は「HELLO WORLD」を出力し、toLowerCase() と toLocaleLowerCase() は「hello world」を出力します。一般的には、特定のエンコーディングで言語がどのように実行されているかを知らない場合、地域特定のメソッドを使用するのが安全です。

ヒント:思い出してください、String オブジェクトのすべての属性とメソッドは、それらが擬似オブジェクトであるため、String 原始値に適用できます。

instanceof 演算子

typeof 演算子を使用してリファレンスタイプを格納する場合、どのタイプのオブジェクトでも「object」を返します。ECMAScript はこの問題を解決するために別の Java 演算子 instanceof を導入しました。

instanceof 演算子は typeof 演算子に似ており、処理中のオブジェクトのタイプを識別するために使用されます。typeof メソッドとは異なり、instanceof メソッドは開発者が明確に特定のタイプであることを確認する必要があります。例えば:

var oStringObject = new String("hello world");
alert(oStringObject instanceof String);	//「true」を出力

このコードは「変数 oStringObject が String オブジェクトのインスタンスであるかどうか」を尋ねています。oStringObject は確かに String オブジェクトのインスタンスであり、そのため結果は「true」です。typeof メソッドのように柔軟ではありませんが、typeof メソッドが「object」を返した場合、instanceof メソッドは非常に有用です。