回答編集履歴

4

テキスト修正

2020/06/09 00:36

投稿

jun68ykt
jun68ykt

スコア9058

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
 

3

テキスト修正

2020/06/09 00:36

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2020/06/09 00:30

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2020/06/09 00:25

投稿

jun68ykt
jun68ykt

スコア9058

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
+ ```