Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ES2020: Optional chaining #1179

Closed
2 tasks
azu opened this issue Jun 20, 2020 · 5 comments · Fixed by #1205
Closed
2 tasks

ES2020: Optional chaining #1179

azu opened this issue Jun 20, 2020 · 5 comments · Fixed by #1205

Comments

@azu
Copy link
Collaborator

azu commented Jun 20, 2020

Optional chaining - JavaScript | MDN

https://jsprimer.net/basic/object/#confirm-property でまさにその事例があるので、ここで紹介する。
#1178 Nullish coalescing Operatorとの組み合わせについても紹介するといいのかもしれない?
ユースケースでこういう箇所あるかな?

やること

@azu azu mentioned this issue Jun 20, 2020
12 tasks
@azu
Copy link
Collaborator Author

azu commented Jun 28, 2020

#1178 Optional Chainは暗黙的 nullish という言葉の定義に依存している感じがする。

なので、理想的に Nullish coalescing Operator → Optional Chaining の順番になるのがよさそう

https://tc39.es/ecma262/#sec-optional-chains

@azu
Copy link
Collaborator Author

azu commented Jun 28, 2020

@azu
Copy link
Collaborator Author

azu commented Jul 5, 2020

こういうのとかあるけど、うーん。なんか言い換えるほどのメリットがでてない

// `options`が指定されなかったときは空のオブジェクトが入る
function wrapText(text, options = {}) {
    const prefix = options.prefix ?? "接頭辞:";
    const suffix = options.suffix ?? ":接尾辞";
    return prefix + text + suffix;
}
// falsyな値を渡してもデフォルト値は代入されない
console.log(wrapText("文字列")); // => "接頭辞:デフォルト:接尾辞"
console.log(wrapText("文字列", {
    prefix: "Start:",
    suffix: ":End"
})); // => "Start:文字列:End"
// オプションの一部だけを指定した場合は、それぞれのデフォルト値が採用される
console.log(wrapText("文字列", { prefix: "カスタム:" })); // => "カスタム:デフォルト:接尾辞"
console.log(wrapText("文字列", { suffix: ":カスタム" })); // => "接頭辞:文字列:カスタム"

Optional chaining(?.)を利用することで、デフォルト引数の指定は次のように書き換えることもできます。

function wrapText(text, options) {
    // `options`がundefinedまたはnullの時点で右辺を評価する
    const prefix = options?.prefix ?? "接頭辞:";
    const suffix = options?.suffix ?? ":接尾辞";
    return prefix + text + suffix;
}
// falsyな値を渡してもデフォルト値は代入されない
console.log(wrapText("文字列")); // => "接頭辞:デフォルト:接尾辞"
console.log(wrapText("文字列", {
    prefix: "Start:",
    suffix: ":End"
})); // => "Start:文字列:End"
// オプションの一部だけを指定した場合は、それぞれのデフォルト値が採用される
console.log(wrapText("文字列", { prefix: "カスタム:" })); // => "カスタム:デフォルト:接尾辞"
console.log(wrapText("文字列", { suffix: ":カスタム" })); // => "接頭辞:文字列:カスタム"

@azu
Copy link
Collaborator Author

azu commented Jul 5, 2020

存在確認ではなくて、プロパティのアクセスでやるといいのかな?

@azu
Copy link
Collaborator Author

azu commented Jul 5, 2020

const printWidgetName(widget){
  console.log(widget?.window?.title ?? "名前はありません");
}
const widget = {
    window: {
        title: "ウィジェットのタイトル"
    }
};
printWidgetName(widget);

こんな感じのOptional chaining(?.)を使って実装する例と、if文で実装する例で比較する感じで紹介するのが良さそうな気がする。
最初の例がtypoなのがちょっと微妙なのかな?

ちょっとアウトラインを整理して考えてみるのがよさそう

@azu azu closed this as completed in #1205 Aug 29, 2020
azu added a commit that referenced this issue Aug 29, 2020
Nullish coalescing演算子(`??`)とOptional chaining(`?.`)に関する変更

## 変更点

- [x] **falsy**の説明を演算子の章に移動
  - falsyの対応としてnullishを演算子の章で解説するため
  - BigIntの `0n` も falsy に追加 #445 
- [x] Optional chaining演算子の(`?.`)の解説を"オブジェクト"の章に追加
- [x] Nullish coalescing演算子(`??`)とOptional chaining(`?.`)の組み合わせを説明
- [x] Nullish coalescing演算子(`??`)の解説を"演算子"の章に追加
- [x] 一部のコードを `||` を `??` に置き換え
  - 例としては問題ないけど、`??` 推奨気味に変更

## 追加しなかったこと

- デフォルト値に対するNullish coalescing演算子(`??`)とOptional chaining(`?.`)の組み合わせのパターン
  - 他にもいろいろな書き方があるため含めないようにした
- 関数呼び出しとOptional chaining演算子(`?.`)
  - `window.fn?.()` みたいなケース
  - ユースケースがイマイチ。別の解決方法でも良いと思える気がする

fix #1178 
fix #1179
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant