3章 JavaScriptの型
- p39 JavaScriptの変数に型はないが、値やオブジェクトには型がある
- 基本型は以下の5つ
- 文字列型
- 数値型
- ブーリアン型
- null型
- undefined型
- 上記以外はオブジェクト型
- p40 基本型変数と参照型変数がある
- 基本型変数は、値がそのまま入っているもの
- 参照型変数は、オブジェクトへの参照が入っているもの
基本型
文字列型
- p41 文字列リテラルは、'か"で囲む
- 'と"に機能の差はない
- "を文字列中に使いたい場合は'で囲み、逆の場合は"で囲むとよい
- p42 エスケープシーケンス一覧
- p43 文字列変数は不変。代入し直すと新しい文字列に入れ替わるので、参照的な振る舞いはしない
- typeofで変数の型をチェックすると、stringという文字列が返る
- p44 ===と!==は型つきチェック
- ==と!=は形なしチェック
- 不等号はunicodeベースで比較
- p45 文字列オブジェクトも存在。基本型の文字列と、文字列オブジェクトは必要に応じて暗黙で変換される。よって、lengthなどを文字列リテラルに対しても使える
- p46 基本型の文字列と、文字列オブジェクトの違いは比較時に出る。文字列オブジェクトは参照先をチェックするので、内容が同じでも等しくならない
- 文字列に''を加えると基本型の文字列に変換される
- new String()は必要がなければ使わない
- String('文字列')とすると、基本型の文字列を得られる
- p48-49 Stringクラスの機能一覧
- p49 文字列オブジェクトは文字列値と同じく不変。内容は書き換えられず、新しいものを生成して置き換えている
- 不変のものを非破壊的なメソッドといってよいメソッドと言われている
- 破壊的なメソッドはよくないといわれるが、効率面で優れていることがある
数値型
- p50 8進数表記は今後のため使わない方がよい
- typeofの結果はnumberという文字列
- p51 演算やパイなどの定数はMathオブジェクトが使える
- p52 実数を正確に利用するための機能はJavaScriptには用意されていない
- Numberクラスがあり、toString()などが使える
- 数値型とNumberクラスでは必要に応じて暗黙の変換が行われるので、new Number()は使わない方がよい
- p53 Number(値)とすると、明示的に数値型を得られる
- p54 Numberクラスのプロパティ一覧。一部抜粋
- Number.NaN 非数値
- toFixed([桁数]) 小数点表示の文字列に変換。桁数を指定すると小数点以下の桁数を指定できる
- toString([基数]) 数値を文字列に変換する。基数を指定すると、指定した進数表記で変換
- valueOf() 数値に型変換
- p55 Number.POSITIVE_INFINITYとNumber.NEGATIVE_INFINITYはそれぞれ正と負の無限大。型はnumberだが計算には使えない
- p56 変数がNaNになると、計算結果はNaNになり、比較演算は全てfalseになる。NaNかの判定はisNaN(値)で行う
- 変数がNaNか無限大などの特別値以外かを判定するのはisFinite(値)。isFinite(1)はtrue。isFinite(NaN)はfalse
ブーリアン型
- p58 trueとfalseの2値
- typeofではbooleanという文字列が返る
null型
- p60 nullは「何も参照していない」ことを表す
- nullかどうかの判定は===で行う
- nullのtypeofはobject(JavaScriptのバグとも言われている)
- Nullクラスはない
undefined型
- 未定義を表す
- typeofではundefinedの文字列が返る
- ECMA Script5以前では、undefinedに値が代入できてしまった。そういうことはしないこと
- p61 Undefinedクラスはない
- p62 ===で確認できる
nullとundefinedの違い
- nullは、ある変数が何も参照していないことを明示的に表すためのもの
- undefinedは、初期値を与えていない変数や、存在しない関数など、用意されていない変数が取る値
オブジェクト型
- typeofはobjectという文字列
- 関数もオブジェクト型だが、呼び出しができるので特殊である。typeofはfunctionが返る
型変換
- p63 暗黙の変換で混乱する場合はあるが、JavaScriptの流儀としてはなるべく簡潔に書こう
文字列から数値への変換
- Number()がシンプルだが、100xなどの数値以外の文字が入るとNaNになる
- parseInt()やparseFloat()は、100xを100に変換する
- parseInt()は2つ目の引数で基数を与えられる
- p64 引き算をする
'100'-0
100
- 足し算では文字列になるのでダメ
- +を符号として使っても数値変換になる
+'100'
100
数値から文字列へ
- 明示的には、String()かtoString()
- p65 暗黙では、文字列への足し算
typeof(''+100) string
型変換のイディオム
// 文字列→数値 var s='100'; +s; // 数値→文字列 var n=100; n+'';
- 数値に変換できないものを数値変換するとNaN
- 空の文字列を数値変換すると0
- 数値のNaNを文字列に変換すると文字列の'NaN'
- 数値のInfinityを文字列に変換すると文字列の'Infinity'
- 数値の負のInfinityを文字列に変換すると文字列の'-Infinity'
ブーリアンへの変換
- p66 以下は、ifなどの条件判断でfalseになる
- 数値0
- 数値NaN
- null値
- undefined値
- 空の文字列
- !!で、その場で型変換が可能
- !!1→true
- !!0→false
- !!''→false
- オブジェクト型は値に関わらず全てtrue
その他の型変換
- p67 true→数値だと1→文字列だと'true'
- false→数値だと0→文字列だと'false'
- null値→数値だと0→文字列だと'null'
- undefined値→数値だとNaN→文字列だと'undefined'
オブジェクト型からの型変換
- p68 String(obj)→objのtoString()と同じ。obj+''で暗黙の変換
- Number(obj)→objのvalueOf()と同じ。valueOf()に失敗する場合はtoString()の結果と同じ。+objで暗黙の変換
- Boolean(obj)→常にtrue
- undefined値→NaN→'undefined'
- 該当するobjのtoString()を上書きすると、toString()や+''の結果を独自のものに変更できる
基本型からのオブジェクト変換
- null型とundefined型は、Errorオブジェクト
- 上記以外はそれぞれのクラス
- p69 オブジェクトに数値変換可能な値が入っていない場合に数値変換すると、NaNになる