最近の記事
- 9/1 - 将棋始めました
- 5/16 - サーバー引っ越し
- 4/24 - 優先順位
- 3/17 - vbNullString と 空文字列 ""
- 3/15 - InputBox 関数の戻り値
- 3/13 - 紙と Excel と VBA
- 3/9 - 未だに Visual Basic 6
- 11/14 - ぼて閉鎖
- 11/9 - 関数オブジェクトの呼び出し
- 9/7 - メソッドとしての関数オブジェクト
Entering Passive Mode
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 のプロパティアクセサ構文は
プリミティブ値に対しても記述することができるため、
構文上、プリミティブ値にプロパティがあるように見える。
これらの言語機能は強力なのだが、プリミティブ値とオブジェクトが、
単一の同じ型であるという誤解を生む原因ともなっている。
例えば、上記のコードは実行時エラーとはならず、14, undefined と表示される。
2 回目に表示される値は 12345 ではない。
プロパティアクセサにも、暗黙の型変換が存在する。
プロパティはオブジェクトが持つものなので、
プロパティアクセサの左辺値がプリミティブ値の場合は、
一時的に対応するオブジェクトに型変換され、
そのオブジェクトのプロパティとして評価される。
ポイントは、このオブジェクトは一時的であるということだ。
そのため、暗黙の変換で生成されたオブジェクトのプロパティに
値を代入しても、すぐにそのオブジェクトは消滅してしまう。
上記の例を分かりやすく書き換えると、以下のようになる。
var value = "String Literal"; var length = new String(value).length; alert(length); var value2 = "String Literal"; new String(value2).property = 12345; alert(new String(value2).property);
こう書けば、下の property プロパティへの代入が、
一時的なオブジェクトに対するものであることは明確である。
コメント (0 件)