ECMAScript/型

Last-modified: 2013-02-14 (木) 16:44:50

型の種類

型の名前説明
Undefinedundefined値を与えられていない変数の値はundefinedとなる。
Nullnull
Booleantrue, false真偽値
String16bit符号なし整数の列一般にテキストデータを扱うために用いる。この場合、個々の要素(16bit)はUTF-16でエンコードされていると考える。
NumberIEEE 754倍精度64bit形式の値(不動小数点数)(-0を含む),
NaN, Infinity, -Infinity
不動小数点数は s×m×2^e で表される。ここで、s,m,eの組み合わせは以下の2とおりあって、
1) s=+1or-1、2^52<=m<2^53、-1074<=e<=971
2) s=+1or-1、0<=e<2^52
-2^53以上2^53以下のすべての整数がNumber型で表現できる。
Objectプロパティの順序なし集合ECMAScript/オブジェクト#Object参照

この他、 計算の中間結果で利用され、プログラムからは利用できない型として、以下のものがある。

型の名前説明
Referenceオブジェクトのプロパティへの参照。オブジェクトとプロパティ名の組delete演算子、typeof演算子、代入文などの挙動を説明するのに使用する。ホストオブジェクト(実行環境独自提供のオブジェクト)によっては、Referenceを返却する関数を提供しているものがある。ECMAScript標準の関数やユーザ定義関数にはそのようなものはない。
List値の列引数リストの説明に使用する。
Completion種類、値、移動先の3つ組break, returnなど、制御を他に移すステートメントを説明するのに使用する。

typeof演算子

型の名前typeof演算子の結果
Undefined"undefined"
Null"object"
Boolean"boolean"
Number"number"
String"string"
Object(ネイティブ、かつ、関数)"function"
Object(ネイティブ、かつ、関数以外)"object"
Object(ホストオブジェクト)実装依存

変換

Booleanへ

以下の値はfalse。それ以外はtrue。

  • undefined
  • null
  • false
  • +0 (0と同じ), -0, NaN
  • 長さ0の文字列

注意すべき点として、以下は、trueになる。

  • "0"
  • [] (空の配列)
  • {} (空のオブジェクト)
  • new Boolean(false)
  • new Number(0)
var a0 = "";
var a1 = 0;
var a2 = "0";
var a3 = "false";
var a4 = new Boolean(false);
var a5 = new Number(0);
var a6 = [];
var a7 = {};

document.write(Boolean(a0) + "\n"); // false
document.write(Boolean(a1) + "\n"); // false
document.write(Boolean(a2) + "\n"); // true
document.write(Boolean(a3) + "\n"); // true
document.write(Boolean(a4) + "\n"); // true
document.write(Boolean(a5) + "\n"); // true
document.write(Boolean(a6) + "\n"); // true
document.write(Boolean(a7) + "\n"); // true

if文の条件式など、Booleanが要求される場合には自動的に変換される。

明示的に変換するには以下の式を使う。

Boolean(value)  // new はつけない

not(!)演算子がBooleanを要求することを利用して変換することもできる。

!!value

Numberへ

  • undefined → NaN
  • null → +0 (つまり0)
  • Boolean
    • true → 1
    • false → +0 (つまり0)
  • String
    • 別記
  • Object
    • (未執筆)

明示的に変換するには

 Number(value) // newは付けない

単項演算子の+がNumberに変換することを利用する方法もある。

(+value)

StringからNumberへ

定義はECMAScript3rd:9.3.1。以下の文字列はそれが表す数値となる。該当しない場合はNaN。

  • 10進数表記
    • 123
    • 0123 (頭に0が付いてもよい)
    • -123.45
    • +123.45
    • 123.
    • .45
    • 0.45e-4
    • 0.45e+4
    • 0.45e4
    • Infinity
    • +Infinity
    • -Infinity
    • 空白文字だけの文字列、長さ0の文字列は 0 となる。
    • eは大文字小文字を問わない。
    • Infinityは大文字小文字はこのとおりでなければならない。
  • 16進数表記
    • 0x012abc
    • 大文字小文字問わず。
    • 小数は扱わない。
    • 符号(+,-)は付けない。

留意すべき事項。

  • その文字列で表される最も近いNumberに変換される。
  • 前後の空白(タブや改行含む)は除去(無視)される。
  • 8進数表記(0777など)はサポートされない。(IEは、parseIntで8進数をサポートするが、String→Numberの型変換ではサポートしない。)
  • parseIntやparseFloatとは変換のルールが一部異なる。
var v = [
"",         // 0
"123",
"0123",     // 123
"-123.45",
"+123.45",
"123.",
".45",
"0.45e-4",
"0.45e+4",
"0.45E4",
"Infinity",
"+Infinity",
"-Infinity",
"infinity",  // NaN
"0x012abc",
"0X012aBc",
"0X012aBc.8" // NaN
];

for(i=0; i<v.length; i++) {
  document.write(v[i] + " → " + (+v[i]) + "\n");
}

parseInt

ECMAScript3rd:15.1.1.2

parseInt(string, radix) → Number

StringからNumberへの変換とは変換方法が異なる。

  • radixはn進数のnを指定。nは2~36。これ以外の場合NaNが返る。
  • radixが0またはundefined
    • 0x または 0X で始まる場合は16進数。
    • 0で始まる文字列は8進数。ただし、これは実装依存。
      • IEはサポート。
      • Chromeはサポートしていない(0で始まっても8進数としては解釈されない)。
    • そうでない場合は10進数。
  • 先頭の空白は除去。空白はタブや改行含む。#StringToNumberの場合の空白と同じ。ECMAScript3rd:9.3.1で定義されているとおり。
  • 先頭に符合 +, - を付けられる。
    • radixが何であっても付けられる。
  • radix=16のとき、0xは付いていてもいなくてもよい。
  • 数字以外の文字が出現した場合、それ以降は無視。ここで数字は0-9,a-z,A-Zのうちn進数で使われる文字。
var val = [
"  123  ", // 123
"0Xa",     // 10
"-0xa",    // -10
"0x-a",    // NaN
"-  123",  // NaN

"",         // NaN
"123",
"0123",     // 123(Chrome), 83(IE9)
"-123.45",  // -123
"+123.45",  // 123
"123.",     // 123
".45",      // NaN
"0.45e-4",  // 0
"0.45e+4",  // 0
"0.45E4",   // 0
"Infinity",  // NaN
"+Infinity", // NaN
"-Infinity", // NaN
"infinity",  // NaN
"0x012abc",  // 76476
"0X012aBc",  // 76476
"0X012aBc.8" // 76476

];


for (i = 0; i < val.length; i++) {
  document.write(val[i] + " → " + parseInt(val[i]) + "\n");
}

parseFloat

基本的に #StringToNumberの10進数の場合と同じ。
違いは、