読者です 読者をやめる 読者になる 読者になる

O'REILLYの"JavaScript"を読む 第3章 データと型

JavaScriptってなんとなく書けるんだけどもう少し詳しく勉強したいよねってことで読書会をすることになった。各章を交代で担当してメンバーに説明していく形式。ということで僕に担当が回ってきて第3章を担当することに。
読書会の前にどこかにまとめておくって感じなのだけどまとめる場所がないので一旦自分のはてダに書いとく。

JavaScriptの型

ざっとまとめると以下の型がある。

数値型

最も基本的な型。CやJavaと違い、すべての型を浮動小数で表す。JavaScript内に直接書かれた数値を数値リテラルといい、以下の種類がある。

基本的な算術演算子(+, -, *, / )が使用可能。また、Mathオブジェクトを使うことでもっと複雑な計算ができる。

文字列

Unicodeの英数字、記号などの文字の並び。JavaScript内に文字列リテラルを書くときは、シングルクォートもしくはダブルクォートで囲む。また、”π"のようなUnicode文字を書くこともでき、エスケープシーケンスを利用することで文字列リテラル中にUnicode文字を書くこともできる。
JavaScriptのエスケープシーケンス
文字列リテラル同士を"+"で連結することが可能。その他にも文字列操作の方法は多く用意されている。また、文字は先頭を0番目と数える。

論理値

true/false

関数/関数リテラル
  • 関数
function hoge(num)
{
  return num + 1;
}
  • 関数リテラル
var hoge = function(num) { return num + 1; }

関数リテラルで定義された関数は「ラムダ関数」とも呼ばれる。JavaScriptでは関数もデータ型のひとつで、変数などに関数を格納したり、関数の引数に関数を渡したりできる。

オブジェクト

名前の付けられた値を集めたものをオブジェクトと呼び、個々のデータ値をオブジェクトのプロパティ(フィールド)と呼ぶ。また、オブジェクトのプロパティに格納された関数をメソッドと呼ぶ。
JavaScriptのオブジェクトは連想配列として使うことがある。以下がプロパティへのアクセス方法。

image.width
document.write("hoge")    // メソッド
image["width"]  // 連想配列

オブジェクトの生成方法は以下の通り。

var pattern = new RegExp("\\sjava\\s", "i")  // RegExpオブジェクトの生成
var point = { x:2.3, y:-1.2 } // オブジェクトリテラル
var hoge = { test: { a:1, b:2 }, test2: { a:3, b:4 } } // 入れ子にもできる
var square = { "upperLeft" : { x:point.x, y:point.y }, 
                       'sum': { x: x + 10, y: y + 20 } } // 任意の式を記述することができる。
配列

データ値の集合を配列と呼ぶ。オブジェクトではデータ値に名前がついているが、配列ではデータ値にインデックスが付けられる。配列の生成は以下。

var a = new Array(); // このコンストラクタの引数に値をひとつだけ渡すと配列の大きさを指定したことになる
var a[0] = 1;
var a[1] = "hoge";
var a[2] = true;
var a[3] = { takizawa: true, takashi: 4 }  // 配列への値の挿入。全てのデータ型が同じである必要はない
var nexta = new Array([1, "hoge", true { takizawa: true, takashi: 4 }]); // 上のコードと同意
var b = ["a", "b", "c", "d"]  // 配列リテラル

配列のインデックスは正の整数。また、多次元配列はサポートしていない。

型変換

各データ型は必要に応じて、以下の表のように別のデータ型に自動変換される。

変換前 文字列 数値 論理値 オブジェクト
空でない文字列 - 文字列の数値またはNaN true String
空文字列 - 0 false String
数値 数字に対応する文字列 - true Number
true "true" 1 - Boolean
false "false" 0 - Boolean
オブジェクト toString() valueOf()/toString()/NaN true -
基本データ型のラッパーオブジェクト

数値、文字列、論理型の基本データ型にはそれぞれ対応したラッパーとしてNumber, String, Booleanというクラスが定義されている。例えば以下のような場合、

var a = "tkzwtks is very cool";
var strsize = a.length;

aに対応したラッパーオブジェクトが生成されlengthプロパティにアクセスでき、アクセスが完了するとこのオブジェクトは回収される。この時、aは文字列のままである。

「値による」データ型操作と「参照による」データ型操作
  • 二つのデータ操作手法の違い
値による操作 参照による操作
コピー 値が実際にコピーされる 値の参照だけがコピーされる。新しい参照で値が変更されると元データも変化する
渡す 値のコピーが関数に渡される。コピーを変更しても関数外には影響がない 参照が関数に渡される。関数内で値が変更されると、関数外にも影響がある
比較 (通常)バイト単位で値を比較して同じかどうか調べる 両者が同じ値を参照しているかどうかを調べる。別個の参照を比較した場合、値がバイト単位で同じでも等しいとはみなされない

以下がJavaScriptでのデータ型操作

コピー 渡す 比較
数値 値による 値による 値による
論理値 値による 値による 値による
文字列 不変 不変 値による
オブジェクト 参照による 参照による 参照による

文字列は基本型/参照型のどちらにも分類できない性質を持っている。JavaScriptでは、文字列を構成する文字を変更することは仕様により不可能(不変)

最後に

はてダあんまり書かないのではてな記法を調べながら書いたらすげー疲れた