基本的に次のような関数を作成しました。
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質問 -私がここで理解しようとしているものには広すぎました。
最善の方法はないと主張し、標準機能でさえ、どちらか一方を選択することがあります。
例えば:
[[プロトタイプ]]
通常のオブジェクトには[[Prototype]]内部スロットがあり、これが他のどのオブジェクトから継承するかを決定します。もちろん、オブジェクトは他のオブジェクトから継承しないと言う方法が必要です。この場合、「そのようなオブジェクトはありません」はnull
を使用して表されます。
Object.getOwnPropertyDescriptor
プロパティ記述子、つまりプロパティを説明するオブジェクト(値、書き込み可能性、列挙可能性、構成可能性など)を返すことが期待されます。ただし、プロパティが存在しない場合があります。この場合、「そのようなプロパティはありません」はundefined
を使用して表されます。
document.getElementById
指定されたIDの要素を返すことが期待されています。ただし、そのIDを持つ要素がない場合があります。この場合、「そのような要素はありません」はnull
を使用して表されます。
そのため、特定のケースに適したものを選択するか、より理にかなっていると思います。
未定義とは、通常、まだ値が割り当てられていない(まだ)ものを指します。 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
参考文献:
どちらを選ぶかについて、私の個人的な意見を述べます。
私の簡単な質問は次のとおりです。別の入力/状態/コンテキストが何かに定義されている場合、値はありますか?
答えが「はい」の場合はnull
を使用し、そうでない場合はundefined
を使用します。より一般的には、オブジェクトを返す関数は、目的のオブジェクトが存在しないときにnull
を返す必要があります。別の入力/状態/コンテキストを指定すると存在する可能性があるためです。
null
は、特定の入力/状態/コンテキストの値の欠如を表します。暗黙的に、値自体のconceptがアプリケーションのコンテキストに存在するが、存在しない可能性があることを意味します。あなたの例では、次のカードの概念は存在しますが、カード自体は存在しない場合があります。 null
を使用する必要があります。
undefined
は、アプリケーションのコンテキストでその値の意味の欠如を暗黙的に表します。たとえば、特定のプロパティセットでuser
オブジェクトを操作し、プロパティpikatchu
にアクセスしようとした場合。このプロパティの値はundefined
に設定する必要があります。私のコンテキストでは、そのようなプロパティを持つことは意味をなさないためです。
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つのステートメントの実行を保存することです。
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
}
null
はJSONでは有効ですが、undefined
は有効ではありません。
返された値をどうするかによって異なります。
typeof nullはオブジェクトを返します。そのオブジェクトの値は未定義です
typeof undefinedはundefinedを返します
何を使うかは非常に議論の余地があると思います。意味的に可能な限り正確なコードを好むので、この場合undefined
が適切だと思います。
null
割り当ては、「何も設定されていない変数」を意味すると考えています。これはundefined
とは対照的で、「このことはまったくありません」という意味です。
前の回答が指摘したように、undefined
を返すことには問題があり、それが気になるかどうかは完全にあなた次第です。それは私を気にしません。
この場合、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 !== null
はtypeof x !== 'undefined'
より短いため)。
最初の答えは正しいです。それらは理論的に異なる意味を持っています。ただし、どちらを選択するかは必ずしも明確ではありません。
私は開発でnullを使用する傾向がありますが、それは完全に主観的なものだと思います。
私は主にそれを使用します:
未定義の変数は古いブラウザで上書きされる可能性があるため、それを返すのは少し複雑です。この同じ問題により、関数の結果を取得するときにtypeof var === 'undefined'
を使用する必要があります。 リンク
他の言語は広くnullを使用する傾向があり、それらの多くは未定義さえありません(たとえばphp)。これにより、言語間で迅速に交換する際に一貫性が得られます。
私の経験によると、私の個人的な意見では、コードをクラッシュさせたくない場合は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
はコードを簡単にクラッシュさせる可能性があるため