Programming Self-Study Notebook

勉強したことを忘れないように! 思い出せるように!!

JavaScriptの文法(演算子)

f:id:overworker:20200406080809j:plain:h250

算術演算子

演算子 説明 備考
+ 加算(文字列連結も可) 3 + 2
- 減算 3 - 2
/ 除算 3 / 2
* 乗算 3 * 2
% 除算の余り 3 % 2
- 単項符号反転 -x 符号が反転する
+ 単項プラス +x xが数値でない場合は数値への返還を試みる
++ 前置インクリメント ++x
++ 後置インクリメント x++
-- 前置デクリメント --x
-- 後置デクリメント x--

比較演算子

厳密等価演算子と等価演算子

演算子 内容 記号
厳密等価演算子
(厳密不等価演算子)
- 同じオブジェクトを参照している
- プリミティブ型でデータ型も値も同じである
===
(!==)
等価演算子
不等価演算子
- 同じオブジェクトを参照している
- 同じ値に変換されるとき
==
(!=)
  • 等価演算子の特徴
    • "1"1が等価とみなされる。
    • ""(空文字)0nullundefinedが等価とみなされる。

関係演算子

演算子 内容
< より大きい a < b
<= 以上 a <= b
> 未満 a > b
>= 以下 a >= b
  • 数値を比較する際の注意

    • NaNNaN自身を含めどの値とも等しくなりません。
      • NaN === NaNfalseNaN == NaNfalse
    • xが数値かどうかを確認する場合は、isNaN(x)を使用する。
      • isNaN(x)xが数字でない場合(NaNを含む)はtrueを返す。それ以外はfalseを返す。
  • 数値は全て倍精度小数点なので、小数部分を含む値を===で比較すると計算誤差が生じて想定通り比較できない場合がある。

    • JavaScriptにはNumber.EPSILONという特殊な定数(二つの定数が等しいとみなすことができる差)がある。
if(Math.abs(x-y) < Number.EPSILON){
  console.log('same value!');
} else {
  console.log('different value!');
}

文字列連結

  • +には「数値の足し算」と「文字列の連結」の意味がある。
    • 演算子の値を左から右に評価する。

      組み合わせ 結果
      両方が数値の場合 足し算
      どちらかが文字列の場合 文字列の連結
console.log(3+5+"8");    // "88"
console.log("3"+5+8);    // "358"

論理演算子

  • truefalse以外も扱うことが可能
    • 数値だけでなくデータ型も評価対象となる。
  • 短絡評価が適用される
    • 最初に記述された条件式から評価を実施し、評価結果が確定した時点で残りの条件式の評価を実施しなくなる。
falseとみなされる値 trueとみなされる値
undefined
null
false
0
NaN
""(空文字列)
任意のオブジェクト
任意の配列
" ”(空白のみの文字列)
文字列"false"
内容 記号
論理積(AND) &&
論理和(OR) ||
論理否定(NOT) !
// inputName に値がセットされていないときはdefaultNameを使用する。
const inputName ="TestName";
const name = inputName || defaultName;
console.log(name);

const inputName2 ="";
const name2 = inputName2 || {name:"defaultName"};
console.log(name2);

条件演算子

const inputName ="TestName";
const profile = {};
profile.name = inputName ? inputName  : defaultName;
console.log(profile);

カンマ演算子

  • 複数の式を組み合わせる
  • 「複数の式を実行するが必要な値は最後の式の結果だけ」という場合に使用する
  • forループの内部で利用されることが多い
// 例1
// 1-1
let x = 0 , y = 100 , z;
z = ( x++ , y++ );
console.log(z);  // 100

// 1-2
x = 0 , y = 100;
z = x++ , y++;
console.log(z);  // 0

グループ化演算子

  • 演算子の優先順位を変えたり、明確にする(...)カッコの組をグループ演算子と呼ぶ。

ビット演算子

  • 32ビットの符号付整数を2の歩数計式で表現したものとして被演算子を扱う。
    • JavaScriptでは数値は全て倍精度浮動小数点数なので、ビット演算を実行する前に処理系が数値をすべて32ビット整数に変換し、結果を返す前に倍精度に変換します。
演算子 説明
& ビット毎のAND 0b1010 & 0b1100 // 結果は 0b1000
| ビット毎のOR 0b1010 | 0b1100 // 結果は 0b1110
^ ビット毎のXOR 0b1010 ^ 0b1100 // 結果は 0b0110
~ ビット毎のNOT ~0b1010 // 結果は 0b0101
<< 左シフト 0b1010 << 1 // 結果は 0b10100
0b1010 << 2 // 結果は 0b101000
>> 符号を維持する右シフト 0b1010 << 1 // 結果は 0b10100
0b1010 << 2 // 結果は 0b101000
>>> ゼロ埋め右シフト
let n = 22;                         
console.log(n.toString(2));         // 10110
console.log((n >> 1).toString(2));  // 1011
console.log(n >>> 1).toString(2));  // 1011 
n = ~n;
console.log(n.toString(2));         // -10111
n++;
console.log(n.toString(2));         // -10110
console.log((n >> 1).toString(2));  // -1011
console.log((n >>> 1).toString(2)); // 1111111111111111111111111110101

typeof演算子

  • JavaScriptの7つのデータ型に正確に対応していない
console.log(typeof undefined);    // "undefined"
console.log(typeof null);         // "object"  <- 実際の型と不一致
console.log(typeof {});           // "object"
console.log(typeof []);           // "object"
console.log(typeof true);         // "boolean"
console.log(typeof 1);            // "number"
console.log(typeof "");           // "string"
console.log(typeof Symbol());     // "symbol"
console.log(typeof function(){}); // "function"

void演算子

  • 演算子を評価したうえで、undefinedを返す

代入演算子

  • 値を変数に代入する
演算子 意味
x += y x = x + y
x -= y x = x - y
x *= y x = x * y
x /= y x = x / y
x %= y x = x % y
x <<= y x = x << y
x >>= y x = x >> y
x >>>= y x = x >>> y
x &= y x = x & y
x |= y x = x | y
x ^= y x = x ^ y

分割演算子

  • オブジェクトや配列を複数の要素に簡単に分割できる
// 1
const obj = {b:2,c:3,d:4};
const {a,b,c} = obj;
console.log(a); // undefined
console.log(b); // 2
console.log(c); // 3
console.log(d); // Uncaught ReferenceError: d is not defined

// 2
const obj = {b:2,c:3,d:4};
let a,b,c;
({a,b,c} = obj);
console.log(a); // undefined
console.log(b); // 2
console.log(c); // 3
console.log(d); // Uncaught ReferenceError: d is not defined

// 3
const arr = [1,2,3];
let [x,y] = arr;
console.log(x); // 1
console.log(y); // 2

// 4
const arr = [1,2,3,4,5];
let [x,y,...rest] = arr;
console.log(x);    // 1
console.log(y);    // 2
console.log(rest); // [3,4,5]

// 5
let a = 5, b = 10;
[a,b] = [b,a];
console.log(a); // 10
console.log(b); // 5

オブジェクト演算子と配列演算子

演算子 説明
. プロパティ(メンバー)へのアクセス
delete (プロパティ(メンバー))の削除
[] 計算値でのメンバーアクセス
in プロパティの有無を調べる
new オブジェクトのインスタンスを生成する
instanceof プロトタイプチェインをテストする
... 展開

参考文献