回答編集履歴
4
テキスト修正
test
CHANGED
@@ -148,7 +148,7 @@
|
|
148
148
|
|
149
149
|
|
150
150
|
|
151
|
-
において、`post.tags` が null だったら、`post.tags.map(・・・` は実行されずに、`{・・・}` の中の全体が `null` と評価されます。もし仮に && が短絡評価をしてくれな
|
151
|
+
において、`post.tags` が null だったら、`post.tags.map(・・・` は実行されずに、`{・・・}` の中の全体が `null` と評価されます。もし仮に、 `&&` が短絡評価をしてくれなくて、`post.tags` が null であっても、&& の後ろの `post.tags.map(・・・` を実行しようとするものだとしたら、やはり、`Cannot read property 'map' of null` でエラーになってしまいます。言い換えると、
|
152
152
|
|
153
153
|
|
154
154
|
|
3
テキスト修正
test
CHANGED
@@ -148,7 +148,7 @@
|
|
148
148
|
|
149
149
|
|
150
150
|
|
151
|
-
において、`post.tags` が null だったら、`post.tags.map(・・・` は実行されずに、`{・・・}` の中の全体が `null` と評価されます。もし仮に && が短絡評価をしてくれないとすると、`post.tags` が null であるのに、&& の後ろの `post.tags.map(・・・` を実行しようとするので、やはり、`Cannot read property 'map' of null` でエラーになってしまいます。
|
151
|
+
において、`post.tags` が null だったら、`post.tags.map(・・・` は実行されずに、`{・・・}` の中の全体が `null` と評価されます。もし仮に && が短絡評価をしてくれないとすると、`post.tags` が null であるのに、&& の後ろの `post.tags.map(・・・` を実行しようとするので、やはり、`Cannot read property 'map' of null` でエラーになってしまいます。言い換えると、
|
152
152
|
|
153
153
|
|
154
154
|
|
@@ -158,9 +158,13 @@
|
|
158
158
|
|
159
159
|
```
|
160
160
|
|
161
|
+
**と書くことで、post.tags のfalsyチェックとして働く理由は、** `&&` **が短絡評価だから**
|
161
162
|
|
162
163
|
|
164
|
+
|
165
|
+
|
166
|
+
|
163
|
-
と
|
167
|
+
と言えます。
|
164
168
|
|
165
169
|
|
166
170
|
|
2
テキスト修正
test
CHANGED
@@ -42,7 +42,7 @@
|
|
42
42
|
|
43
43
|
|
44
44
|
|
45
|
-
### 追記
|
45
|
+
### 追記1
|
46
46
|
|
47
47
|
|
48
48
|
|
@@ -63,3 +63,105 @@
|
|
63
63
|
</ul>
|
64
64
|
|
65
65
|
```
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
### 追記2
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
`post.tags` が null だったり、または undefiend だったりする可能性がある場合に、単に
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
```jsx
|
78
|
+
|
79
|
+
<ul className="post-basic-tags">
|
80
|
+
|
81
|
+
{post.tags.map(・・・
|
82
|
+
|
83
|
+
```
|
84
|
+
|
85
|
+
と書いてしまうと、 `post.tags.map(・・・` のところで、 もし、`post.tags` が `null` だと、 `null`には mapメソッドは無いので、コメント頂きましたように
|
86
|
+
|
87
|
+
```
|
88
|
+
|
89
|
+
TypeError: Cannot read property 'map' of null
|
90
|
+
|
91
|
+
```
|
92
|
+
|
93
|
+
というエラーになってしまいます。
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
なので、`{・・・}` の中には、
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
`post.tags` が `null`(や `undefined`) でない場合に、`post.tags.map(・・・` を返す
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
という式を書かなければなりません。このようなときによく使うのが、先の追記1に書いた
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
```
|
114
|
+
|
115
|
+
{post.tags && post.tags.map(・・・
|
116
|
+
|
117
|
+
```
|
118
|
+
|
119
|
+
と書く方法です。これは`&&`による2つの式の結合
|
120
|
+
|
121
|
+
|
122
|
+
|
123
|
+
式1 && 式2
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
において、式1 が、Booleanに評価すればfalse になる値(falsyな値という。)の場合には、式2は評価されない(=関数やメソッドが使われていても、それらは実行されない)で、式1の値を、ただちに「式1 && 式2」という式全体を評価した値とすることを使っています。
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
これについて詳しく知るには、
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
- MDN [論理演算子](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_Operators)
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
の中の、「**ショートサーキット評価**」 (日本語では、短絡評価という。)を参照ください。今の例でいえば
|
140
|
+
|
141
|
+
|
142
|
+
|
143
|
+
```
|
144
|
+
|
145
|
+
{post.tags && post.tags.map(・・・
|
146
|
+
|
147
|
+
```
|
148
|
+
|
149
|
+
|
150
|
+
|
151
|
+
において、`post.tags` が null だったら、`post.tags.map(・・・` は実行されずに、`{・・・}` の中の全体が `null` と評価されます。もし仮に && が短絡評価をしてくれないとすると、`post.tags` が null であるのに、&& の後ろの `post.tags.map(・・・` を実行しようとするので、やはり、`Cannot read property 'map' of null` でエラーになってしまいます。なので、
|
152
|
+
|
153
|
+
|
154
|
+
|
155
|
+
```
|
156
|
+
|
157
|
+
{post.tags && post.tags.map(・・・
|
158
|
+
|
159
|
+
```
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
と書けるのは、&&が短絡評価だからです。
|
164
|
+
|
165
|
+
|
166
|
+
|
167
|
+
`post.tags`がnullの場合、`post.tags && post.tags.map(・・・)` 全体が null になることは、上記で説明したとおりですが、この場合は JSXでいうと、`{・・・}` の中が null ということになり、Reactの規則において、{・・・}の中がnullであっても許容される(≒JSXとして間違ってない)ので、この場合は、回答に書いたJSXの例でいうと、`<li>`がひとつもない `<ul>`がレンダーされます。
|
1
テキスト修正
test
CHANGED
@@ -39,3 +39,27 @@
|
|
39
39
|
|
40
40
|
|
41
41
|
CSSクラスも、`post-basic-tagname` を、複数形の `post-basic-tags` にしています。参考になれば幸いです。
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
### 追記
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
`post.tags` の `falsy` チェックを追加しました。
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
```jsx
|
54
|
+
|
55
|
+
<ul className="post-basic-tags">
|
56
|
+
|
57
|
+
{post.tags && post.tags.map(({ name, slug }) =>
|
58
|
+
|
59
|
+
<li key={name}>name: {name}, slug: {slug}</li>)
|
60
|
+
|
61
|
+
}
|
62
|
+
|
63
|
+
</ul>
|
64
|
+
|
65
|
+
```
|