ホームに戻る
JavaScript メモ
0、はじめに
JavaScript は見た目はC言語に似ています。
よって、特にC言語と違う部分について書きます。
主に変数に型を指定しないこと
関数を変数のように扱えること、
オブジェクトとクロージャあたりが
C言語には無い要素ではないかと思います。
1、定数
定数 cn を定義。
const cn = 1;
2、変数
変数の型は明示的に指定しない。
var n = 3;
var s = 'abc';
var b = true;
次のように書くと型を調べることができる。
typeof(b);
ちなみにメモリの扱いはガーベージコレクションなので、
メモリがどのように管理されているかは不明。
3、関数
a と b を足し算する add を定義。
function add(a, b){
return a+b;
}
次のように使用する。
add(1, 2);
また、次のような奇妙な書き方もできる。
関数を値として使用するようなやり方。
var add = function(a, b){
return a+b;
}
使用の方法は同じ。
add(1, 2);
4、配列
配列は以下のように書く。
var arr = [1, 'abc', false];
以下のように要素を追加できる。
arr.push(4);
長さも取得できる。
var l = arr.length;
配列を使うと関数で複数の値を返せる。
function swap(a, b){
return [b, a];
}
[a, b] = swap(a, b);
とすると a と b をスワップする。
5、オブジェクト
オブジェクトは JavaScript 独特のもの。
いわゆるオブジェクト指向のオブジェクトとは別物。
値は「参照」であることに注意する。
var obj = {x:1, y:2};
print(obj.x);
とすると 1 を表示する。
print(obj['x']);
とも書ける。
var key = 'x';
print(obj[key]);
としても良い。
探索は、
for(var k in obj){
print(obj[k]);
}
とする。
for each(var k in obj){
print(k);
}
としても良い。
C言語を使っている人で JavaScript のわからない表現を見たときは、
このオブジェクトである可能性が高い。
繰り返すが値は「参照」になるので注意する。
6、クラス型
JavaScript はクラスをサポートしません。
ただしクラスのような振る舞いをします。
例えば次のような記述ができます。
var n = new Number(3);
文字列であれば、
var s = new String('abc');
配列は、
var arr = new Array([1, 2]);
とできる。
7、クラスの作成
あたかもクラスであるかのような次のコードが書ける。
function ClassA(n){
this.n = n;
this.print = function(){
print(this.n);
}
}
var ca = new ClassA(3);
ca.print();
型を調べるときには、
ca instanceof ClassA
とする。
8、クロージャ
クロージャは以下のように書くこと。
すなわち関数の中に関数を書いている。
function f(){
var n = 0;
function g(){
n = n + 1;
return n;
}
return g;
}
このコードは、
g = f();
とし、
g();
g();
g();
と呼んでいくと n が +1 されていく。
9、コールバック関数
オブジェクトとクロージャを組み合わせたもの。
イベント駆動の仕組みを上手に実現することができます。
var emitter = {
callbacks:[],
register:function(fn){
this.callbacks.push(fn);
},
onOpen:function(){
for each(var f in this.callbacks){
f();
}
}
}
emitter.register((function(){
var n = 1;
return function(){
print('f' + n + 'is called.');
}
})());
このように書くと、
emitter.onOpen();
と書いたときに、
f1 is called.
を表示します。