てきとうなメモ

本の感想とか技術メモとか

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

JavaScriptUnicodeに対応しており日本語に対しても文字列関数を正しく用いることができる.はずなんだが,うちの環境ではうまくいかない.

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>