質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

618閲覧

javaScriptでオブジェクトの有無判定についての実装方法や考え方について知りたいです

rommi_mirror

総合スコア1

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/08/19 03:00

編集2020/08/19 05:46

前提

nuxtを使用してシステムを作っています。
(今回の質問はnuxtとは関係ないと思うのでjavaScriptタグのみ付けております。)
今までPHPでしかシステムを作ったことがなかったので、javaScriptの知識が浅い
実装の質問もなのですが、実装する際の考え方があっているかの確認がしたいため投稿させていただきました。

現在APIが通信エラーになった際のテストをしており、下記のエラーが返ってきました。
通信エラーが発生した際、res.data.statusは返ってこないように実装されています。

発生している問題・エラーメッセージ

YYYY-MM-DD [APP/PROC/WEB/0] ERR ERROR Cannot read property 'status' of undefined

対象のオブジェクトがないからundefinedが出ているのは理解しています。

該当のソースコード

javascript

1 // resはAPIから返ってきたレスポンスとする 2 if (!res || !res.data || !res.data.status ) { 3 context.redirect('/error') 4 }

質問したいこと

  • javaScriptではオブジェクトがあるかどうかわからない時(オブジェクトはあるが中身が空も含む)、上記のような判定の仕方は正しいですか?
  • obj.hasOwnProperty()などを使うべきなのか?
  • エラーがはかれるのは許容すべきなのか?

なぜ疑問に思ったか、質問した経緯、その他

  • phpでundefinedが出た時、先輩にはこの手のエラーログが出ないように実装しろと言われていたので、疑問に思いました。jsではこの手のエラーログは出ても仕方ない、許容されている・・・とかあるのでしょうか?
  • ネットで一応調べて、上記の実装も正しいように思えましたが、エラーが出てるのが個人的に気持ち悪い&ネットだと探し方が悪かったのか納得があまりできる説明がなかったため、参考になるURLや回答があれば教えてください。よろしくお願いします。

追記

レスポンス書いてましたが勘違いが生じそうなので削除しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/08/19 03:03

本当にその行で「Cannot read property 'status' of undefined」が出ているのですか?
rommi_mirror

2020/08/19 04:47

はい、出ておりますー。 返り値が記載されていなかったので追記しました。
rommi_mirror

2020/08/19 04:55

ご返信ありがとうございます。 すみません、入れ違いでベストアンサー選んでしまったのですが再確認しますmm
rommi_mirror

2020/08/19 05:38

確認しました。 ご指摘の通り、別の行でのエラーでした。。 context.redirect('/error') の後の処理が続いていたようで、 ifの処理の後に、res.data.statusを呼び出している箇所があり、そこでエラーが出てました。大変失礼しました。。。
guest

回答3

0

ベストアンサー

javascript

1if (!res || !res.data || !res.data.status ) { 2 context.redirect('/error') 3}

上記でも問題なさそうですが、プロパティが深くなるにつれて条件分岐も伸びてしまうので、使用可能なら?.を用いると尚よいです。

javascript

1if (!res?.data?.status) { 2 context.redirect('/error') 3}

投稿2020/08/19 03:06

nekoniki

総合スコア2411

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rommi_mirror

2020/08/19 04:51

ご返信ありがとうございます。 プロパティが深くなった場合このような処理が必要なのですね・・・ こちらの実装でエラーでずに判定できました、ありがとうございます。
guest

0

こんにちは。

ご提示の条件式をres && res.data && !res.data.statusとするといかがですか?


また、ヌル合体演算子やオプショナルチェイニング演算子のご使用はいかがですか?
Null合体演算子 - JavaScript | MDN
Optional chaining - JavaScript | MDN

投稿2020/08/19 03:07

編集2020/08/19 03:27
Lhankor_Mhy

総合スコア36151

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lhankor_Mhy

2020/08/19 03:27

ああ、前段は真偽がおかしいですね。失礼しました。
rommi_mirror

2020/08/19 04:49

ご返信ありがとうございます。 こちらに参照で書かれていたOptional chainingで試したところ上手く行きました。ありがとうございます。
guest

0

すみません、ご指摘がありましたが別の行でのエラーでした。。
行番号が出ていなかったため見逃しておりました。

記載したコードの後ろに

javascript

1 // resはAPIから返ってきたレスポンスとする 2 if (!res || !res.data || !res.data.status ) { 3 context.redirect('/error') 4 } 5 const hoge = res.data.status

というようにres.data.statusを使用しており、リダイレクト後にもこの処理が呼ばれていたようでした。
下記の様にreturnを入れたところ完全にエラー出なくなりました。

javascript

1 // resはAPIから返ってきたレスポンスとする 2 if (!res || !res.data || !res.data.status ) { 3 context.redirect('/error') 4 return 5 } 6 const hoge = res.data.status

エラー行数が出なかったのと簡易的な実行環境で確認していたため、いろいろ勘違いが生じてしまいました。
しかし、教えていただいた判定も知らない物だったので大変勉強になりました。
返信下さった三人の方ありがとうございました。

投稿2020/08/19 05:52

rommi_mirror

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問