第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ごしに皆で同じ関数を参照できてハッピー! 資源を大切にできました! ってことみたい。