web-dev-qa-db-ja.com

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

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

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 私の質問に答えなかった... googleもどちらもしなかった:\

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

61
Jeremy Iglehart

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

例えば:

  • [[プロトタイプ]]

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

  • Object.getOwnPropertyDescriptor

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

  • document.getElementById

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

そのため、特定のケースに適したものを選択するか、より理にかなっていると思います。

24
Oriol

未定義とは、通常、まだ値が割り当てられていない(まだ)ものを指します。 Nullは、明確に値を持たないものを指します。その場合、nullを返すことをお勧めします。戻り値が指定されていない関数は、暗黙的にundefinedを返します。

ECMAScript2015仕様から

4.3.10未定義値

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

4.3.12 null値

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

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

参考文献:

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

86
chiliNUT

どちらを選ぶかについて、私の個人的な意見を述べます。

私の簡単な質問は次のとおりです。別の入力/状態/コンテキストが何かに定義されている場合、値はありますか?

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

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

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

22
ngryman

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つのステートメントの実行を保存することです。

4
vadi taslim

undefinednullよりも意味がある例です。

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
}

nullはJSONでは有効ですが、undefinedは有効ではありません。

2
masterxilo

返された値をどうするかによって異なります。

typeof nullはオブジェクトを返します。そのオブジェクトの値は未定義です

typeof undefinedはundefinedを返します

2
Dan

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

null割り当ては、「何も設定されていない変数」を意味すると考えています。これはundefinedとは対照的で、「このことはまったくありません」という意味です。

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

1
Ryan Laboucane

この場合、nullが返されるべきだと主張します。

理論的なコンピューターサイエンスの観点から質問を検討する場合、undefinedを使用して、非終了/non-computability(すなわち 部分関数xの未定義のポイントfのプレースホルダーf(x) = ⊥ )。

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

そうは言っても、特別な値意味のある結果のないシグナル終了(つまり、「この入力のために返せるカードがありません」)が必要です。 nullではなくundefinedです。


注:

意味のある結果を伴わない終了が option type (時にはnullable type)。これの例は、MaybeinHaskellです。

一方、もちろん、JavaScriptのundefinedが実際に何を意味するのかはわかりません。そのため、undefinedの類推は少々不十分です。さらに、私たちは常に全関数を使用したいので、これは「関数からundefinedを決して返さない」ということになります。 undefinedの使用を設定されていないプロパティ/変数に制限するため、これは少し厳しいようです。

最終的に、私の個人的な好みはundefinedを返すことができるnullを返すことではなく、これがより良いコーディング規約であると主張します(とりわけ、x !== nulltypeof x !== 'undefined'より短いため)。

1
FK82

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

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

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

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

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

0
Maciej Paprocki

私の経験によると、私の個人的な意見では、コードをクラッシュさせたくない場合は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はコードを簡単にクラッシュさせる可能性があるため

0
rubendmatos1985