JavaScript / TypeScript では一見すると「これなんだ?」という記号の演算子や構文がよく出てくるので、自分用の備忘録としてメモしておく。式と演算子 - JavaScript | MDNには演算子の一覧のページがあるため、わからない記号が出てきたら以下のページを見るとだいたい載っているはず。
?? - Nullish coalescing operator
- Null 合体 (??) - JavaScript | MDN
- Null 合体演算子 (??) は論理演算子の一種です。この演算子は左辺が null または undefined の場合に右の値を返し、それ以外の場合に左の値を返します。
- 例えば以下のコードだと、aがnull or undefinedの場合は
a is null or undefined
がvalに代入される
const val = a ?? 'a is null or undefined';
!! - Double not operator
- Logical NOT (!) - JavaScript | MDN
- 複数の否定演算子を連続して使用することで、明示的にあらゆる値を対応する論理型プリミティブに変換することができます。
- 否定の否定なので肯定ということになり、元の値をbooleanに変換するということらしい
const val = !!a; // val is always boolean
?. - Optional chaining operator
- オプショナルチェーン (?.) - JavaScript | MDN
?.
演算子の機能は . チェーン演算子と似ていますが、参照が nullish (null または undefined) の場合にエラーとなるのではなく、式が短絡され undefined が返されるところが異なります。関数呼び出しで使用すると、与えられた関数が存在しない場合、 undefined を返します。
const val = a?.b?.c; // aがnull or undefinedの場合 val が undefinedになる
... - Spread syntax
- スプレッド構文 - JavaScript | MDN
- スプレッド構文 (...) を使うと、配列式や文字列などの反復可能オブジェクトを、0 個以上の引数 (関数呼び出しの場合) や要素 (配列リテラルの場合) を期待された場所で展開したり、オブジェクト式を、0 個以上のキーと値のペア (オブジェクトリテラルの場合) を期待された場所で展開したりすることができます。
- 一番多用されるのは配列やオブジェクトをコピーするときなのではないかと思われる
const arr = [1, 2, 3]; const arr2 = [...arr]; // arr.slice()みたいな
! - Non-null assertion operator
これはJavaScriptではなくてTypeScriptにしかない演算子。
- TypeScript: Documentation - TypeScript 2.0
- 以下のようなコードの時に、
e
がundefinedまたはnullではないことを保証して、name
にアクセスできる
// Compiled with --strictNullChecks function validateEntity(e?: Entity) { // Throw exception if e is null or invalid entity } function processEntity(e?: Entity) { validateEntity(e); let s = e!.name; // Assert that e is non-null and access name }