第31回 はてなのインターン講義4日目「JavaScript で学ぶ イベントドリブン」を見て知ったこと

インターン講義4日目「JavaScript で学ぶ イベントドリブン」 - Hatena Developer Blog
を見て知ったことを自分用にまとめ。

プリミティブな値

number, boolean, string とかはプリミティブ。
Javaの int とかそんな感じ。 Javaだと int をラップする IntegerなんてのがあるけどJSでもstring, number をラップする String, Numberがある。

プリミティブなstringは自動的にラッパーのStringに変換されるときがある

"foobar".toLowerCase();

ってやると プリミティブな値なのにメソッド呼べる。これは自動手にラッパーのStringに変換されるため。

arguments

関数実行時にインタプリタが自動的に作成するのが、arguments。
arguments.callee には、関数自身が入っている。
arguments[0] には 関数への第1引数が入ってる。

配列ぽいものを配列にするおまじない

argmentsみたいに配列っぽいけど配列じゃないものがJSには多い。
そういったものを配列に変えるには、

var 配列 = Array.prototype.slice.call(配列ぽいやつ, 0);

で変換できるみたい。

変数の初期化の罠

関数の途中でvar付きで宣言したものは、関数の頭で宣言したことになる。
というのは知っていたが、

function(){
	alert(foo); //=> undefined
	var foo = 2;
	alert(foo); //=> 2
}

これは、ひとつめのalertはundefinedを表示する。なぜなら、関数の頭で var foo = 2; が行われるのではなくて、関数の頭ではあくまで var foo; が行われるだけ。 つまり var foo = undefined; が行われるだけで、2が代入されるのは書いたとおりの場所だから。

関数の call メソッド

関数は暗黙的に call メソッドをもっており、このメソッドにthis にしたいものを引数に与えることができる。
Perlだと第1引数をthis($self)に与えるけど、そんな感じでcallメソッドが使える。

プロトタイプチェーン

すこし気になったので検索してみた。


参考ページ:

JavaScriptのオブジェクト指向:プロトタイプをきちんと理解する - builder by ZDNet Japan
個人的には .prototype なんて使わずに、参考にさせていただいたページのように


引用:

function Person(name) {
    // this演算子を用いて、メンバを追加
    this.name = name;
    this.hello = function() {
    // this演算子を用いてメンバを参照
      alert("こんにちは。私の名前は" + this.name + "です。");
    };
  }

としちゃえばいいんじゃないの?と思っていたのだが、参考ページにあるとおり .prototype 使わないと、メモリを無駄に使ってしまうみたい。 .prototype を使えば、 .prototypeごしに皆で同じ関数を参照できてハッピー! 資源を大切にできました! ってことみたい。

JSのページを作りました

http://www.x-shenwu.net/~home_page/js/