Home > JavaScript
JavaScript Archive
JavaScript 第 5 版 7 章まとめ
- 2008-11-16 (日)
- JavaScript
今回はボリューム多め。
この章で、今まであまり馴染みがなかった Object クラスのメソッドと、しっかり把握できていなかった配列のメソッドを抑えられたと思います。
7 章 オブジェクトと配列
7.1 オブジェクトの生成
- {}(オブジェクトリテラル)と new 演算子を使ってコンストラクタ関数を呼び出して生成する方法がある。
- {} と new Object() は同じ意味となる。
- {} の中に、プロパティ名と値のペアをカンマ区切りで記述する。
- プロパティ名には識別子または文字列が使用できる。
var obj1 = {};
var obj2 = new Array(); // Array オブジェクトを生成する
var obj3 = {
"name": "hoge",
'value': 1,
obj: {x: 0, y: 0}
};
7.2 オブジェクトのプロパティ
- var の宣言は不要で、オブジェクトのプロパティに値を代入することでプロパティを生成できる。
7.2.1 オブジェクトプロパティの調査
- for/in ループでユーザ定義のプロパティを調べられる。
var obj = {
name: "hoge",
value: 1
};
var s = "";
for(var o in obj) {
s += o + " : " + obj[o] + "¥n";
}
alert(s);
7.2.2 プロパティの存在確認
- in 演算子を使ってプロパティが存在するかどうかを調べられる。
var o = {x: 0};
if("x" in o) o.x = 1;
alert(o.x); // 1
var o = {x: 0};
if(o.x !== undefined) o.x = 1;
alert(o.x);
var o = {x: 0};
if(o.x) alert("hoge");
7.2.3 プロパティの削除
- delete 演算子で削除できる。
- undefined が設定されるのではなくプロパティが削除されるので、for/in ループでも調べられなくなる。
var o = {x: 0, y: 0};
delete o.x;
var s = "";
for(var i in o) {
s += i + "¥n";
}
alert(s); // y¥n
7.3 連想配列としてのオブジェクト
- オブジェクトのプロパティにアクセスするには、ドット演算子の他に “[]“(配列演算子)を使ってアクセスできる(連想配列とも呼ばれる)。
- 配列演算子を使用した場合、実行中に生成することができる。
var addr = "";
for(var i = 0; i < 4; i++) {
addr += customer["address" + i] + "¥n"; // customer オブジェクトの address0 〜 3 プロパティの値を読み出せる
}
7.4 Object のプロパティとメソッド
- 全てのオブジェクト(Array() や Date() も含めて)は Object クラスのプロパティやメソッドを継承する。
7.4.1 constructor プロパティ
- オブジェクトの初期化で使用されたコンストラクタ関数を参照する。
- instanceof 演算子で constructor プロパティの値を調べられる。
※Safari(というか Webkit)ではバグがあるらしく、false になりました。
var d = new Date();
alert(d.constructor == Date); // true
alert(d instanceof Date); // true
7.4.2 toString() メソッド
- 呼び出したオブジェクトの値を表す文字列を返す。
7.4.3 toLocaleString() メソッド
- オブジェクトを表すローカライズされた文字列を返す。
7.4.4 valueOf() メソッド
- オブジェクトを文字列以外の基本型(数値型が多い)に変換する。
7.4.5 hasOwnProperty() メソッド
- 継承したものではないプロパティを持つ場合に true を返す。
7.4.6 propertyIsEnumerable() メソッド
- 継承したものではないプロパティを持ち、かつそのプロパティが for/in ループで調べられる場合に true を返す。
- hasOwnProperty() メソッドと同じ値を返す。
- Comments: 0
- Trackbacks: 0
JavaScript 第 5 版 6 章まとめ
- 2008-11-03 (月)
- JavaScript
6 章 文
6.5 switch 文
- switch 文は式の値と同値演算子 (===) で比較し、値が一致する case ラベルを上から順に探す。
- case 句は実行するコードの開始点を示すだけなので、その後ろの case ラベルのコードブロックを実行したくない場合(ほとんどですが)は break 文を記述する必要がある。
6.11 break 文
- 最も内側のループまたは switch 文を直ちに終了する。
- break キーワードの後にラベル名を指定すると、ラベルで指定された文の最後に処理が移動される。
6.12 continue 文
- ループ中で使用し、次の繰り返しからループの処理を再開する。
- while ループの場合は、条件式を再テストし、その結果が true であればループを実行する。
- for ループの場合は、インクリメント式を評価してから条件式を再テストし、次の繰り返し処理へ進むかどうかが判定される。
- for/in ループの場合は、指定された変数に代入された次のプロパティ名から処理が再開される。
6.14 function 文
- function 文による関数定義は、関数を定義するだけであり、コンパイルされた時点で関数文が実行されるわけではない。
alert(f(4)); // 16 が表示される。この文が実行される時点では f 関数が定義済。
var f = 0; // プロパティ f の値を上書きする
function f(x) { // 関数 f の定義は上記文より先に行われる
return x * x;
}
alert(f); // f は 0 に上書きされているので 0 が表示される
6.16 throw 文
- throw 文を記述すると例外がスローされる。
- 例外がスローされると、最も近い例外ハンドラに処理を移動する。
- 例外ハンドラは try/catch/finally 文を使って catch 句に記述する。
- 例外がスローされたコードブロックに catch 句がない場合は、さらに上位のコードブロックに catch 句がないかを調べる。
- 例外ハンドラが見つからなかった場合は、例外はエラーとしてユーザに報告される。
6.17 try/catch/finally 文
- try 句には例外処理の対象となるコードブロックを記述する。
- catch 句には try ブロック内で例外が発生した時に呼び出される文を記述する。
- finally 句に記述したコードは、try 句の処理が終了した後に必ず実行される。
- try ブロックのコードが一部でも実行されれば、finally ブロックのコードも必ず実行される。
- try ブロック中で例外が発生した場合も、catch ブロックのコードが実行された後 finally ブロックのコードが実行される。
6.18 with 文
- with 文が実行されると指定されたオブジェクトがスコープチェーンに追加される。
- 実行後には、スコープチェーンは元の状態に戻る。
- ただし、実行速度が遅くなったり、with 文の本体に関数定義と変数の初期値設定がある場合、思いがけない振る舞いが起きることがあるため、使用は控えた方が良い。
- 以下のコードの場合、o のプロパティ p を表示することを想定しているが、もしそのプロパティが存在しなかった場合、エラーにならずに f 関数の仮引数である p が使用されてしまうからという意味?
function f(o, p) {
with(o) {
alert(p);
}
}
var o = {p: 0};
f(o, 1); // o のプロパティ p の値 0 が表示される
delete o.p;
f(o, 1); // o には p プロパティが存在しないため f 関数の仮引数 p の値 1 が表示される
参考リンク
- Comments: 0
- Trackbacks: 0
JavaScript 第 5 版 5 章まとめ
- 2008-10-19 (日)
- JavaScript
引き続きサイ本のまとめ。5 章の前半は基礎的なものなので斜め読み。
5 章 式と演算子
5.5.1 比較演算子
- 比較は数値と文字列のどちらかで行われる。数値でも文字列でもないものはそのどちらかに変換される。
- 文字列の比較は Unicode の文字コード値を使って、アルファベット順で比較される。
5.5.2 in 演算子
- 左側の値が右側のオブジェクトのプロパティ名であれば true を返す。
- なお、左側の値は文字列か文字列に変換されるものでなければならないので注意。
var o = { x : 1, y : 1 };
alert("x" in o); // true
alert(x in o); // false
alert("z" in o); // false
5.5.3 instanceof 演算子
- 左側のオブジェクトが右側のクラスのインスタンスであれば true を返す。
var d = new Date();
alert(d instanceof Date); // true(Safari では false。なぜ?)
5.7.1 論理積演算子(&&)
- 左側のオペランドと右側のオペランドの両方が true の場合に true を返す。
- ただし内部的には、まず左側のオペランドを評価して false に変換できる場合は左側の式の評価結果を返し、それ以外の場合は右側のオペランドの評価結果を返す。
- よって、右側の式は必ず評価されるわけではないので、代入やインクリメンタルを右側のオペランドで使うと意図しない動作になることがある。
var a = 0, b = 1;
(a == b) && alert("equal"); // alert は表示されず、false が返される
(a != b) && alert("not equal"); // alert が表示される
5.7.2 論理和演算子(||)
- 左側のオペランドと右側のオペランドのどちらか一方または両方が true の場合に true を返す。
- 内部的には論理積演算子と同じような振る舞いをする。
5.10.3 オブジェクト生成演算子(new)
- まず、プロパティを定義せずに新しいオブジェクトを生成する。
- 次に、指定されたコンストラクタ関数を呼び出し、指定された引数を渡す。
- 新たに生成されたオブジェクトを this キーワードの値に代入する。
5.10.4 delete 演算子
- オペランドに指定されたオブジェクトのプロパティや配列の要素、変数を削除する。
- コアに組み込まれたプロパティやクライアントサイドのプロパティの一部には削除できないものがある。
- var 文で宣言された変数は削除できない。
- プロパティや変数、配列の要素を削除した場合、未定義値が代入されるわけではなくプロパティは存在しなくなる。
5.10.5 void 演算子
- オペランド値を破棄し未定義値を返す。
- Comments: 0
- Trackbacks: 0
JavaScript 第 5 版 4 章まとめ
- 2008-10-13 (月)
- JavaScript
4 章 変数
4.2 変数の宣言
- 変数は必ず var で宣言する。宣言せずに値を代入した場合、その変数はグローバル変数になる。
- var で変数の初期値を設定しなかった場合は値が代入されるまで undefined になる。
- var で宣言された変数は永続され、delete 演算子で削除できない。
4.3 変数のスコープ
- グローバル変数のスコープはプログラム全体。
- ローカル変数のスコープはその変数が宣言された関数の中。
- 関数の中にグローバル変数と同じ名前のローカル変数があった場合はローカル変数が優先され、グローバル変数は隠される。
var scope = "global"; // グローバル変数
function checkScope() {
var scope = "local"; // ローカル変数
alert(scope);
}
checkScope(); // "local"
alert(scope); // "global"
scope = "global"; // グローバル変数
function checkScope() {
scope = "local"; // グローバル変数の値を変更
}
checkScope();
alert(scope); // "local"
var scope = "global";
function checkScope() {
alert(scope); // "global" ではなく undefined
var scope = "local";
alert(scope); // "local"
}
4.3.1 ブロックレベルのスコープはない
- ある関数で宣言された変数は、どのブロックで宣言されたのにかかわらず関数全体で有効である。
// i, j, k は scope 関数内で有効である
function scope() {
var i = 0;
for(var j = 0; j < 5; j++) {
document.write(j);
for(var k = 0; k < 5; k++) {
document.write(k);
}
}
}
4.5 ガーベジコレクション
- JavaScript インタプリタは、オブジェクトが不要になったと判定したら、オブジェクトが使用していたメモリを解放する。
4.6 プロパティと変数は違うのか
- オブジェクトのプロパティと変数は基本的に同じである。
4.6.1 グローバルオブジェクト
- JavaScript インタプリタは、コードの実行前にグローバルオブジェクトを生成する。
- グローバル変数とはグローバルオブジェクトのプロパティである。
- トップレベルコードでは、this はグローバルオブジェクトを参照する。
- クライアントサイド JavaScript でのグローバルオブジェクトは Window オブジェクトである。
4.6.2 ローカル変数は Call オブジェクトのプロパティ
- ローカル変数とは Call オブジェクトのプロパティである。
4.6.3 JavaScript の実行コンテキスト
- JavaScript インタプリタは個々の関数を実行するたびに、新しい実行コンテキストを生成する。
- 関数外部のコードの実行コンテキストでは、グローバルオブジェクトが変数定義に使用される。
- 関数内部のコードの実行コンテキストでは、Call オブジェクトが変数定義に使用される。
- 実装によっては、複数のグローバル実行コンテキストが認められている場合がある(クライアントサイド JavaScript で、ウィンドウがフレームで分割されている場合など)。
- 複数のグローバル実行コンテキスト間で相互に参照できるが、これはセキュリティ上の脅威になりうる。
4.7 変数のスコープの再検討
- 実行コンテキストには、それぞれのコンテキスト毎にスコープチェーンがある。
- スコープチェーンとは、グローバルオブジェクトや Call オブジェクトを並べたもの。
- 変数 x の値を探す時は、スコープチェーンの先頭のオブジェクトから x という名前のプロパティがあるかどうかを確かめる。
- 無ければ次のオブジェクトで探索を続け、見つかるまで探索する。
- 全てのオブジェクトでそのプロパティが存在しない場合は undefined になる。
- 下記のコードで g() 関数内で変数 x の値を探す場合、まず g() の Call オブジェクトのプロパティを探し、無ければ f() の Call オブジェクト、グローバルオブジェクトの順に探索し、グローバルオブジェクトのプロパティ x の値を返す。
var x = 1;
function f() {
var y = 2;
function g() {
var z = 3;
alert(x);
}
g();
}
f();
- Comments: 0
- Trackbacks: 0
JavaScript 第 5 版 3 章まとめ
- 2008-10-13 (月)
- JavaScript
3 章 データ型と値
JavaScript のデータ型には以下のものがある。
- 基本データ型(数値、文字列、論理値)
- null、undefined
- 複合データ型(オブジェクト、配列)
- 関数
3.2.4 数値から文字列への変換
- 数値は必要に応じて、自動的に文字列に変換される。
var n = 10;
var s = n + ""; // "10"
var t = String(n); // "10"
var u = n.toString(); // "10"
3.2.5 文字列から数値への変換
- 数値が必要とされる場面で文字列を使用すると、自動的に数値に変換される。
var n = "10" * "5"; // 50
var o = "10" - 0; // 10
var p = "10" + 0; // "100"(文字列連結演算子として解釈されるため)
3.3.1 論理値の型変換
- 数値コンテキストでは true は 1 に、false は 0 に変換される。
- 文字列コンテキストでは true は “true” に、false は “false” という文字列に変換される。
- 論理値コンテキストでは 0 または NaN でない数値は true に、0 または NaN は false に変換される。
- 論理値コンテキストでは空文字でない文字列は true に、空文字は false に変換される。
- null や undefined は false に、null ではないオブジェクトや配列、関数は true に変換される。
- 明示的に型変換したい場合は Boolean() 関数を使う。
3.4 関数
- 関数はデータ型の 1 つである。
- あるオブジェクトのプロパティに関数を代入した場合、その関数はそのオブジェクトのメソッドになる。
3.4.1 関数リテラル
function square(x) { return x * x; } // 関数定義
var square = function(x) { return x * x; } // 関数リテラル
3.5 オブジェクト
- オブジェクトは連想配列として使用できる。よって image.width と image["width"] は同じ意味となる。
3-7. null 値
- null はオブジェクト型で「オブジェクトがない」という意味を表す特別な値。
3-8. 未定義 (undefined) 値
- 宣言されているが値が設定されていない変数、存在しないオブジェクトプロパティを使おうとすると、undefined 値が返る。
- null 値と undefined 値は異なる値だが、等値演算子で比較した場合は同じ値と見なされる。
(null == undefined) // true
(null === undefined) // false
undefined = 1;
alert(undefined) // 1
3.10 正規表現
- Perl の構文が使える。
3.14 基本データ型のラッパーオブジェクト
- 基本データ型の数値、文字列、論理値にはそれぞれ Number、String、Boolean というラッパークラスが用意されている。
- オブジェクトコンテキストで文字列を使用する場合、内部的に String オブジェクトが一時的に作成され、アクセスが終わった段階で回収される。
var s = "string";
alert(typeof(s)); // string
var l = s.length; // length プロパティにアクセスするため、一時的に String オブジェクトが生成されて結果が返る
var S = new String("string");
alert(typeof(S)); // object(オブジェクトは削除されない)
3.14 オブジェクトから基本データ型への変換
- オブジェクトを数値に変換する場合は、まずオブジェクトの valueOf() メソッドが呼び出され、基本データ型の値を返さなかった場合は toString() メソッドが呼び出され、toString() メソッドが返した文字列を数値に変換する。
- コンテキストが曖昧な場合(+ 演算子や比較演算子など)は通常、以下の順序で変換される。
- オブジェクトの valueOf() メソッドを呼び出す。
- 基本データ型の値が返った場合はその値を使う。そうでなければ toString() メソッドを呼び出し文字列に変換する。
- 例外として、Date オブジェクトを + 演算子で使うと、toString() メソッドを使って変換される。
3.15 「値による」データ型操作と「参照による」データ型操作
- 原則として、基本型は値により操作し、参照型は参照で操作する。
- 基本型の場合(値によるコピー)
var n = 1;
var m = n;
m = 2;
alert(n); // 1
alert(m); // 2
var d1 = new Date(2008, 9, 13); // 2008/10/13
var d2 = d1; // d1 オブジェクトへの参照
d2.setDate(1); // 1 日を設定
alert(d1.getDate()); // 1
alert(d2.getDate()); // 1
- Comments: 0
- Trackbacks: 0
Home > JavaScript
- Search
- Feeds
- Meta