最近まで、あまり勉強せずにjavascriptを書いていたのですが、そろそろ基礎から勉強しないと効率が悪いように思えてきました。
というわけで勉強したことをメモ。
論理式
- if文では、falseだけでなく0, NaN(Not a Number), null の時がfalseになり、それ以外はtrue
値
値はデータ型を持ってる。データ型には二つ種類がある。
- 基本データ型(数値、文字列、論理値)
- 複合データ型(オブジェクト。関数や、配列も含まれる)
リテラル
直接記述されている値をリテラルという。3とか"hoge"とかtrueとか。他にも下記のような関数リテラルやオブジェクトリテラルがある。
関数リテラル
function() { // ... }
オブジェクト
- オブジェクトは、名前の付けられた値(プロパティ)を集めたもの。プロパティにアクセスする方法は下記の二つがある。
- image.width
- image["width"]
- 特定のオブジェクトのプロパティに格納された関数をメソッドと呼ぶ。
- オブジェクトのプロパティに値を代入するだけで、プロパティを生成できる。
基本型と参照型
値によって、値そのものが入っているもの(基本型)と参照が入っているもの(参照型)がある。
- 基本データ型は基本型
- オブジェクトは参照型
値同士を比較するときに、基本型は値で比較するが、参照型は同じものを参照しているかで比較する。また、例外として文字列は参照型だけど比較するときは値で比較する。
変数宣言
- var a = 0, b, c;とかできる
- varで宣言せずに変数を使った場合はエラーだけど、値に代入してもエラーにはならない。そのときの変数はグローバル変数となる。
- つまりグローバル変数にはvarがいらない。でも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) { }
delete演算子
オブジェクトのプロパティを削除できる