study-note

1. 変数、データ型、演算子

目次


コメント


変数宣言

  1. var
    • 再代入可能、再宣言可能
    • 関数スコープであり(関数内で定義した変数は関数内でのみ有効だが、ifやforのブロック内で定義した変数はブロック外でも使用できる)
    • 同じ名前の変数を再定義できてしまうという問題がある
  2. let
    • varの改良版
    • 再代入可能、再宣言不可
    • ブロックスコープ(関数やブロック内で宣言した変数は、関数やブロック外で使用できない)
  3. const
    • 再代入不可、再宣言不可
    • ブロックスコープ(関数やブロック内で宣言した変数は、関数やブロック外で使用できない)

変数の命名規則


データ型

プリミティブ型(基本形)

  1. Boolean(真偽値):trueまたはfalse
  2. Number(数値)
  3. BigInt(巨大な整数)
  4. String(文字列)
  5. undefined:値が未定義
  6. null:意図的な「値なし」
  7. Symbol(シンボル):一意で不変な値(一度作成したらその値自体を変更できない)

オブジェクト(複合型)


typeof演算子

Truthy / Falsy


リテラル

プリミティブ型

  1. Boolean
    • true
    • false
  2. Number a. 整数リテラル
    • 2進数(ビット演算など):0bまたは0Bの後ろ
    • 8進数(ファイルのパーミッションなど):0oまたは0Oの後ろ
    • 16進数(文字のコードポイント、RGB値など):0xまたは0Xの後ろ b. 浮動小数点数リテラル
    • .(ドット)を含んだ数値
    • eまたはEを含んだ数値
      • e(exoinent)の後に指数部の値を書く
      • 例:2e3=2*10^3
  3. BigInt
    • Number.MAX_SAFE_INTEGER(倍精度浮動小数で正確に扱える最大値、2^53-1)より大きな整数を扱える
    • 数値の後ろにnをつける
    • Numeric Separator:数値リテラル内の区切り文字として_を追加できる(例:1_000_000
      • 数値リテラル内でのみ利用できる
      • リテラルの先頭や数値の最後には追加できない
  4. String a. " ", ' '(両者は全く同じ意味) b. テンプレートリテラル:\ ``
    • 複数行の文字列を書ける
    • ${変数名}で変数の値を埋め込める
  5. null
    • 未定義の変数を参照するとエラーになるので、null値を代入することで値がないことを表現
    • undefinedはリテラルではなくグローバル変数なので、同じ名前のローカル変数を宣言できる

オブジェクト

  1. オブジェクト
    • オブジェクトの作成と同時に中身を定義できる
    const obj = {
       "key": "value"
    }
    
    • キー名:文字列またはSymbol
    • プロパティ名:オブジェクトが持つキーのこと

    • objkeyプロパティの参照 a. ドット記法:obj.key(プロパティ名が識別子である必要がある) b. ブラケット記法:obj["key"]
  2. 配列
    • []でArrayオブジェクトを作成
    • array[index]で参照
  3. 正規表現
    • 文字列の中で特定のパターンを検索・置換できるツール
    • /で正規表現のパターン文字列を囲む

ラッパーオブジェクト


演算子

二項演算子

  1. プラス演算子:+
  2. 文字列結合演算子:+
  3. マイナス演算子:-
  4. 乗算演算子:*
  5. 除算演算子:/(0で除算するとinfinity
  6. 剰余演算子:%
  7. 冪乗演算子:**Math.powメソッドも同じ動作をする)

単項演算子

  1. 単項プラス演算子:+
    • 数値を文字列に、または文字列を数値に変換(+1, +"1"
    • 数値に変換できない文字列はNaNに変換
    • 文字列から数値へは他に明示的な変換方法があるため、単項プラス演算子を使うべきではない
  2. 単項マイナス演算子:-
    • マイナスの数値の記述、数値の反転
    • 文字列などを数値に変換(-"1"
    • 数値に変換できない文字列などはNaNになるため、文字列から数値の変換に使うべきではない
  3. インクリメント演算子:++
    • オペランドの数値を+1する
    • 後置インクリメント演算子:num++(+1する前の値を返す)
    • 前置インクリメント演算子:++num(+1した後の値を返す)
  4. デクリメント演算子:--
    • オペランドの数値を-1する
    • 後置インクリメント演算子:num--(-1する前の値を返す)
    • 前置インクリメント演算子:--num(-1した後の値を返す)

比較演算子

  1. 厳密等価演算子:===
    • 同じ型かつ同じ値であるときにtrueを返す
    • オペランドがどちらもオブジェクトであるときは、オブジェクトの参照が同じであればtrueを返す
  2. 厳密不当価演算子:!==
    • 異なる型あるいは異なる値であるときにtrueを返す
  3. 等価演算子:==
    • 異なる型の場合、同じ型となるような暗黙的な型変換をしてから比較する
    • 基本的に===を使い、異なる型を比較するときは明示的に型を合わせるべき
    • 例外的に、nullundefinedの比較は==を使う
  4. 不等価演算子:!=
    • 基本的に!==を使い、異なる型を比較するときは明示的に型を合わせるべき
  5. 大なり演算子:>
  6. 大なりイコール演算子:>=
  7. 小なり演算子:<
  8. 小なりイコール演算子:<=

ビット演算子


  1. ビット論理積:&
  2. ビット論理和:|
  3. ビット排他的論理和:^
  4. ビット否定:~
  5. 左シフト演算子:<<
    • 数値をbitの数だけ左へシフトする
    • 左に溢れたビットは破棄され、0のビットを右から詰める
  6. 右シフト演算子:>>
    • 数値をbitの数だけ右へシフトする
    • 右に溢れたビットは破棄され、左端のビットのコピーを左から詰める
    • 常に符号は維持される
  7. ゼロ埋め右シフト演算子:>>>
    • >>と異なり、0のビットを左から詰める
    • 常に正の値となる

代入演算子:=

論理演算子

  1. AND演算子:&&
    • 左辺の評価結果がtrueならば右辺の評価結果を返す
    • 左辺の評価結果がfalseならばそのまま左辺の値を返す(短絡評価)
    • 左辺を評価する際に、真偽値へと暗黙的な型変換をしてから判定する
  2. OR演算子:||
    • 左辺の評価結果がfalseならば右辺の評価結果を返す
    • 左辺の評価結果がtrueならばそのまま左辺の値を返す(短絡評価)
    • 真偽値への暗黙的な型変換をする
  3. NOT演算子:!
    • オペランドの評価結果を反転した真偽値を返す
    • 真偽値への
  4. Nullish coalescing演算子:??
    • 左辺の値がnullishであるならば、右辺の評価結果を返す
    • nullish:評価結果がnullまたはundefinedとなる値
    • 値のデフォルト値を指定する場合によく利用される

三項演算子:?, :

グループ化演算子:(, )

カンマ演算子:,


明示的な型変換

  1. 任意の値→真偽値
    • Booleanコンストラクタ関数(Boolean(値))によって変換
    • Falsyな値はfalseへ変換される
  2. 数値→文字列
    • Stringコンストラクタ関数(String(値))によって変換
    • オブジェクトに対してはあまり意味のある文字列を返さないため、プリミティブ型に対してのみ有効
    • オブジェクトに対しては、配列にはjoinメソッド、オブジェクトにはJSON.stringfy静的メソッドなどがより適切
  3. シンボル→文字列
    • シンボルと文字列を+で繋いでも文字列にはならず、エラーになる
    • Stringコンストラクタ関数により明示的に文字列化する
  4. 文字列→数値
    • Numberコンストラクタ関数(Number(値))によって変換
    • ユーザー入力は文字列でしか受け取ることができないため、それを数値に変換してから利用する場合に有効
    • Number.parseInt(文字列, 基数), Number.parseFloat(文字列)
      • 文字列から数字を取り出して変換
      • 数字以外の文字列を渡すとNaNを返すため、NaNになった場合の処理を書く必要がある