「JavaScript 第7版」を読む(4章~5章:式と文)
前回のスクラップの続き
?.
条件付きプロパティアクセス (Optional chaining)
null
またはundefined
にプロパティアクセスするとTypeError
が投げられてしまうのを ?.
にすれば防げる。
console.log(null?.a); // undefined
console.log(undefined?.a); // undefined
console.log({a:"Hello"}?.a); // Hello
console.log(console.log(undefined["a"]); // throw TypeError
?.[]
という書き方もできる。
console.log(undefined?.["a"]); // undefined
console.log({a:"Hello"}?.["a"]); // Hello
null
, undefined
以外ならばもともと .
だけでもエラーにはならない。
console.log((1).a); // undefined
console.log((1)?.a); // undefined
?.[]
では、null
またはundefined
のときには[]
の中が評価されない。
?.
はES2020以降。
メソッド呼び出しでは ?.()
を使える。
function hello(name) {
return `Hello, ${name}!`;
}
console.log(undefined?.("World")); // undefined
console.log(hello?.("World")); // Hello, World!
?.()
では、null
またはundefined
のときには()
の中が評価されない。
コンストラクタ呼び出しの例
new Foo
new Foo(x, y)
引数がない場合は丸かっこを省略できる。
ビット演算子は数値を32ビット整数に変換して演算する。
整数にするために小数点以下を削除し、下位32ビットだけ抜き出す。
console.log(1 << 2); // 4
console.log(4 >> 2); // 1
console.log((4 + 2 ** 30) >> 2); // 268435457 (= 1 + 2 ** 28)
console.log((4 + 2 ** 31) >> 2); // 左端のビットは負号が拡張され、負の値になる
console.log((4 + 2 ** 32) >> 2); // 1 (2 ** 32 は32ビットからあふれるため上位ビットが切り捨てられる)
const a = false;
const b = "Hello";
console.log(a || b); // Hello
!!a
のように否定演算子を2つ付けると、実質は論理値への型変換になる。
??
a ?? b
は (a !== null && a !== undefined) ? a : b
の意味
First-Defined operator (Nullish coalescing operator)
BigInt
型も数値型と同じく算術演算子が使える。
typeof
演算子は"bigint"
を返す。
delete
演算子は、undefined
を代入するのと同じではなく、その要素自体がなくなる。このことはin
演算子で区別できる。
switch
文のcase
との一致判定には ==
ではなく ===
が使われる。
オブジェクトに対するfor文の例
const obj = {
a: "Hello",
b: "World",
}
for (const key in obj) {
console.log(key)
}
for (const value of Object.values(obj)) {
console.log(value)
}
for (const [k, v] of Object.entries(obj)) {
console.log(k, v)
}
for/of
文はES6からの構文。
await
を使った構文もある。
for await (const chunk of stream) {
...
}
with
文
with (obj) {
...;
}
strictモードではwith文を使えない。
8進数リテラルは一部の処理系で使えるが、strictモードでは使えない。
class宣言はES6以降。