回答編集履歴
4
テキスト修正
answer
CHANGED
@@ -73,7 +73,7 @@
|
|
73
73
|
{post.tags && post.tags.map(・・・
|
74
74
|
```
|
75
75
|
|
76
|
-
において、`post.tags` が null だったら、`post.tags.map(・・・` は実行されずに、`{・・・}` の中の全体が `null` と評価されます。もし仮に && が短絡評価をしてくれな
|
76
|
+
において、`post.tags` が null だったら、`post.tags.map(・・・` は実行されずに、`{・・・}` の中の全体が `null` と評価されます。もし仮に、 `&&` が短絡評価をしてくれなくて、`post.tags` が null であっても、&& の後ろの `post.tags.map(・・・` を実行しようとするものだとしたら、やはり、`Cannot read property 'map' of null` でエラーになってしまいます。言い換えると、
|
77
77
|
|
78
78
|
```
|
79
79
|
{post.tags && post.tags.map(・・・
|
3
テキスト修正
answer
CHANGED
@@ -73,12 +73,14 @@
|
|
73
73
|
{post.tags && post.tags.map(・・・
|
74
74
|
```
|
75
75
|
|
76
|
-
において、`post.tags` が null だったら、`post.tags.map(・・・` は実行されずに、`{・・・}` の中の全体が `null` と評価されます。もし仮に && が短絡評価をしてくれないとすると、`post.tags` が null であるのに、&& の後ろの `post.tags.map(・・・` を実行しようとするので、やはり、`Cannot read property 'map' of null` でエラーになってしまいます。
|
76
|
+
において、`post.tags` が null だったら、`post.tags.map(・・・` は実行されずに、`{・・・}` の中の全体が `null` と評価されます。もし仮に && が短絡評価をしてくれないとすると、`post.tags` が null であるのに、&& の後ろの `post.tags.map(・・・` を実行しようとするので、やはり、`Cannot read property 'map' of null` でエラーになってしまいます。言い換えると、
|
77
77
|
|
78
78
|
```
|
79
79
|
{post.tags && post.tags.map(・・・
|
80
80
|
```
|
81
|
+
**と書くことで、post.tags のfalsyチェックとして働く理由は、** `&&` **が短絡評価だから**
|
81
82
|
|
82
|
-
と書けるのは、&&が短絡評価だからです。
|
83
83
|
|
84
|
+
と言えます。
|
85
|
+
|
84
86
|
`post.tags`がnullの場合、`post.tags && post.tags.map(・・・)` 全体が null になることは、上記で説明したとおりですが、この場合は JSXでいうと、`{・・・}` の中が null ということになり、Reactの規則において、{・・・}の中がnullであっても許容される(≒JSXとして間違ってない)ので、この場合は、回答に書いたJSXの例でいうと、`<li>`がひとつもない `<ul>`がレンダーされます。
|
2
テキスト修正
answer
CHANGED
@@ -20,7 +20,7 @@
|
|
20
20
|
|
21
21
|
CSSクラスも、`post-basic-tagname` を、複数形の `post-basic-tags` にしています。参考になれば幸いです。
|
22
22
|
|
23
|
-
### 追記
|
23
|
+
### 追記1
|
24
24
|
|
25
25
|
`post.tags` の `falsy` チェックを追加しました。
|
26
26
|
|
@@ -30,4 +30,55 @@
|
|
30
30
|
<li key={name}>name: {name}, slug: {slug}</li>)
|
31
31
|
}
|
32
32
|
</ul>
|
33
|
-
```
|
33
|
+
```
|
34
|
+
|
35
|
+
### 追記2
|
36
|
+
|
37
|
+
`post.tags` が null だったり、または undefiend だったりする可能性がある場合に、単に
|
38
|
+
|
39
|
+
```jsx
|
40
|
+
<ul className="post-basic-tags">
|
41
|
+
{post.tags.map(・・・
|
42
|
+
```
|
43
|
+
と書いてしまうと、 `post.tags.map(・・・` のところで、 もし、`post.tags` が `null` だと、 `null`には mapメソッドは無いので、コメント頂きましたように
|
44
|
+
```
|
45
|
+
TypeError: Cannot read property 'map' of null
|
46
|
+
```
|
47
|
+
というエラーになってしまいます。
|
48
|
+
|
49
|
+
なので、`{・・・}` の中には、
|
50
|
+
|
51
|
+
|
52
|
+
`post.tags` が `null`(や `undefined`) でない場合に、`post.tags.map(・・・` を返す
|
53
|
+
|
54
|
+
|
55
|
+
という式を書かなければなりません。このようなときによく使うのが、先の追記1に書いた
|
56
|
+
|
57
|
+
```
|
58
|
+
{post.tags && post.tags.map(・・・
|
59
|
+
```
|
60
|
+
と書く方法です。これは`&&`による2つの式の結合
|
61
|
+
|
62
|
+
式1 && 式2
|
63
|
+
|
64
|
+
において、式1 が、Booleanに評価すればfalse になる値(falsyな値という。)の場合には、式2は評価されない(=関数やメソッドが使われていても、それらは実行されない)で、式1の値を、ただちに「式1 && 式2」という式全体を評価した値とすることを使っています。
|
65
|
+
|
66
|
+
これについて詳しく知るには、
|
67
|
+
|
68
|
+
- MDN [論理演算子](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_Operators)
|
69
|
+
|
70
|
+
の中の、「**ショートサーキット評価**」 (日本語では、短絡評価という。)を参照ください。今の例でいえば
|
71
|
+
|
72
|
+
```
|
73
|
+
{post.tags && post.tags.map(・・・
|
74
|
+
```
|
75
|
+
|
76
|
+
において、`post.tags` が null だったら、`post.tags.map(・・・` は実行されずに、`{・・・}` の中の全体が `null` と評価されます。もし仮に && が短絡評価をしてくれないとすると、`post.tags` が null であるのに、&& の後ろの `post.tags.map(・・・` を実行しようとするので、やはり、`Cannot read property 'map' of null` でエラーになってしまいます。なので、
|
77
|
+
|
78
|
+
```
|
79
|
+
{post.tags && post.tags.map(・・・
|
80
|
+
```
|
81
|
+
|
82
|
+
と書けるのは、&&が短絡評価だからです。
|
83
|
+
|
84
|
+
`post.tags`がnullの場合、`post.tags && post.tags.map(・・・)` 全体が null になることは、上記で説明したとおりですが、この場合は JSXでいうと、`{・・・}` の中が null ということになり、Reactの規則において、{・・・}の中がnullであっても許容される(≒JSXとして間違ってない)ので、この場合は、回答に書いたJSXの例でいうと、`<li>`がひとつもない `<ul>`がレンダーされます。
|
1
テキスト修正
answer
CHANGED
@@ -18,4 +18,16 @@
|
|
18
18
|
</ul>
|
19
19
|
```
|
20
20
|
|
21
|
-
CSSクラスも、`post-basic-tagname` を、複数形の `post-basic-tags` にしています。参考になれば幸いです。
|
21
|
+
CSSクラスも、`post-basic-tagname` を、複数形の `post-basic-tags` にしています。参考になれば幸いです。
|
22
|
+
|
23
|
+
### 追記
|
24
|
+
|
25
|
+
`post.tags` の `falsy` チェックを追加しました。
|
26
|
+
|
27
|
+
```jsx
|
28
|
+
<ul className="post-basic-tags">
|
29
|
+
{post.tags && post.tags.map(({ name, slug }) =>
|
30
|
+
<li key={name}>name: {name}, slug: {slug}</li>)
|
31
|
+
}
|
32
|
+
</ul>
|
33
|
+
```
|