Entering Passive Mode

2008-07 の記事

俺式洗髪法

古今やたらと聞かれるので、いい加減書いておくことにした。

以下、俺式洗髪法。

髪質、体質に大きく影響すると思うので、
これが正解とか、この通りやれば良いというわけではない。
ちゃんとやる人は、プロに聞くこと。

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 は型を制限できない代わりに、自動的・暗黙の型変換を行う仕組みを持っている。

Undefined と Null

残りの 2 つのプリミティブ値は、undefinednull だ。
これらはよく混同されるので注意が必要である。

undefined は変数(プロパティ)の既定値であり、
存在しないプロパティを参照した際に返される値でもある。

null は、用途は Java や C# と同じで、
空のオブジェクト参照を表すために使われる。

まあ、これくらいは基本だろうから、
これらの値をさらに詳しく考えてみよう。

JavaScript では、変数や戻り値は型を持たず、
常に値そのものが型(実行時型)を持っている。
undefinednull も例外ではなく、それぞれ型が存在する。

それは、Null 型と Undefined 型だ。
これが、残りの 2 つのプリミティブ型である。

このページのトップへ戻る
© 2008 Project Loafer/Project Fireball and all blog writers. Powered by Nucleus CMS