2021/05/02

[js]はてな、はてなはてな、はてなドット

C言語の人なので、JavaScriptのコードもなんとなく読める。

と思っていたのだが、さっぱりわからんものも存在する。


??, ??=

Null合体、Null合体代入、などと呼ぶらしい。

??

??=

 

まず代入しない方の??から。

A ?? Bという書き方で、Aがnullでもundefinedでもない場合はAを返し、そうでない場合はBを返す。主な使い方なのかわからんが、初期値の設定として使う例が書かれている。

C = A ?? 固定値

みたいな書き方で、Aが初期化済みだったらその値を使い、そうじゃなかったら固定値を割り当てる。

??=は、その代入版のようなものだが、代入されるのは自分が未初期化の場合のみだそうな。


||=, &&=

上の??=に似ていて、条件が合ったときだけ代入される。

||=は自分が偽の場合、&&=は自分が真の場合。


?.

Optional chaining、というそうだ。

接続されたオブジェクトチェーンの深くに位置するプロパティの値を、チェーン内の各参照が正しいかどうかを明示的に確認せずに読み込むことを可能にします

わからんね。

 

 

const adventurer = {
  name: 'Alice',
  cat: {
    name: 'Dinah'
  }
};

const dogName = adventurer.dog?.name;
console.log(dogName);

これだと、adventurerのメンバにdogはいないのだが、参照の正しさを確認しないので、dogNameに代入するときに「adventurer.dog.nameはundefinedだ」ということでundefinedになる。

 

const adventurer = {
  name: 'Alice',
  cat: {
    name: 'Dinah'
  }
};

const dogName = adventurer.dog.name;
console.log(dogName);

この場合は「adventuere.dog自体が存在しない」と代入時に判断するので、console.log()までたどり着かずにエラーとなる。

 

const dogName = adventurer?.dog;
console.log(dogName);

こんな感じでルート項目というか親というかがundefinedの場合は?.であってもエラーになる。参照をチェックしないのはチェーンなので、親はチェックするということだろう。

…などと思ったが、?.の対象となる要素は右側にある名前だ。A?.BだったらBの方に意味があるので、ここだとadventurerの中にdogがあってもなくてもエラーにしないというだけのことだ。

 

const adventurer = {};
adventurer.dog = {name: 'Pochi'};
const dogName = adventurer.dog?.name;
adventurer.dog = {name: 'Tama'};
console.log(dogName);

これは?.とは関係ないのだけど、出力は”Pochi”になった。adventurer.dog.nameはプリミティブな文字列型なのでdogNameに直接代入されたためだろう。adventurer.dogはオブジェクトなので、そっちを代入したなら出力は変更される。

const adventurer = {};
adventurer.dog = {name: 'Pochi'};
const dogName = adventurer.dog;
adventurer.dog.name = 'Tama';
console.log(dogName.name);

 


他にもあるのだろうが、気付いたのはこんなところだ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。