Hatena::Groupmnemonic

きおく屋めがねばし

 | 

2013-01-08

「3.8.1 変換と比較」

Conversions and Equality

等値演算子 == でも、等しいかどうかの判定が柔軟に行われます。例えば、以下に挙げる比較はすべて true と判定されます。

null == undefined  // この 2 つの値は等しいものとして扱われる。
"0" == 0           // 比較する前に、文字列は数値に変換される。
0 == false         // 比較する前に、論理値は数値に変換される。
"0" == false       // 比較する前に、両方のオペランドが数値に変換される。

「3.8.2 明示的な型変換」

Explicit Conversions

JavaScript では多くの型変換が自動的に行われますが、明示的に型変換しなければならない場合もあります。また、コードをわかりやすくするために、明示的に型変換したい場合もあるでしょう。

明示的に型変換を行うには、Boolean()Number()String()Object()、関数を使うのが簡単です。

Number(3)      => 3
String(false)  => "false" Or use false.toString()
Boolean([])    => true
Object(3)      => new Number(3)

JavaScript の演算子には、暗黙に型変換を行うものがあります。このため、このような演算子を型変換のために使う場合があります。

If one operand of the + operator is a string, it converts the other one to a string. The unary + operator converts its operand to a number. And the unary ! operator converts its operand to a boolean and negates it. These facts lead to the following type conversion idioms that you may see in some code:

x + ""  // Same as String(x)
+x      // Same as Number(x). You may also see x-0
!!x     // Same as Boolean(x). Note double !

数値を整形したり解釈したりする処理は、プログラムではよく行われる処理です。JavaScript には、数値から文字列への変換や、文字列から数値への変換において整形や解釈を行う関数やメソッドが用意されています。

The toString() method defined by the Number class accepts an optional argument that specifies a radix, or base, for the conversion. If you do not specify the argument, the conversion is done in base 10. However, you can also convert numbers in other base (between 2 and 36) For example:

var n = 17
binary_string = n.toString(2);       // Evaluates to "10001"
octal_string = "0" + n.toString(8);  // Evaluates to "021"
hex_string = "0x" + n.toString(16);  // Evaluates to "0x11"

Number クラスには、数値を文字列に変換するメソッドが3つ定義されています。

toFixed() converts a number to a string with a specified number of digits after the decimal point. It never uses exponential notation. toExponential() converts a number to a string using exponential notation, with one digit before the decimal point and a specified number of digits after the decimal point (which means that the number of significant digits is one larger than the value you specify). toPrecision() converts a number to a string with the number of significant digits is not large enough to display the entire integer portion of the number. Note that all three methods round the trailing digits or pad with zeros as appropriate. Consider the following examples:

var n = 123456.789;
n.toFixed(0);        // "123457"
n.toFixed(2);        // "123456.79"
n.toFixed(5);        // "123456.78900"
n.toExponential(1);  // "1.2e+5"
n.toExponential(3);  // "1.235e+5"
n.toPrecision(4);    // "1.235e+5"
n.toPrecision(7);    // "123456.8"
n.toPrecision(10);   // "123456.7890"

Number() 型変換関数に対して文字列を引数として渡すと、文字列を整数または浮動小数点リテラルとして解釈しようとします。この関数は 10 進数しか処理できません。また、文字列の末尾に数値リテラルとして利用できない文字が続いている場合には解釈できません。parseInt() 関数と parseFloat() 関数(この2つの関数はメソッドではなく、グローバル関数です)は、もう少し柔軟に対応します。

parseInt() parses only integers, while parseFloat() parses both integers and floating-point numbers. If a string begins with "0x" or "0X", parseInt() interprets it as a hexadecimal number. Both parseInt() and parseFloat() skip leading whitespase, parse as many number characters as they can, and ignore anything that follows. If the first nonspace character is not part of a valid numeric literal, they return NaN:

parseInt("3 blind mice")    // => 3
parseFloat(" 3.14 meters")  // => 3.14
parseInt("-12.34")          // => -12
parseInt("0xFF")            // => 255
parseInt("0xff")            // => 255
parseInt("-0XFF")           // => -255
parseFloat(".1")            // => 0.1
parseInt("0.1")             // => 0
parseInt(".1")              // => NaN: integers can't start with "."
parseFloat("$72.47");       // => NaN: numbers can't start with "$"

ECMAScript 3 仕様では、数値が 0 から始まる場合 (だだし「0x」でも「0X」でもない場合) 、parseInt() 関数は、その数値を 10 進数として解釈しても、また 8 進数と解釈してもよいことになっています。このように振る舞いが決まっていないので、0 から始まる数値に変換するために parseInt() を使う場合は、基数を指定するようにしてください。ECMAScript 5 仕様では、基数として 2 番目に引数に 8 を明示的に指定した場合にのみ、parseInt() 関数は 8 進数として解釈します。

parseInt() accepts an optional second argument specifying the radix (base) of the number to be parsed. Legal values are between 2 and 36. For example:

parseInt("11", 2);    // => 3 (1*2 + 1)
parseInt("ff", 16);   // => 255 (15*16 + 15)
parseInt("zz", 36);   // => 1295 (35*36 + 35)
parseInt("077", 8);   // => 63 (7*8 + 7)
parseInt("077", 10);  // => 77 (7*10 + 7)

「3.8.3 オブジェクトから基本型への変換」

Object to Primitive Conversions

オブジェクトから論理値への変換は簡単です。

オブジェクトから文字列への変換や、オブジェクトから数値への変換は、変換対象のオブジェクトのメソッドを呼び出すことで行います。

JavaScript オブジェクトには、変換を行う 2 つの異なるメソッドが存在します。また、これから説明する特殊な場合があるので、型変換は理解しにくくなっています。ここで紹介する文字列と数値への変換規則は、ネイティブオブジェクトにだけ適用されます。例えば、Web ブラウザで定義さてれいるようなホストオブジェクトについては、独自のアルゴリズムを使って数値や文字列に変換されます。

すべてのオブジェクトは、変換メソッドを 2 つ持ちます。

多くのクラスでは、そのクラス用に toString() メソッドを定義しています。

[1,2,3].toString()                  // => "1,2,3"
(function(x) { f(x); }).toString()  // => "function (x) {\n    f(x);\n}"
/\d+/g.toString()                   // => "/\\d+/g"
new Date(2010,0,1).toString()       // => "Fri Jan 01 2010 00:00:00 GMT+0800 (PST)"

もう1つの型変換メソッドは、valueOf() メソッドです。このメソッドは、toString() ほどはっきりとは定義されていません。

var d = new Date(2010,0,1);  // January 1st, 2010, (Pacific time)
d.valueOf()                  // => 1262332800000

ただし、JavaScript には、ここで紹介するのとは異なる方法でオブジェクトから基本型への変換が行われる場合があることに注意しておいてください。

オブジェクトを文字列に変換する場合、JavaScript は次の3つの手順を踏みます。


トラックバック - http://mnemonic.g.hatena.ne.jp/paragramma/20130108
 |