ホームに戻る
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.

を表示します。

inserted by FC2 system