JavaScript入門 (2)
型
JavaScriptでサポートされているデータ型は以下の物がある.
- 数値 (number)
- 文字列 (string)
- 真偽値 (boolean)
- 関数 (function)
- オブジェクト (object)
- 未定義 (undefined)
ある値の型はtypeofを用いることで調べることができる.
js> typeof 42 number js> typeof "JavaScript" string js> typeof true boolean js> typeof print function js> typeof new Date() object js> typeof undefined undefined js>
数値
整数
JavaScriptも通常のプログラミング言語と同様に数を表現でき,加減乗除の簡単な計算を行うことができる.
js> 42 42 js> 3 + 2 5 js> 2 - 5 -3 js> 4 * 3 12 js> 6 / 3 2 js> 7 % 3 1 js> - 42 -42
ただし,'/'は整数の商を求めるのではなく,浮動小数点数を返す.
js> 2 / 3 0.6666666666666666
16進表記
数値のリテラルは10進以外の表現もでき,8進数と16進数で表現できる.ただし,8進数のリテラルはECMA-262 revision3で除去され,下位互換性のためだけに存在する.
js> 010 8 js> 0x10 16
浮動小数点数
浮動小数点数は以下のように表現できる
js> 3.14159 3.14159 js> .01 0.01 js> 3.00E8 300000000 js> 6.63e-34 6.63e-34
InfinityとNaN
特殊な値としてInfinityとNaNがある.例えば,数値を0で割ると無限大を表すInfinityになる
js> 1 / 0 Infinity js> -1 / 0 -Infinity
0を0で割るNaN(Not a Number)という値になる.しかし,NaNの型はnumberである.
js> 0 / 0 NaN js> typeof NaN number js>
InfinityやNaNであるかどうかはisFiniteやisNaNで調べることができる.
js> isFinite(1/0) false js> isNaN(0/0) true
数学関数
数学関数はMathオブジェクトを用いて計算することができる.Mathオブジェクトには以下のような定数や関数がある.
js> Math.PI 3.141592653589793 js> Math.E 2.718281828459045 js> Math.sin(Math.PI/2) 1 js> Math.log(Math.E) 1 js> Math.abs(-1) 1 js> Math.ceil(1.2) 2 js> Math.min(3, 1) 1 js> Math.pow(2, 10) 1024 js> Math.sqrt(65536) 256 js> Math.random() 0.4507465665911181 js>
文字列
文字列は""で囲むか''で囲む.""と''の違いは'と"のどちらをエスケープせずに記述できるかであり,その他のエスケープシーケンスはどちらでも記述することができる.
js> "hoge" hoge js> 'hoge' hoge js> "first line\nsecond line" first line second line js> 'first line\nsecond line' first line second line
'+'を用いることで文字列の連結を行うことができる.
js> "Java" + "Script" JavaScript
また,lengthメソッドを用いて文字列の長さを計算することができる
js> "Mozilla".length 7
文字列関数
以下のような文字列関数がある.
js> "JavaScript".charAt(4) S js> "JavaScript".indexOf("Script") 4 js> "Java".concat("Script") JavaScript js> "This sentence will pe splitted".split(" ") This,sentence,will,pe,splitted js> "JavaScript".substr(4, 6) Script js> "JavaScript".search(/Script/) 4 js> "JavaScript".toLowerCase() javascript js> "JavaScript".toUpperCase() JAVASCRIPT
Unicode
JavaScriptはUnicodeに対応しており日本語に対しても文字列関数を正しく用いることができる.はずなんだが,うちの環境ではうまくいかない.
js> "じゃばすくりぷと".length 24 // 本当は8 js> "じゃばすくりぷと".charAt(2) ? // 本当は'ば'
こっちのShellなどで実行するとうまくいく.
"じゃばすくりぷと".length 8 "じゃばすくりぷと".charAt(2) ば
型変換
数値と文字列に対して+演算子を用いると文字列に型変換され連結される.
js> 42 + " is the number" 42 is the number js> "The number is " + 42 The number is 42
その他の演算子だと文字列が数値に文字列に型変換される.
"37" * "5" 185
変数
変数の宣言はvarを用いて行う.
js> var a = 42
宣言していない識別子を評価するとReferenceErrorが起こる.
js> b typein:5: ReferenceError: b is not defined
宣言しているが代入していない変数は値undefinedを持つ.
js> var c js> c js> print(c) undefined js>
変数のスコープ
JavaScriptのスコープはグローバルなスコープと関数のスコープを持っている.
var g = 42; function foo(a) { var l = 28; return l + a; } print(g); print(l);
上のスクリプトを実行すると,関数の中で宣言したlにはアクセスすることができずにReferenceErrorが発生する.
$ js -f sample.js 42 sample.js:9: ReferenceError: l is not defined
ブロックスコープは存在せず(JavaScript1.7では追加されているようだ),そのため,ブロック内で宣言された関数はブロック外でも利用することができる.
js> var sum = 0; js> for (var i = 0; i < 10; i++) { sum += i; } 45 js> sum 45 js> i 10 js>
varを使わない変数宣言
varを用いなくても変数に代入することでその変数を利用できるようになる.しかし,この変数は常にグローバルなスコープを持ち,あまり推奨されていない.はずなんだが,JavaScript Shellではvarを使わなくても関数ローカルな変数になっている
js> function foo(a) { var l = 42; return l + a; } js> l typein:12: ReferenceError: l is not defined js> function bar(a) { g = 42; return g + a; } js> g typein:5: ReferenceError: g is not defined // 本当はアクセスできるはず js>