型と値
- 変数には型はない
- 値には型がある
- プリミティブ値 + オブジェクト型
- 関数も値 (オブジェクト)
変数には型がない
同じ変数にいろんな型の値を代入できます。
var foo = ""; // 文字列
foo = 1; // 数値も入る
foo = {}; // オブジェクトも入る
値の型
Rubyと違い「すべての値はオブジェクト」ではない。
- プリミティブ値
- Undefined型
- Null型
- Boolean型
- Number型
- Symbol型
- String型
- Object型
プリミティブ値とリテラル
参考: 文法とデータ型 - JavaScript | MDN
文字列 (String型)
- 文字列はUTF-16で表現される
- 3種類のリテラル
var str1 = "`\\n` などのエスケープシーケンスが使える\n(改行)";
var str2 = 'シングルクオートで囲むこともできる。 基本的にはダブルクオートと同じ。';
var str3 = `ES2015で追加された、テンプレートリテラル`;
var str4 = `${'この' + '様に'} 式を埋め込んだり、
改行を含む文字列を作成できる`;
参考: Template literal - JavaScript | MDN
数値 (Number型)
- 数値はIEEE 754標準の64ビット浮動小数点数
- 整数値で表現できるのは53ビットまで
- 整数とみなしてビット演算できる
var num1 = 100;
var num2 = 0xFF; // 255 (16 進数)
var num3 = 0o777; // 511 (8 進数)
var num4 = 0b1010; // 10 (2 進数)
Infinity; // 無限大を表す値
NaN; // 数値ではないことを表す値 (Not a Number)
NaN
の存在は忘れがちなので注意- 条件式で
0 <= NaN
も0 >= NaN
も偽とか、NaN === NaN
が偽とか
真偽値 (Boolean型)
true
false
未定義値 (Undefined型)
- 宣言だけされて代入されてない変数の値は
undefined
undefined // キーワードではなく定義済みの変数
Null値 (Null型)
null // `null` はキーワード
オブジェクト (Object型)
- オブジェクトはプロパティの集合
- プロパティはキーと値の組
- つまりJSにおけるオブジェクトとは辞書 (連想配列、ハッシュ) のようなもの
- 実際には単純な辞書 (key-value pair) ではない
- プロパティに属性があったり、オブジェクトが内部プロパティを持ってたり、関数の場合は呼び出しができたりする
// オブジェクトリテラル
var obj = {
name: "my name",
age: 17
};
// 配列リテラル (配列もオブジェクト)
var array = [1,2,3,4,5];
// 関数式 (関数もオブジェクト)
var func = function () { /* ... */ };
// 正規表現リテラル
var regexp = /^abcdef/;
プロパティアクセス
- ドットを使うか、角括弧を使ってオブジェクトのプロパティにアクセス
- 角括弧を使う場合は、角括弧の中は文字列として評価される
obj.name; //=> "my name"
obj["name"]; //=> "my name"
// 代入もできる
obj.name = "new name"; // 改名しました
アクセサプロパティ
オブジェクトのプロパティにsetter, getterを設定できる。
var obj = {
_name: "",
set name (val) { this._name = val },
get name () { return this._name }
};
obj.name = "new name";
obj.name; //=> "new name"
ラッパーオブジェクト
- StringやNumberコンストラクタのインスタンス
- ハマりやすいので使わないこと!
プリミティブ値との違い。
// ラッパーオブジェクトの型は `object`
typeof "String 値"; // "string"
typeof new String("`String` オブジェクト"); // "object"
// 等値演算子は参照の等値性をみる
'yo' === 'yo'; // true
new String('yo') === new String('yo'); // false
プリミティブ値に対するプロパティアクセス
- String型、Number型、Boolean型の値に対してプロパティ参照が可能
- 暗黙的にラッパーオブジェクトが生成されている
null
,undefined
はできない
- プロパティを参照するのは良い
- プロパティへ代入するのはやめよう
- ラッパーオブジェクトは使い捨てられるので、意味が無い
var foo = 'foo';
foo.toString() === 'foo'; // new String(foo).toString() と同じ
foo.bar = 'bar'; // new String(foo).bar = 'bar' と同じ
foo.bar === undefined; // foo.bar は存在しない
typeof
演算子
値の型を調べることができる。
- 注意!!!
null
は"object"
- 関数は
"function"
typeof undefined; // undefined
typeof 0; // number
typeof true; // boolean
typeof {}; // object
typeof []; // object
typeof null; // object
typeof ""; // string
typeof new String(""); // object
typeof alert; // function
参照: typeof 演算子 - JavaScript | MDN
数値と文字列の変換
String => Number
単項
+
演算子+"3"; // 3
parseInt
- 使うときは必ず基数を渡す (古い処理系でハマる)
parseInt('010', 10); // 10
- 使うときは必ず基数を渡す (古い処理系でハマる)
Number
Number("3"); // 3
Number => String
- 文字列結合
'' + 3; // '3'
toString()
var x = 123; x.toString(); // '123'
値の比較
JavaScriptの関係演算子は4種類ある。
- 等値演算子
==
, 不等演算子!=
同値演算子
===
, 非同値演算子!==
===
、!==
を使うこと!==
、!=
だと勝手に型変換されてハマる
3 == '3'; // true
3 === '3'; // false
0 == ''; // true
0 === ''; // false
undefined == null; // true
undefined === null; // false
NaN
に注意
NaNは自分自身とも等しくない値。
NaN == NaN; //=> false
NaN === NaN; //=> false
ちなみに比較演算の結果も悲惨。
0 < NaN; //=> false
0 > NaN; //=> false
文句はJavaScriptじゃなくてIEEEに言うこと。
undefined
と null
の使い分け
undefined
は未定義値を示すvar foo; typeof foo; // undefined
null
は何も入ってないことを示す- 定義されているのでobjectではある
object
が入っていることを示しつつ、空にしてきたい、とかvar foo = null typeof foo; // object
真偽評価されたときに偽になる値
いわゆるfalsyな値はつぎの7つ:。
false
''
(空文字列)0
-0
NaN
undefined
null
厳密には他にもあるけど気にしなくて良いです
他はすべて true
と評価されます。
標準オブジェクト
配列
配列リテラルでArrayオブジェクトを生成できる。 参考: Array - JavaScript | MDN
var nums = [1,2,3,4];
// 要素の操作
nums.push(5); // [1, 2, 3, 4, 5]
nums.pop(); // [1, 2, 3, 4]
nums.unshift(0); // [0, 1, 2, 3, 4]
nums.shift(); // [1, 2, 3, 4]
// ES5以降のメソッド: forEach, map, filter, reduce, etc...
var squared = [1,2,3,4].map(function (value, index, array) {
return value * value;
});