diff options
author | Masahiro FUJIMOTO <mfujimot@gmail.com> | 2021-08-26 01:31:11 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-26 01:31:11 +0900 |
commit | 5c51b6062543779cfa57c7564bd038750d906b2b (patch) | |
tree | 455d2b2935bae4b794074a0c2cb75ceb835e502b /files | |
parent | ce37d8bfd5b7aef8a088babfa2bc2ff63c79ed21 (diff) | |
download | translated-content-5c51b6062543779cfa57c7564bd038750d906b2b.tar.gz translated-content-5c51b6062543779cfa57c7564bd038750d906b2b.tar.bz2 translated-content-5c51b6062543779cfa57c7564bd038750d906b2b.zip |
Web/JavaScript/Reference/Operators/Optional_chaining を更新 (#2116)
- Markdown に変換
- 2021/08/03 時点の英語版に同期
Diffstat (limited to 'files')
-rw-r--r-- | files/ja/web/javascript/reference/operators/optional_chaining/index.html | 195 | ||||
-rw-r--r-- | files/ja/web/javascript/reference/operators/optional_chaining/index.md | 195 |
2 files changed, 195 insertions, 195 deletions
diff --git a/files/ja/web/javascript/reference/operators/optional_chaining/index.html b/files/ja/web/javascript/reference/operators/optional_chaining/index.html deleted file mode 100644 index b3eee3eb1f..0000000000 --- a/files/ja/web/javascript/reference/operators/optional_chaining/index.html +++ /dev/null @@ -1,195 +0,0 @@ ---- -title: Optional chaining (?.) -slug: Web/JavaScript/Reference/Operators/Optional_chaining -tags: - - Chaining - - JavaScript - - Language feature - - Operator - - Optional chaining - - Reference -translation_of: Web/JavaScript/Reference/Operators/Optional_chaining ---- -<div>{{JSSidebar("Operators")}}</div> - -<p><ruby><strong>オプショナルチェイニング</strong><rp> (</rp><rt>optional chaining</rt><rp>) </rp></ruby>演算子 <strong><code>?.</code></strong> は、接続されたオブジェクトチェーンの深くに位置するプロパティの値を、チェーン内の各参照が正しいかどうかを明示的に確認せずに読み込むことを可能にします。 <span class="seoSummary"><code>?.</code> 演算子の機能は <code>.</code> チェーン演算子と似ていますが、参照が {{glossary("nullish")}} ({{JSxRef("null")}} または {{JSxRef("undefined")}}) の場合にエラーとなるのではなく、式が短絡され <code>undefined</code> が返されるところが異なります。</span> 関数呼び出しで使用すると、与えられた関数が存在しない場合、 <code>undefined</code> を返します。</p> - -<p>これは、参照が失われた可能性のある連結されたプロパティにアクセスする時、結果的に短く単純な式になります。また、必要なプロパティの存在が保証されていない場合にオブジェクトのコンテンツを探索するのにも役立ちます。</p> - -<p>オプショナルチェイニングは、存在しないルートオブジェクトでは使用できません。<code>if (typeof a == "undefined")</code> のようなチェックを置き換えるものではありません。</p> - -<div>{{EmbedInteractiveExample("pages/js/expressions-optionalchainingoperator.html", "taller")}}</div> - -<div class="hidden">このデモのソースファイルは GitHub リポジトリに格納されています。デモプロジェクトに協力したい場合は、 <a href="https://github.com/mdn/interactive-examples">https://github.com/mdn/interactive-examples</a> をクローンしてプルリクエストを送信してください。</div> - -<h2 id="Syntax" name="Syntax">構文</h2> - -<pre class="syntaxbox notranslate"><var>obj</var>?.<var>prop</var> -<var>obj</var>?.[<var>expr</var>] -<em>arr</em>?.[<var>index</var>] -<var>func</var>?.(<var>args</var>) -</pre> - -<h2 id="Description" name="Description">解説</h2> - -<p>オプショナルチェイニング演算子は、参照や関数が <code>undefined</code> または <code>null</code> である可能性がある場合でも、接続されたオブジェクトの値に簡単にアクセスする手段を提供します。</p> - -<p>たとえば、入れ子構造を持つオブジェクト <code>obj</code> を考えましょう。オプショナルチェイニング演算子なしで深い入れ子になったサブプロパティにアクセスするには、次のように、各プロパティ間の参照を確認する必要があります:</p> - -<pre class="brush: js notranslate">let nestedProp = obj.first && obj.first.second;</pre> - -<p><code>obj.first.second</code> の値にアクセスする前に、 <code>obj.first</code> の値が <code>null</code> または <code>undefined</code> でないことを確認します。これにより、 <code>obj.first</code> をテストせずに直接 <code>obj.first.second</code> にアクセスしたときに起きるエラーを防ぐことができます。</p> - -<p>しかし、オプショナルチェイニング演算子 (<code>?.</code>) を使えば、<code>obj.first.second</code> にアクセスしようとする前に <code>obj.first</code> の状態を明示的にテストする必要がなくなります:</p> - -<pre class="brush: js notranslate">let nestedProp = obj.first?.second;</pre> - -<p><code>?.</code> を <code>.</code> の代わりに用いることで、 JavaScript が <code>obj.first.second</code> にアクセスしようとする前に <code>obj.first</code> が <code>null</code> または <code>undefined</code> でないことを暗黙的に確かめるようになります。<code>obj.first</code> が <code>null</code> または <code>undefined</code> であった場合、式が自動的に短絡され、 <code>undefined</code> が返ります。</p> - -<p>これは、一時的な変数が作成されないことを除き、次の式と等価です。</p> - -<pre class="brush: js notranslate">let temp = obj.first; -let nestedProp = ((temp === null || temp === undefined) ? undefined : temp.second); -</pre> - -<h3 id="Optional_chaining_with_function_calls" name="Optional_chaining_with_function_calls">関数呼び出しでオプショナルチェイニング演算子を使う</h3> - -<p>存在しない可能性がある関数の呼び出しを試行するときに、オプショナルチェイニングを使うことができます。これはたとえば、ユーザーのデバイス上で使えなかったり、実装が古かったりするために使えなかったりする可能性がある API を使うときに役立ちます。</p> - -<p>関数呼び出しでオプショナルチェイニング演算子を用いた場合、メソッドが見つからないときは自動的に <code>undefined</code> が返ります。例外はスローされません。</p> - -<pre class="brush: js notranslate">let result = someInterface.customMethod?.();</pre> - -<div class="blockIndicator note"> -<p><strong>注意:</strong> 上記のようなプロパティの関数がない場合に、<code>?.</code> を使用すると {{JSxRef("TypeError")}} 例外が発生します (<code>someInterface.customMethod is not a function</code>)。</p> -</div> - -<div class="blockIndicator note"> -<p><strong>注意:</strong> <code>someInterface</code> 自体が <code>null</code> または <code>undefined</code> の場合にも、{{JSxRef("TypeError")}} 例外が発生します (<code>someInterface is null</code>)。<code>someInterface</code> 自体が <code>null</code> または <code>undefined</code> の可能性がある場合は、次の位置にも <code>?.</code> を使用しなければなりません。<code>someInterface?.customMethod?.()</code></p> -</div> - -<h4 id="Dealing_with_optional_callbacks_or_event_handlers" name="Dealing_with_optional_callbacks_or_event_handlers">省略可能なコールバックやイベントハンドラを扱う</h4> - -<p>コールバックを使う場合や、オブジェクトからメソッドを<a href="/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment">分割代入</a>を利用して取り出す場合に、存在しない値がある可能性があり、その存在を検証するまで関数として呼び出せません。その場合 <code>?.</code> を利用することで、検証の必要性を回避できます。</p> - -<pre class="brush: js notranslate">// Written as of ES2019 -function doSomething(onContent, onError) { - try { - // ... do something with the data - } - catch (err) { - if (onError) { // Testing if onError really exists - onError(err.message); - } - } -} -</pre> - -<pre class="brush: js notranslate">// Using optional chaining with function calls -function doSomething(onContent, onError) { - try { - // ... do something with the data - } - catch (err) { - onError?.(err.message); // no exception if onError is undefined - } -} -</pre> - -<h3 id="Optional_chaining_with_expressions" name="Optional_chaining_with_expressions">オプショナルチェイニング演算子を式と組み合わせて使う</h3> - -<p><a href="/ja/docs/Web/JavaScript/Reference/Operators/Property_Accessors#Bracket_notation">ブラケット表記法</a>とオプショナルチェイニング演算子を組み合わせることもできます。</p> - -<pre class="brush: js notranslate">let nestedProp = obj?.['prop' + 'Name']; -</pre> - -<h3 id="Optional_chaining_not_valid_on_the_left-hand_side_of_an_assignment" name="Optional_chaining_not_valid_on_the_left-hand_side_of_an_assignment">オプショナルチェイニング演算子は代入の左辺値では有効にならない</h3> - -<pre class="brush: js notranslate"><code>let object = {}; -object?.property = 1; // Uncaught SyntaxError: Invalid left-hand side in assignment</code></pre> - -<h3 id="オプショナルチェイニングにより配列の要素にアクセス">オプショナルチェイニングにより配列の要素にアクセス</h3> - -<pre class="brush: js notranslate">let arrayItem = arr?.[42];</pre> - -<h2 id="Examples" name="Examples">例</h2> - -<h3 id="Basic_example" name="Basic_example">基本的な例</h3> - -<p>次の例では、マップに存在しない <code>bar</code> メンバの <code>name</code> プロパティを取得しようとしています。したがって、結果は <code>undefined</code> になります。</p> - -<pre class="brush: js notranslate">let myMap = new Map(); -myMap.set("foo", {name: "baz", desc: "inga"}); - -let nameBar = myMap.get("bar")?.name;</pre> - -<h3 id="Short-circuiting_evaluation" name="Short-circuiting_evaluation">短絡評価</h3> - -<p>式と一緒にオプショナルチェイニング演算子を用いたとき、左側のオペランドが <code>null</code> または <code>undefined</code> である場合にその式は評価されなくなります。</p> - -<pre class="brush: js notranslate">let potentiallyNullObj = null; -let x = 0; -let prop = potentiallyNullObj?.[x++]; - -console.log(x); // 0 as x was not incremented -</pre> - -<h3 id="Stacking_the_optional_chaining_operator" name="Stacking_the_optional_chaining_operator">オプショナルチェイニングをつなげて使う</h3> - -<p>入れ子になったオブジェクトでは、オプショナルチェイニング演算子を何度でも使えます。</p> - -<pre class="brush: js notranslate">let customer = { - name: "Carl", - details: { - age: 82, - location: "Paradise Falls" // detailed address is unknown - } -}; -let customerCity = customer.details?.address?.city; - -// … this also works with optional chaining function call -let duration = vacations.trip?.getTime?.(); -</pre> - -<h3 id="Combining_with_the_nullish_coalescing_operator" name="Combining_with_the_nullish_coalescing_operator">Null 合体演算子と共に使う</h3> - -<p>{{JSxRef("Operators/Nullish_Coalescing_Operator", "Null 合体演算子", '', 1)}}はオプショナルチェイニングの後につけることで、存在しない値があった時、既定値をかわりに使うために利用できます。</p> - -<pre class="brush: js notranslate">let customer = { - name: "Carl", - details: { age: 82 } -}; -const customerCity = customer?.city ?? "Unknown city"; -console.log(customerCity); // Unknown city</pre> - -<h2 id="Specifications" name="Specifications">仕様</h2> - -<table class="standard-table"> - <thead> - <tr> - <th scope="col">仕様書</th> - <th scope="col">状態</th> - <th scope="col">備考</th> - </tr> - </thead> - <tbody> - <tr> - <td><a href="https://tc39.es/proposal-optional-chaining/#sec-scope">"オプショナルチェイニング" 演算子の提案</a></td> - <td>Stage 4</td> - <td></td> - </tr> - </tbody> -</table> - -<h2 id="Browser_compatibility" name="Browser_compatibility">ブラウザーの互換性</h2> - -<div> -<p>{{Compat("javascript.operators.optional_chaining")}}</p> -</div> - -<h2 id="See_also" name="See_also">関連情報</h2> - -<ul> - <li>{{JSxRef("Operators/Nullish_Coalescing_Operator", "Null 合体演算子", '', 1)}}</li> - <li><a href="https://github.com/tc39/proposals">TC39 proposals</a></li> -</ul> diff --git a/files/ja/web/javascript/reference/operators/optional_chaining/index.md b/files/ja/web/javascript/reference/operators/optional_chaining/index.md new file mode 100644 index 0000000000..644624bfbb --- /dev/null +++ b/files/ja/web/javascript/reference/operators/optional_chaining/index.md @@ -0,0 +1,195 @@ +--- +title: オプショナルチェーン (?.) +slug: Web/JavaScript/Reference/Operators/Optional_chaining +tags: + - Chaining + - JavaScript + - Language feature + - Operator + - Optional chaining + - Reference +browser-compat: javascript.operators.optional_chaining +translation_of: Web/JavaScript/Reference/Operators/Optional_chaining +--- +{{JSSidebar("Operators")}} + +**オプショナルチェーン** (optional chaining) 演算子 (**`?.`**) は、接続されたオブジェクトチェーンの深くに位置するプロパティの値を、チェーン内の各参照が正しいかどうかを明示的に確認せずに読み込むことを可能にします。 + + `?.` 演算子の機能は `.` チェーン演算子と似ていますが、参照が [nullish](/ja/docs/Glossary/Nullish) ({{JSxRef("null")}} または {{JSxRef("undefined")}}) の場合にエラーとなるのではなく、式が短絡され `undefined` が返されるところが異なります。関数呼び出しで使用すると、与えられた関数が存在しない場合、 `undefined` を返します。 + +これは、参照が失われた可能性のある連結されたプロパティにアクセスする時、結果的に短く単純な式になります。また、必要なプロパティの存在が保証されていない場合にオブジェクトのコンテンツを探索するのにも役立ちます。 + +オプショナルチェーンは、宣言されていないルートオブジェクトでは使用できませんが、未定義のルートオブジェクトで使用できます。 + +{{EmbedInteractiveExample("pages/js/expressions-optionalchainingoperator.html", + "taller")}} + +## 構文 + +```js +obj.val?.prop +obj.val?.[expr] +obj.arr?.[index] +obj.func?.(args) +``` + +## 解説 + +オプショナルチェーン演算子は、参照や関数が `undefined` または `null` である可能性がある場合でも、接続されたオブジェクトの値に簡単にアクセスする手段を提供します。 + +たとえば、入れ子構造を持つオブジェクト `obj` を考えましょう。オプショナルチェーン演算子なしで深い入れ子になったサブプロパティにアクセスするには、次のように、各プロパティ間の参照を確認する必要があります。 + +```js +let nestedProp = obj.first && obj.first.second; +``` + +`obj.first.second` の値にアクセスする前に、 `obj.first` の値が `null` または `undefined` でないことを確認します。これにより、 `obj.first` をテストせず `obj.first.second` にアクセスしたときに起きるエラーを防ぐことができます。 + +しかし、オプショナルチェーン演算子 (`?.`) を使えば、`obj.first.second` にアクセスしようとする前に `obj.first` の状態を明示的にテストする必要がなくなります。</p> + +```js +let nestedProp = obj.first?.second; +``` + +`?.` を `.` の代わりに用いることで、 JavaScript が `obj.first.second` にアクセスしようとする前に `obj.first` が `null` または `undefined` でないことを暗黙的に確かめるようになります。`obj.first` が `null` または `undefined` であった場合、式が自動的に短絡され、 `undefined` が返ります。 + +これは、一時的な変数が作成されないことを除き、次の式と等価です。 + +```js +let temp = obj.first; +let nestedProp = ((temp === null || temp === undefined) ? undefined : temp.second); +``` + +### 関数呼び出しにおけるオプショナルチェーン演算子 + +存在しない可能性がある関数の呼び出しを試行するときに、オプショナルチェーンを使うことができます。これはたとえば、ユーザーの端末上で使えなかったり、実装が古かったりするために使えなかったりする可能性がある API を使うときに役立ちます。 + +関数呼び出しでオプショナルチェーン演算子を用いた場合、メソッドが見つからないときは自動的に `undefined` が返り、例外は発生しません。 + +```js +let result = someInterface.customMethod?.(); +``` + +> **Note:** 関数ではない名前のプロパティがあった場合、 `?.` を使用すると {{JSxRef("TypeError")}} 例外が発生します +> (`someInterface.customMethod is not a function`)。 + +> **Note:** `someInterface` 自体が `null` または `undefined` である場合にも、 {{JSxRef("TypeError")}} 例外が発生します (`someInterface is null`)。 `someInterface` 自体が `null` または `undefined` である可能性がある場合は、この位置にも `?.` を使用して `someInterface?.customMethod?.()` のようにする必要があります。 + +#### 省略可能なコールバックやイベントハンドラーの扱い + +<p>コールバックを使う場合や、オブジェクトからメソッドを<a href="/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment">分割代入</a>を利用して取り出す場合に、存在しない値がある可能性があり、その存在を検証するまで関数として呼び出せません。その場合 `?.` を利用することで、検証の必要性を回避できます。 + +```js +// Written as of ES2019 +function doSomething(onContent, onError) { + try { + // ... do something with the data + } + catch (err) { + if (onError) { // Testing if onError really exists + onError(err.message); + } + } +} +``` + +```js +// Using optional chaining with function calls +function doSomething(onContent, onError) { + try { + // ... do something with the data + } + catch (err) { + onError?.(err.message); // no exception if onError is undefined + } +} +``` + +### オプショナルチェーン演算子と式の組み合わせ + +[プロパティアクセサーのブラケット表記法](/ja/docs/Web/JavaScript/Reference/Operators/Property_Accessors#bracket_notation)を使用している式のプロパティにアクセスする際にも、オプショナルチェーン演算子を使用することができます。 + +```js +let nestedProp = obj?.['prop' + 'Name']; +``` + +### オプショナルチェーン演算子は代入の左辺値では使用できない + +```js +let object = {}; +object?.property = 1; // Uncaught SyntaxError: Invalid left-hand side in assignment +``` + +### オプショナルチェーンによる配列要素へのアクセス + +```js +let arrayItem = arr?.[42]; +``` + +## 例 + +### 基本的な例 + +次の例では、マップに存在しない `bar` メンバの `name` プロパティを取得しようとしています。したがって、結果は `undefined` になります。 + +```js +let myMap = new Map(); +myMap.set("foo", {name: "baz", desc: "inga"}); + +let nameBar = myMap.get("bar")?.name; +``` + +### 短絡評価 + +式と一緒にオプショナルチェーン演算子を用いたとき、左側のオペランドが `null` または `undefined` である場合、その式は評価されなくなります。 + +```js +let potentiallyNullObj = null; +let x = 0; +let prop = potentiallyNullObj?.[x++]; + +console.log(x); // 0 となる。 x は加算されていない +``` + +### オプショナルチェーンをつなげて使う + +入れ子になったオブジェクトでは、オプショナルチェーン演算子を何度でも使うことができます。 + +```js +let customer = { + name: "Carl", + details: { + age: 82, + location: "Paradise Falls" // 詳細な住所は不明 + } +}; +let customerCity = customer.details?.address?.city; + +// … これはオプショナルチェーンの関数呼び出しでも動作します +let customerName = customer.name?.getName?.(); // メソッドが存在しないので、 customerName は undefined +``` + +### Null 合体演算子と共に使う + +{{JSxRef("Operators/Nullish_Coalescing_Operator", "Null 合体演算子", '', 1)}}はオプショナルチェーンの後につけることで、値が存在しなかったときの既定値を指定することができます。 + +```js +let customer = { + name: "Carl", + details: { age: 82 } +}; +const customerCity = customer?.city ?? "Unknown city"; +console.log(customerCity); // Unknown city +``` + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} + +## 関連情報 + +- {{JSxRef("Operators/Nullish_Coalescing_Operator", "Null 合体演算子", '', 1)}} |