Closed15

「JavaScript 第7版」を読む(4章~5章:式と文)

suzuki-navisuzuki-navi

?.

条件付きプロパティアクセス (Optional chaining)

nullまたはundefinedにプロパティアクセスするとTypeErrorが投げられてしまうのを ?. にすれば防げる。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining

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以降。

suzuki-navisuzuki-navi

メソッド呼び出しでは ?.() を使える。

function hello(name) {
  return `Hello, ${name}!`;
}

console.log(undefined?.("World")); // undefined
console.log(hello?.("World"));     // Hello, World!

?.() では、nullまたはundefinedのときには()の中が評価されない。

suzuki-navisuzuki-navi

コンストラクタ呼び出しの例

new Foo
new Foo(x, y)

引数がない場合は丸かっこを省略できる。

suzuki-navisuzuki-navi

ビット演算子は数値を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ビットからあふれるため上位ビットが切り捨てられる)
suzuki-navisuzuki-navi

!!a のように否定演算子を2つ付けると、実質は論理値への型変換になる。

suzuki-navisuzuki-navi

BigInt型も数値型と同じく算術演算子が使える。

typeof演算子は"bigint"を返す。

suzuki-navisuzuki-navi

delete演算子は、undefinedを代入するのと同じではなく、その要素自体がなくなる。このことはin演算子で区別できる。

suzuki-navisuzuki-navi

オブジェクトに対する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) {
	...
}
suzuki-navisuzuki-navi

8進数リテラルは一部の処理系で使えるが、strictモードでは使えない。

このスクラップは2023/07/15にクローズされました