javascript関数から「undefined」または「null」を返す方が良いですか?


98

基本的に次のような関数を作成しました。

function getNextCard(searchTerms) {
  // Setup Some Variables

  // Do a bunch of logic to pick the next card based on termed passed through what I'll call here as 'searchTerms' all of this logic is omitted because it's not important for my question.
  // ...

  // If we find a next card to give, than give it
  if (nextCardFound)
    return nextCardFound;

  // Otherwise - I'm returning undefined
  return undefined;
}

質問:ここで「null」を返す方がよいでしょうか?

欲しいものは何でも渡すことができます-明らかに...私は何を使うのが最善かわからなかっただけです。

この関数を呼び出すコードは、未定義を処理する方法を知っています(何かがひどくうまくいかない限り、実際には実際には起こりません)

私がこの質問をしている理由は、「変数に未定義を割り当てないでください」などのように聞こえる何かをどこかで聞いたためです。デバッグが難しくなります。したがって、それnullが戻されることがわかるという事実は、戻りが機能していることを示していundefinedますが、基本的にはと同様に機能します。


ドキュメンテーション:

Mozilla Docsは私の質問に答えませんでした...グーグルも答えませんでした:\

このSOの質問は、私がここで理解しようとしていることには広すぎました。


1
このSO質問は答えませんか?
warkentien2 2016年

8
私の意見では、戻りnullます。undefinedJavaScript自体に任せてください。しかし、「より良い」ものはないので、これは意見の問題です。
Felix Kling 2016年

@ warkentien2ありがとう、これは役に立ちました-しかし、ゲッター関数から戻るための規則がここにあるかどうかはまだわかりません。
Jeremy Iglehart 2016年

1
私はnull「あなたが求めているものに適切な価値がない」とundefined「あなたが求めているものを理解できない」と読みました。
マーティ2016年

@ warkentien2その質問と、私の回答でリンクした質問は関連していますが、どちらも、どちらを戻り値として使用するかではなく両者の違いは何かを尋ねているようです。
chiliNUT 2016年

回答:


37

最善の方法はないと主張します。標準の関数でさえ、どちらかを選択することがあります。

例えば:

  • [[プロトタイプ]]

    通常のオブジェクトには[[Prototype]]内部スロットがあり、他のどのオブジェクトから継承するかを決定します。もちろん、オブジェクトが他のオブジェクトから継承されていないという言い方が必要です。この場合、「そのようなオブジェクトはありません」はを使用して表されnullます。

  • Object.getOwnPropertyDescriptor

    プロパティ記述子、つまりプロパティを説明するオブジェクト(値、書き込み可能性、列挙可能性、構成可能性など)を返すことが期待されます。ただし、プロパティが存在しない可能性があります。この場合、「そのようなプロパティはありません」はを使用して表されundefinedます。

  • document.getElementById

    指定されたIDの要素を返すことが期待されます。ただし、そのIDを持つ要素がない可能性があります。この場合、「そのような要素はありません」はを使用して表されnullます。

したがって、特定のケースに適していると思われるものを選択してください。


3
これ読んだvoid 0はこの答えの将来の視聴者のためのテクニックを提案することにしました。また、あなたの主張をより明確にするために、いくつかのコードを追加しました。ご回答ありがとうございます!
Jeremy Iglehart 2016年

114

未定義とは、通常、まだ値が割り当てられていないものを指します。ヌルとは、明らかに価値のないものを指します。その場合は、nullを返すことをお勧めします。戻り値が指定されていない関数は、暗黙的にundefinedを返すことに注意してください。

ECMAScript2015仕様から

4.3.10未定義の値

変数に値が割り当てられていない場合に使用されるプリミティブ値

4.3.12null値

オブジェクト値が意図的に存在しないことを表すプリミティブ値

http://www.ecma-international.org/ecma-262/6.0/#sec-terms-and-definitions-undefined-type

参考文献:

JavaScriptでnullまたはundefinedが使用されるのはいつですか?


1
はい、undefinedは、変数に値が割り当てられていない場合に使用される値です。なぜそれはあなたが関数で未定義を返すべきではないことを意味するのですか?
オリオール2016年

1
@Oriolは、私の考えでは、void関数はundefinedを返すため、これはその型の関数の予約値です。したがって、関数の戻り値を処理するときに、nullはnullを返すことにしたことを示しますが、undefinedはそれを示します。未定義を返すことを決定したか、何も返さないことを決定しましたが、どちらかは明確にはわかりません。さらに、私が行っている場合var x=someFunc();、意図的にxa値を割り当てており、値が割り当てられていない(または割り当てられていない可能性がある)ことを示すテストに合格しないことを望んでいます。Just imho
chiliNUT

これは受け入れられた答えでなければなりません。これは、仕様で使用することを意図した方法です
亜鉛

1
私はそれをそのように読みません。私はそれを次のように読みました:変数を定義しても初期化しない場合、代わりに初期値はundefinedになります。プログラマーは、変数が空であることを意図的に示すためにNullを使用する必要があります。IMHO undefinedは、プログラマーが変数に割り当ててはいけません。使用するのはjsエンジンに任せてください。「オブジェクト」値という用語は誤解を招く可能性があります
。JSでは

1
ええ、それは理にかなっています。公平を期すために、どちらかnull一方に固執する限り、どちらか一方を使用してもかまいません(ただし、私は慣れています)が、値がないことを示す2つの値(「タイプ」が何であれ)があると、常に混乱します。
セルジオロサス

39

私はあなたに2つの中から選ぶ私の個人的な意見の方法を与えます。

私の簡単な質問は、別の入力/状態/コンテキストが与えられた場合の値を何かに定義できるかどうかです。

答えが「はい」の場合は、nullelseを使用してくださいundefined。より一般的には、オブジェクトを返す関数nullは、目的のオブジェクトが存在しない場合に返す必要があります。別の入力/状態/コンテキストが与えられた場合に存在する可能性があるためです。

null特定の入力/状態/コンテキストに値ないことを表します。これは、値自体の概念がアプリケーションのコンテキストに存在するが、存在しない可能性があることを暗黙的に意味します。あなたの例では、次のカードの概念は存在しますが、カード自体は存在しない可能性があります。null使用すべきです。

undefinedアプリケーションのコンテキストにその値の意味ないことを暗黙的に表します。たとえば、私が操作する場合user、特定のプロパティセットを使用しオブジェクトそのプロパティにアクセスしようとした場合pikatchuです。undefined私のコンテキストでは、このようなプロパティを持つことは意味がないため、このプロパティの値はに設定する必要があります。


1
これは私にはとても真実です。関数型プログラマーのように考えるnullと、IMOの純粋関数はを返す必要がありますが、副作用のある関数はを返す必要がありundefinedます。
ジェイク

4

undefined割り当てる必要のあるものではありません。以外のものを返すことを検討することをお勧めしundefinedます。あなたの場合、何も返さなくても、結果はundefinedすでに表示されます。だから、null代わりに一緒に行くことをお勧めします。

このサンプルを考えてみましょう。

function getSomething() {
     // .. do something
     return undefined;
}

function doSomething() {
     // .. I'm not gonna return anything.
}

var a = getSomething();
var b = doSomething();

上記のサンプルの結果はa === b、ですundefined。違いは、1つのステートメントの実行を節約できることです。


@Oriolつまり、undefined割り当てる必要はありません。値のない宣言された変数はすべてすでにundefinedです。
choz 2016年

@ choz&@ Oriol- @ chiliNUTが前述したように、「戻り値が指定されていない関数は、暗黙的にundefinedを返すことに注意してください。」-(function(){ /* code */ })()コンソールでnullを返すため、これはtrueです。
Jeremy Iglehart 2016年

@JeremyIglehartそのコードは実際には何も返しません。それ以外の場合はundefined、ChromeとFirefoxのコンソールに表示されます。
choz 2016年

OK私はあなたの主張を理解していませんでした。はい、明示的に何も返さない場合、undefinedは暗黙的に返されます。しかし、なぜそれが重要なのでしょうか?
オリオール2016年

1
@ Oriol、@ chozが(この質問で言及されている他のいくつかのように)言いたかったことは、他のundefined何かが以前に返されない場合に戻りたい場合は、関数のデフォルトの動作のために返す必要はないと思います何も返さないということは、未定義を返すことです。彼らは、これは必要ないと言っているだけです。さらに... nullを返す組み込みのゲッター関数についてあなたが言わなければならなかったことが好きです。その効果に対するあなたの答えを投稿してください、そして私はそれを受け入れます。
Jeremy Iglehart 2016年

3

uが戻り値をどう処理する必要があるかによって異なります。

typeofnullはオブジェクトを返します。そのオブジェクトの値はundefinedです

typeofundefinedはundefinedを返します


個人的に私は通常nullを使用します。
ダン

4
「そのオブジェクトの値は未定義です」いいえ、そうではなく、オブジェクトでもありません。Nullです。typeof必ずしも値の実際のデータ型を返すとは限りません。データ型をラベルにマップし、対応するラベルを返すマップがあります。
Felix Kling 2016年

typeofその名前にもかかわらず、値のタイプを教えてくれないので、信用しないでください。
オリオール2016年

2

これは、以下undefinedよりも理にかなっている例ですnull

JSON.parse例外をundefined次のように変換するラッパー関数を使用します。

// parses s as JSON if possible and returns undefined otherwise
// return undefined iff s is not a string or not parseable as JSON; undefined is not a valid JSON value https://stackoverflow.com/a/14946821/524504
function JSON_parse_or_undefined(s) {
    if ("string" !== typeof s) return undefined

    try {
        const p = JSON.parse(s)
        return p
    } catch (x){}

    return undefined
}

nullJSONでは有効ですが、そうでundefinedはないことに注意してください。


私はあなたがそこで何をしているのかわかります-そしてあなたが間違っているとは言えません-ある意味であなたはここでこれを行うことができ、それは問題ないと思うからです。この操作を行うために使用する別のパターンがありますが、後で「検証」ステップを実行するため、より気に入っています。これは、検証と値の戻りが混在しているように感じます。これが私がすることです:let getStringOrJSON = value => { try { value = JSON.parse(value); } catch(e) { return value; } return value; };。さて、2つのリターンは異なる方法で処理される可能性があり、JSゴルフコンペティションに勝てない可能性があると確信しています。できます。
JeremyIglehart18年

1

最初の答えは正しいです。それらは理論的に異なる意味を持っています。ただし、どちらを選択するかは必ずしも明確ではありません。

それは完全に主観的なことだと思いますが、私は自分の開発でnullを使用する傾向があります。

私は主にそれを使用します:

  1. 未定義の変数は古いブラウザでは上書きされる可能性があるため、返すのは少し複雑です。この同じ問題typeof var === 'undefined'により、関数の結果を取得するときに使用する必要があります。リンク

  2. 他の言語はnullを広く使用する傾向があり、それらの多くは未定義でさえありません(たとえばphp)。これにより、言語をすばやく切り替えるときに、ある種の一貫性が得られます。


1

何を使うかは非常に議論の余地があると思います。私は意味的に可能な限り正確なコードを好むのでundefined、この場合は適切だと思います。

null割り当ては「変数を何も設定しない」という意味だと思います。これは、undefined「このことはまったくない」という意味とは対照的です。

以前の回答が指摘したように、返品にundefinedは問題があり、それが気になるかどうかは完全にあなた次第です。気になりません。


2
しかし、「これはまったくない」という意味に近いのに、document.getElementById('iDoNotExist')戻りますnull。標準的な方法でそれを行うのであれば、なぜOPではないのですか?
オリオール2016年

@Oriol私は実際にあなたの推論が最も好きです。この効果に対する回答を投稿してください。受け入れます。(必要に応じて、いくつかの編集を追加することもできます)
Jeremy Iglehart 2016年

ええ@Oriol、これが私が実際にQ / Aサイトでさえ議論を楽しんでいる理由です。反例を得るのは本当に良いことです。そして、あなたは良いものを提供しました。
Ryan Laboucane 2016年

1

この場合、null返還されるべきであると私は主張します。

あなたは、ビューの理論計算機科学の観点から問題を検討した場合は未定義を示すために使用される非終了/非計算可能(未定義の点についてすなわちプレースホルダx一部の機能を f頻繁に書き込まれ、f(x) = ⊥)。

getNextCardただし、次のカード(存在する場合)を計算でき、次のカードがない場合も計算できるようです。つまり、入力ごとに終了するため、関数は合計になります。

そうは言っても、意味のある結果のない終了を通知する特別な値(つまり、「この入力に対して返すことができるカードがない」)が必要であり、これは私にとっては必要ありnullませんundefined


ノート:

意味のある結果のない終了がオプション型null許容型とも呼ばれる)を使用して表現される他の型付き言語でも、この引数のサポートが見られます。このためである例がある多分ハスケル

一方で、undefinedJavaScriptで実際に何を意味するのかはもちろんわかりません。したがって、undefinedへのアナロジーは少し希薄です。さらに、私たちは常に全関数を扱いたいので、これは「undefined関数から戻らない」ということになる。undefined設定されていないプロパティ/変数に使用を制限するため、これは少し厳しいようです。

結局、私の個人的な好みはundefined、私が戻ることができる場所に戻ることは決してなくnull、これがより良いコーディング規約であるとも主張します(とりわけx !== nullより短いためtypeof x !== 'undefined')。


-1

私の経験によると、コードをクラッシュさせたくない場合は、undefinedやnullを使用しないでください。少なくとも私は個人的にそれを避けます。Javascriptには未定義を返す関数がたくさんあり、使用する必要があります。ただし、コードを設計するときは使用しないでください。"false"少なくとも何かを常に返すことが重要です。たとえば、配列があり、その上にマップする場合。戻るのは良くない[undefined, undefined.....]か、ただundefined。元の配列の型を保持する方が良いです。例:

 const mapper:Map <string[],boolean[]>  
['i', 'dont', 'use', 'null or undefined'] -> [false, true, false, true, false]
or ['', dont, '', '', use] 
or al the stuff above and then filter(v => v)
that will keep all undefined and null out

それがアイデアです。私はそれを避けるためにいつも努力しています。そのためnullか、undefined簡単にコードをクラッシュさせることができます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.