最近の記事
- 4/22 - 思い出の紙時計
- 3/29 - さくらインターネットの VPS リニューアル
- 3/19 - SSHD への攻撃を分析してみた
- 3/9 - キーボードの過酷さ
- 3/8 - .NET のパフォーマンスについて
- 3/7 - phpMyAdmin への攻撃
- 3/1 - ミイラ取りがミイラになりかけた
- 2/22 - URL を知らなければ安全だと?
- 2/16 - 決意
- 1/30 - ルーターの UPnP 対応状況
Entering Passive Mode
古今やたらと聞かれるので、いい加減書いておくことにした。
以下、俺式洗髪法。
髪質、体質に大きく影響すると思うので、
これが正解とか、この通りやれば良いというわけではない。
ちゃんとやる人は、プロに聞くこと。
0. 鉄則
痛む原因は、洗いすぎ、濡れているときに触る、
頭皮を洗っていない、ブラシ、ドライヤー、カラー等。
1. 洗い
function invoke(func, x, y) {
return func(x, y);
}
function foo(x, y) {
return x * y;
}
foo.value = invoke(foo, 3, 5);
var bar = foo;
alert(bar.value);
alert(foo.toString());
alert(foo === bar);
JavaScript では、関数はオブジェクトの一種である。
関数は、通常のオブジェクトとしての特性に加え、
() 構文で「呼び出し可能」という特徴を持つ、
特別なオブジェクトとして扱われる。
var value = "String Literal"; var length = value.length; alert(length); var value2 = "String Literal"; value2.property = 12345; alert(value2.property);
Number, String, Boolean の 3 つの型には、
プリミティブとオブジェクトの両方の型が存在する。
違いは、プロパティを持てるか持てないかだ。
暗黙の型変換が、色々な場所で適応されるため、
各型に対応するプリミティブ値とオブジェクトは、
ほぼ区別することなく透過的に扱うことができる。
また、JavaScript のプロパティアクセサ構文は
プリミティブ値に対しても記述することができるため、
構文上、プリミティブ値にプロパティがあるように見える。
これらの言語機能は強力なのだが、プリミティブ値とオブジェクトが、
単一の同じ型であるという誤解を生む原因ともなっている。
if (new Boolean(false) && "false") {
alert("Oops!");
}
変数や関数の引数に型を制限できる、型に厳密なプログラミング言語では、
ソースコードを解析した時点で、互換性がない型の値を検出できる。
しかし、JavaScript の値の型は常に実行時に決まる。
なので、原則として、その文を実行するまで、
どのような型が渡されるかは検出できない。
これが何を意味するかというと、関数の引数等、外部から受け取る値については、
設計者が想定している型である保障がないため、
値を使う前に、型を確認する必要があるということだ。
だが、常に型を確認するということは、コーディングの苦痛以外の何者でもないため、
JavaScript は型を制限できない代わりに、自動的・暗黙の型変換を行う仕組みを持っている。
残りの 2 つのプリミティブ値は、undefined と null だ。
これらはよく混同されるので注意が必要である。
undefined は変数(プロパティ)の既定値であり、
null は、用途は Java や C# と同じで、
まあ、これくらいは基本だろうから、
JavaScript では、変数や戻り値は型を持たず、
それは、Null 型と Undefined 型だ。