おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

javascriptの基礎をお勉強

最近まで、あまり勉強せずにjavascriptを書いていたのですが、そろそろ基礎から勉強しないと効率が悪いように思えてきました。
というわけで勉強したことをメモ。

論理式

  • if文では、falseだけでなく0, NaN(Not a Number), null の時がfalseになり、それ以外はtrue

値はデータ型を持ってる。データ型には二つ種類がある。

  • 基本データ型(数値、文字列、論理値)
  • 複合データ型(オブジェクト。関数や、配列も含まれる)

リテラル

直接記述されている値をリテラルという。3とか"hoge"とかtrueとか。他にも下記のような関数リテラルやオブジェクトリテラルがある。

関数リテラル
function() {
  // ...
}
オブジェクトリテラル
{ プロパティ名:値, プロパティ名:値, ...}

オブジェクトリテラルを評価するたびにオブジェクトが作られる。

for(var=i; i < 10; i++) {
   var hoge[i] = { fuga: "foo" };
}
こんな風にしたらオブジェクトが10個できる。

オブジェクト

  • オブジェクトは、名前の付けられた値(プロパティ)を集めたもの。プロパティにアクセスする方法は下記の二つがある。
    • image.width
    • image["width"]
  • 特定のオブジェクトのプロパティに格納された関数をメソッドと呼ぶ。
  • オブジェクトのプロパティに値を代入するだけで、プロパティを生成できる。

基本型と参照型

値によって、値そのものが入っているもの(基本型)と参照が入っているもの(参照型)がある。

  • 基本データ型は基本型
  • オブジェクトは参照型

値同士を比較するときに、基本型は値で比較するが、参照型は同じものを参照しているかで比較する。また、例外として文字列は参照型だけど比較するときは値で比較する。

変数宣言

  • var a = 0, b, c;とかできる
  • varで宣言せずに変数を使った場合はエラーだけど、値に代入してもエラーにはならない。そのときの変数はグローバル変数となる。
alert(hoge); // var hogeってしてないのでエラー
foo = "fuga"; // var fooってしてないけどエラーにはならない。fooはfunction{}の中でもグローバル変数になる

スコープ

ここが本エントリ一番の発見。javascriptにはブロックレベルのスコープがない!らしい。関数で宣言した変数は、どこで宣言しても関数の「全体で有効」になる。「全体で有効」っていうのは下記のようなことなので、ローカル変数は関数の先頭でまとめて宣言するのがよさげ。

var scope = "global";
function f() {
  alert(scope);   // undefindが表示される!!
  var scope = "local";
  alert(scope);   // localが表示される

for文

2通りできる

for(var i; i < 10; i++){ 
  // ...
}
for(var name in obj) {
}

in演算子

in演算子で、プロパティの存在チェックができる

if ("x" in o) {
  alert("xあり");
} else {
  alert("xなし");
}

delete演算子

オブジェクトのプロパティを削除できる