teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

テキスト修正

2020/06/09 00:36

投稿

jun68ykt
jun68ykt

スコア9058

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` と評価されます。もし仮に && が短絡評価をしてくれないとすると、`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(・・・

3

テキスト修正

2020/06/09 00:36

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2020/06/09 00:30

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2020/06/09 00:25

投稿

jun68ykt
jun68ykt

スコア9058

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