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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

2回答

1027閲覧

if(error)をif(typeof error === 'undefined' | error === null)にした方が良い?

退会済みユーザー

退会済みユーザー

総合スコア0

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

0クリップ

投稿2017/07/16 13:51

編集2017/07/16 14:06

Node.jsでexpress.jsフレームワークを使っているコードを見ていると、よく以下のように書かれているのを見かけます。

if(error) return next(error);

個人的には、if(error)みたいな省略した書き方は好まないのですが、
以下のような書き方でも問題ないのですよね?

if(typeof error === 'undefined' | error === null) return next(error);

ちなみに、以下の書き方と上記の書き方では何か違いってあるのでしょうか?

if(error === undefined | error === null) return next(error);

追記

maisumakunさんの回答を拝見して、掲載コードに意図しないミスがあることに気づきましたので、いかに改めて質問内容の訂正版を掲載いたします。。。

Node.jsでexpress.jsフレームワークを使っているコードを見ていると、よく以下のように書かれているのを見かけます。

if(error) return next(error);

個人的には、if(error)みたいな省略した書き方は好まないのですが、
以下のような書き方でも問題ないのですよね?

if(typeof error !== 'undefined' || error !== null) return next(error);

ちなみに、以下の書き方と上記の書き方では何か違いってあるのでしょうか?

if(error !== undefined || error !== null) return next(error);

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

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

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

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

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

guest

回答2

0

ベストアンサー

以下のような書き方でも問題ないのですよね?

いえ、おおむね逆になります。if(error)ではerrorがtruthy(0、false、空文字列、null、undefined、NaN以外)であれば条件をみたすのに対して、if(typeof error === 'undefined' || error === null)ではnull、undefined、変数未定義の場合に条件を満たします(条件を連ねる場合は||が適切です)。

typeof error === 'undefined'は、errorという変数がなくても処理できるのがメリットです(errorのない状態でerror === undefinedとすると、strictもーどではReferenceErrorで落ちます)。

投稿2017/07/16 14:02

maisumakun

総合スコア145121

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

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

退会済みユーザー

退会済みユーザー

2017/07/16 14:07

ご回答ありがとうございます!typeof error === 'undefined'とerror === undefinedの違いについて、教えていただきありがとうございます!なるほど!そういう違いがあるのですね!大変参考になりました!!!
maisumakun

2017/07/16 14:19

下の方は、つなぐ演算子は「&&」でないといけません(||だと、「undefinedでない」と「nullでない」のどちらかはtrueなので、trueの結果にしかなりません)。 あと、「error === undefined || error === null」は、より短く「error == null」と書けます(=2つ、== nullとしてtrueになる値はnullとundefinedだけです)。
退会済みユーザー

退会済みユーザー

2017/07/17 00:13

あああああ。。。&&なのですね。ご指摘ありがとうございました!
guest

0

JavaScriptやNode.jsのコールバック関数は、第一引数がObject or nullのerror引数という慣習がある。
更にerror引数はコールバックの第一引数として定義されるので、変数未定義のエラーは原則ありえない。

また、truthy - MDNで紹介されているように、紛らわしいエラーが起こる事もまずない。
(現場に慣習を無視して第一引数にNumberやStringを返すようなエンジニアが居れば話は別)

  • Object: truthy
  • null: falsy
  • undefined: falsy

結果、記述量を減らす為に以下の書き方をするエンジニアが多い。
私もコールバック関数のガード節で記載する場合はこれ一択。

JavaScript

1var cb = function (error, val) { 2 if (error) return next(error); 3}

更にundefinedとnullを一気に確認するイディオムがある。
多少厳密にチェックしたいエンジニアはこちらの書き方を採用するケースも。

javaScript

1var cb = function (error, val) { 2 if (error != null) return next(error); 3} 4 5// 暗黙の型変換の挙動をChromeのデベロッパーツールで確認 6// undefinedやnullは暗黙の型変換でBooleanにぶつけると必ずfalseになるとは素晴らしい 7 8undefined == null; 9// true 10 11undefined == 0; 12// false 13 14undefined == false; 15// false 16 17undefined == true; 18// false 19 20null == 0; 21// false 22 23null == false; 24// false 25 26null == true; 27// false

以下のような書き方でも問題ないのですよね?

案の定正しく書けてないじゃないか!!
ちゃんと書けない輩が大勢居るから上のような書き方が推奨されるんやで!!
ツッコミはさておき修正した上で評価。

JavaScript

1var cb; 2 3// OK 4cb = function (error, val) { 5 if(typeof error !== 'undefined' && error !== null) return next(error); 6} 7 8// NG 9cb = function (error, val) { 10 if(error !== undefined && error !== null) return next(error); 11}

下の書き方がNGな理由は、undefinedは予約語ではないので別の値に上書きされる可能性があるから。
以前の質問で別の人が紹介してた理由だね。

投稿2017/07/16 15:49

編集2017/07/16 15:56
miyabi-sun

総合スコア21158

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

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

退会済みユーザー

退会済みユーザー

2017/07/17 00:14

詳しいご説明ありがとうございます!大変参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問