jsは動的型付け言語に分類され、静的型付け言語の様に変数の型はないが、文字列、数値、真偽値といった値の型は存在しこれらの値の型の名前をデータ型と呼ばれる。
データ型には大きく分けて
プリミティブ型とオブジェクトの2つに分類される
プリミティブ型
真偽値や数値などの基本的な値の型のこと、プリミティブ型は一度作成したらその値自体を変更できないイミュータブルの特性を持つ
オブジェクト
複数のプリミティブ型の値またはオブジェクトからなる集合のこと、その値自体を変更することができる。
イメージとして…
宣言した変数を後から変更した場合に、新しい値は新たに保存されたメモリ空間に保存され、前の参照先(メモリー空間)に保存された値を直接変更できるわけではない為
オブジェクトへの何かしらの操作は値ではなく値の参照先を経由して操作されるため値の変更ができている。
プリミティブの種類(7つ)
オブジェクト
プリミティブ型でないものは、オブジェクト
type of演算子を使うことで次のようにデータ型を調べることができる。
プリミティブな値はtype ofを使用するとその値のデータ型を返してくれる
オブジェクトに分類される値は"object"を返す
[](配列と)と{}(オブジェクト)はどちらも"object"と出力されるため正しく判定することができないが関数はオブジェクトの中でも特別扱いされているためtypeofの評価結果としてはfunctionが出力される。
リテラルとはプログラム上で数値や文字列などデータ型の値を直接記載できるように構文として定義されたものを言う。
プリミティブ型でよく使われるリテラル
オブジェクトでよく使われるリテラル
真偽値の返す値としてtrueとfalseがの値を返すリテラル
数値を扱うためのデータ型JavaScriptのNumber型では、整数も少数も同じNumber型として扱うことのできる
正確に扱うことができる数値は2の53乗から1引いた値
3.14159のような浮動小数点数リテラルがある
10進数、2進数、8進数、16進数の4種類が存在する。
10進数:
複数の数字を組み合わせ先頭に0の記載を行うと場合によっては8進数として扱われる時がある。
例)0,2,10
2進数: 0b(または0B)の後ろに、0または1の数字の組み合わせ
例)0b0、0b10、0b1010
8進数:
0oで始める(または0O)0か7の数字を使用する
0o は数字のゼロと小文字アルファベットのo
例)0o644、0o777
16進数:
0x(または0X)の後ろに、0から9までの数字とaからfまたはAからFのアルファベットの組み合わせアルファベットの大文字・小文字の違いは値には影響しません
例)0x30A2、0xEEFF
名前 | 表現例 | 用途 |
---|---|---|
10進数 | 42 | 数値 |
2進数 | 0b0001 | ビット演算 |
8進数 | 0o777 | ファイルのパーミッション |
16進数 | 0xEEFF | 文字のコードポイント,RGB |
0から始まる場合は0を省略することができる。
.をオブジェクトとして扱う機会が多いため0から始まる場合でも省略をせずに書いたほうがバグを減らせる
eは指数(exponent)を意味する記号で、eのあとには指数部を表すことができる。
2e8の場合だと2☓10の8乗と表現することができる。
Number型で取り扱うことのできない大きな数値を扱うためのデータ型
数値リテラルが正確に表せる最大の数値よりも大きな値を扱いたいとき(9007199254740991)
は末尾にnをつける
数値が大きくなるほど、桁数の見間違いが発生してしまうので_区切り文字で入れてあげると見と視認性が向上する
数値リテラルを評価する際に_は単純に無視される
Numeric Separatorsは数値リテラルである整数、浮動小数点、BigIntのリテラル内でのみ使用可
_はリテラルの先頭や最後に追加することができない
文字列リテラル共通のルールとして同じ記号囲んだ内容を文字列として扱う、文字列の場合だと3種類のリテラルがある。その評価結果はすべて同じ文字列として出力される。
jsではダブルクォート""、シングルクォート''は他のrubyやphpとは異なりどちらで書いた場合も全く同じ結果となる
文字列リテラルは同じ記号で囲む必要があるため同じ記号が出現した場合は、 'のように\(バックスラッシュ)を使ってエスケープの必要がある
ダブルクォート、シングルクォートはどちらも改行をそのままでは入力できはい
改行の代わりに改行記号をエスケープシーケンスを(\n)を使用することで複数の文字列を書くことができる
バッククォートで囲んだ範囲を文字列とするリテラル
改行記号のエスケープシーケンスの記載は不要になる
テンプレートのような機能を持っているためテンプレートリテラル内で${変数}と書いた場合変数の値をうめこむことができる
他の文字列リテラル記号と同様に同じリテラル記号を内側で記載したいときはエスケープしてあげる必要がある。
nullリテラルはnull値を返すリテラル。
nullは値がないときを表す値。
値がないことを表現したい場合は任意の変数にnullを明示的に代入することで、null値を持つ変数を定義できる
undefinedはリテラルではない
プリミティブ型のundifinedはリテラルではなく、グローバル変数でundifinedという値をもっているだけ
undefinedはただのグローバル変数であるため、同じundefinedという名前のローカル変数を宣言可
true、false,nullなどはグローバル変数ではなくリテラルであるため変数を定義することはできない
jsにおいてオブジェクトはあらゆるものの基礎となり作成方法は{}オブジェクトリテラルを使用して新しいオブジェクトを作成することができる。
オブジェクトリテラルは作成と当時に:を{}の中に記載することで定義を行うことができる。
objというオブジェクトはkeyというプロパティーを持っている。
objのkeyを参照する方法
配列[]で値を区切りで囲み、その値を持つarrayオブジェクトを作成する。
配列は複数の値を順番に格納できるオブジェクトの一種
配列は0から始まるインデックス番号を指定することによって対応した値を参照することができる
配列に対してarray[index]で値の参照をすることができる。
jsでは正規表現をリテラルでかくことができる、
記載方法は/と/(スラッシュ)で表現することができる
正規表現とは、ある特定のパターンを持つ文字列を指定する表記法の一つ。文字列の検索や置換、抽出などを行う際の対象の指定などのために用いられる。
正規表現のパターン内では+などの特定の記号や\バックスラッシュから始まる特殊文字が特別な意味をを持つ
プリミティブ方は基本的にはリテラルで表現するが、真偽値や数値、文字列をオブジェクトとして表現する方法もありこれらのプリミティブの値をラップしたオブジェクトであるためラッパーオブジェクトと呼ばれる
ラッパーオブジェクトはnew演算子と対応するコンストラクタ関数を利用して作成できる
文字列を作りたいときは(Stringでコンストラクタ関数を使用する)
stringでコンストラクター関数を使用してラッパーオブジェクトを作る流れ
プリミティブ型のデータもオブジェクトのように参照する仕組みがあるため
基本的にはラッパーオブジェクトを使う理由はありません。
lenghtのようなオブジェクトが持つプロパティーにアクセスできるのも
プリミティブ型のデータのプロパティーにアクセスする際にラッパーオブジェクトへ暗黙的な型変換が行われてるため
明示的にラッパーオブジェクトを作成するには冗長な書き方が必要になるため、常にリテラルでプリミティブ型のデータを表現することが推奨されている。
ソースコード内にべた書きした文字や数字のこと。(literal: 文字の、文字通りの)
例
BigIntを使用すると、53bit(2の53乗)である「 9007199254740992 」より大きな値を扱うことが可能となる。
4バイトの整数の最大値は (2の31乗 - 1) = 2,147,483,647
これより大きな値を扱うことが出来る。
PostgreSQLのINTEGERの最大値は2,147,483,647!
Railsでテーブルを作成する際、DBがPostgreSQLやMySQLの場合はid
がbigint
になる。
(SQLiteはinteger
)
レコードの数が膨大になり、足りなくなるため。