ECMAScript型変換

すべてのプログラミング言語の最も重要な特徴の1つは、型変換を行う能力を持っていることです。

ECMAScriptは開発者に多くの簡単な型変換メソッドを提供しています。

ほとんどの型にはシンプルな変換を行うメソッドがあり、さらに複雑な変換を行うためのいくつかのグローバルメソッドがあります。どちらの場合でも、ECMAScriptでは型変換は短い一歩の操作です。

文字列に変換

ECMAScriptのBoolean値、数字、文字列の原始値の面白いところは、それらが仮想オブジェクトであることです。これは、実際には属性やメソッドを持っていることを意味します。

例えば、文字列の長さを取得するには以下のようにコードを記述できます:

var sColor = "red";
alert(sColor.length); //「3」を出力

「red」という原始型の文字列であっても、それには長さを保持するlengthという属性があります。

要約すると、3つの主要な原始型(Boolean値、数字、文字列)にはtoString()メソッドがあり、それらの値を文字列に変換することができます。

ヒント:あなたはきっと聞くかもしれない、「文字列にはtoString()メソッドがあるんだけど、余計じゃない?」だって、まさにその通り。ECMAScriptでは、仮想オブジェクトでも実際のオブジェクトでも、すべてのオブジェクトにtoString()メソッドが定義されています。なぜなら、String型は仮想オブジェクトだから、toString()メソッドを持っているということになります。

Boolean 类型的 toString() 方法只是输出 "true" 或 "false",结果由变量的值决定:

var bFound = false;
alert(bFound.toString());	//输出 "false"

Number 类型的 toString() 方法比较特殊,它有两种模式,即默认模式基模式。采用默认模式,toString() 方法只是用相应的字符串输出数字值(无论是整数、浮点数还是科学计数法),如下所示:

var iNum1 = 10;
var iNum2 = 10.0;
alert(iNum1.toString());	//输出 "10"
alert(iNum2.toString());	//输出 "10"

注釈:在默认模式中,无论最初采用什么表示法声明数字,Number 类型的 toString() 方法返回的都是数字的十进制表示。因此,以八进制或十六进制字面量形式声明的数字输出的都是十进制形式的。

采用 Number 类型的 toString() 方法的基模式,可以用不同的输出数字,例如二进制的基是 2,八进制的基是 8,十六进制的基是 16。

只是要转换成的基数的另一种加法而已,它是 toString() 方法的参数:

var iNum = 10;
alert(iNum.toString(2));	//输出 "1010"
alert(iNum.toString(8));	//输出 "12"
alert(iNum.toString(16));	//输出 "A"

在前面的示例中,以 3 种不同的形式输出了数字 10,即二进制形式、八进制形式和十六进制形式。HTML 采用十六进制表示每种颜色,在 HTML 中处理数字时这种功能非常有用。

注釈:对数字调用 toString(10) 与调用 toString() 相同,它们返回的都是该数字的十进制形式。

参阅:

参照してください JavaScript 参考マニュアル提供有关 toString() 方法的详细信息:

数字に変換する

ECMAScript は、非数字の原始値を数字に変換するための parseInt() と parseFloat() の2つのメソッドを提供しています。

ご想像の通り、前者は値を整数に変換し、後者は値を浮動小数に変換します。これらのメソッドは String 型に対してのみ正しく動作し、他の型に対しては NaN を返却します。

parseInt()

parseInt() と parseFloat() は、文字列が数字値かどうかを判断する前に、その文字列を慎重に分析します。

parseInt() メソッドはまず位置 0 にある文字を確認し、それが有効な数字かどうかを判断します。もし有効な数字でない場合、该方法は NaN を返却し、他の操作を続けません。ただし、その文字が有効な数字である場合、该方法は位置 1 にある文字を確認し、同じテストを行います。このプロセスは非有効な数字の文字に到達するまで続けられ、その時点で parseInt() はその文字より前の文字列を数字に変換します。

例えば、文字列 "12345red" を整数に変換するには、parseInt() は 12345 を返却します。なぜなら、r という文字に到達したときに検出プロセスが停止するからです。

文字列に含まれる数字のリテラルは正しく数字に変換されます。例えば、"0xA" は正しく数字 10 に変換されます。ただし、文字列 "22.5" は 22 に変換されます。なぜなら、整数に対して小数点は無効な文字であるためです。

以下にいくつかの例を示します:

var iNum1 = parseInt("12345red");	//返却 12345
var iNum1 = parseInt("0xA");	//返却 10
var iNum1 = parseInt("56.9");	//返却 56
var iNum1 = parseInt("red");	//返却 NaN

parseInt() メソッドには基のモードがあります。これにより、二進数、8進数、16進数、または他のどんな進数の文字列も整数に変換できます。基は parseInt() メソッドの第2引数で指定されますので、16進数の値を解析するには、以下のように parseInt() メソッドを呼び出す必要があります:

var iNum1 = parseInt("AF", 16);	//返却 175

もちろん、二進数、8進数、または十進数(デフォルトのモード)でも、parseInt() メソッドをこんな風に呼び出すことができます:

var iNum1 = parseInt("10", 2);	//返却 2
var iNum2 = parseInt("10", 8);	//返還 8
var iNum3 = parseInt("10", 10);	//返還 10

十進数が前導0を含む場合、基数10を使用すると、意外に8進数の値を得ることを避けることができます。例えば:

var iNum1 = parseInt("010");	//返還 8
var iNum2 = parseInt("010", 8);	//返還 8
var iNum3 = parseInt("010", 10);	//返還 10

このコードでは、二行のコードが"010"を数字として解析しています。第一行のコードは、この文字列を8進数の値として見なし、第二行のコード(基数が8)と同じ方法で解析します。最後の行のコードは基数が10を宣言しているため、iNum3は最終的に10になります。

参照してください

参照してください JavaScript 参考マニュアルparseInt() メソッドに関する詳細情報:parseInt()

parseFloat()

parseFloat() メソッドは parseInt() メソッドの処理方法と似ており、位置0から各文字を確認し、最初の非有効な文字に達するまで見ます。その文字の前の文字列を整数に変換します。

ただし、このメソッドでは、最初に現れる小数点が有効な文字です。もし二つの小数点があれば、二つ目の小数点は無効と見なされます。parseFloat()は、その小数点の前の文字列を数値に変換します。これは、文字列"11.22.33"が11.22として解析されることを意味します。

parseFloat() メソッドの別の特徴は、文字列が十進数で浮動小数点数を表現する必要があり、8進数や16進数ではありません。このメソッドは先頭の0を無視しますので、8進数の0102は102として解析されます。16進数の0xAはNaNとして返されます。なぜなら、浮動小数点数ではxが有効な文字ではないからです。(注釈:テストによると、具体的なブラウザの実装は NaNではなく0を返します。)

また、parseFloat() メソッドには基準パターンがありません。

以下は parseFloat() メソッドの使用例です:

var fNum1 = parseFloat("12345red");	//返還 12345
var fNum2 = parseFloat("0xA");	//返還 NaN
var fNum3 = parseFloat("11.2");	//返還 11.2
var fNum4 = parseFloat("11.22.33");	//返還 11.22
var fNum5 = parseFloat("0102"); //102を返します
var fNum1 = parseFloat("red"); //NaNを返します

実際に試してみてください

参照してください

参照してください JavaScript 参考マニュアルparseFloat()メソッドに関する詳細情報:parseFloat()

強制型変換

さらに、以下を使用して強制型変換(type casting)変換する値の型を処理するために使用されます。強制型変換を使用することで、別の型の特定の値にアクセスできます。

編者注:castは「鋳造」という意味があり、強制変換の意味に非常に適しています。

ECMAScriptで利用できる3種類の強制型変換は以下の通りです:

  • Boolean(value) - 指定された値をBoolean型に変換します;
  • Number(value) - 指定された値を数字(整数または浮点数)に変換します;
  • String(value) - 指定された値を文字列に変換します;

これらの関数のうちの1つで値を変換すると、元の値から直接変換された値を格納する新しい値が作成されます。これは予期せぬ結果をもたらすことがあります。

Boolean()関数

変換する値が少なくとも1文字の文字列、非0の数字、またはオブジェクトである場合、Boolean()関数はtrueを返します。空の文字列、数字0、undefined、またはnullの場合はfalseを返します。

Boolean型の強制型変換をテストするために以下のコードを使用できます:

var b1 = Boolean(""); //false - 空の文字列
var b2 = Boolean("hello"); //true - 非空の文字列
var b1 = Boolean(50); //true - 非ゼロの数字
var b1 = Boolean(null); //false - null
var b1 = Boolean(0); //false - 0
var b1 = Boolean(new object()); //true - オブジェクト

Number()関数

Number()関数の強制型変換はparseInt()とparseFloat()メソッドの処理方法と似ていますが、全体の値を変換するのではなく、部分値を変換します。

覚えていますか、parseInt()とparseFloat()メソッドは最初の無効な文字以前の文字列のみを変換しますので、「1.2.3」はそれぞれ「1」と「1.2」に変換されます。

Number() で強制型変換を行うと、"1.2.3" は NaN が返されます。なぜなら、文字列値全体が数字に変換できないからです。文字列値が完全に変換できる場合、Number() は parseInt() メソッドまたは parseFloat() メソッドを呼び出すかどうかを判断します。

以下のテーブルは、異なる値に対して Number() メソッドが呼び出された場合に発生する状況を示しています:

用法 結果
Number(false) 0
Number(true) 1
Number(undefined) NaN
Number(null) 0
Number("1.2") 1.2
Number("12") 12
Number("1.2.3") NaN
Number(new object()) NaN
Number(50) 50

String() 関数

最後の強制型変換方法の String() は最も簡単で、どんな値も文字列に変換できます。

このような強制型変換を実行するには、引き渡された値の toString() メソッドを呼び出すだけで十分です。例えば、12 を "12"、true を "true"、false を "false" に変換し、そのようにして続けます。

強制型変換と toString() メソッドの唯一の違いは、null と undefined の値に対して強制型変換を行うと、エラーを発生させずに文字列を生成できることです:

var s1 = String(null);	//"null"
var oNull = null;
var s2 = oNull.toString();	//エラーが発生します

ECMAScript などの弱い型言語を処理する際には、強制型変換が非常に有用ですが、値の正確性を確保する必要があります。