undefinedかnullかどう区別できますか?

このQ&Aのポイント
  • JavaScriptの教科書には、undefinedとnullの区別の仕方についての記載があります。
  • 関数で値が返されなかった場合、undefinedとnullの使い方には違いがあります。
  • 関数で値が返されなかった場合とは、引数がなかった場合やreturn文がない場合を指します。
回答を見る
  • ベストアンサー

undefinedかnullかどう区別できますか?

JavaScript の教科書に下記のように記載があったのですが、 >>> ページからアンカータグを取得するgetAnchorという関数があったとします。 その際、アンカータグが見つからなかったならば、何を返すべきでしょうか。undefined(未定義)は不自然です。 今度は「該当する値がなかった(=空であった)」という値を、意図して伝えようとしているので、nullを返すべきです。 関数で値が返されなかった場合はundefinedと聞いたのですが上記はそれに該当するように私は思ってしまうのですが、なぜ違うかわかりますか? 関数で値が返されなかった場合とはalert()のように引数がなかった場合という意味でしょうか? それともretunr 変数名などのreturnがない場合という意味でしょうか?

noname#226032
noname#226032

質問者が選んだベストアンサー

  • ベストアンサー
回答No.6

> これがundefinedを返します > 以外はnullと考えてよいでしょうか? う~ん。勘違いされています。 返り値のある関数の場合の返り値は、 整数、実数、文字列、オブジェクト 等々いろんな 型での値があります。 例えば、 文字列から特定の文字を探して、何文字目にそれがあるかを整数で返すという 関数があったとします。本来は、整数の1とか5とかで返す訳です。 しかし、引数で渡された文字列中に対象文字が見つからなかったときは、 返す値をどうするかを 関数を作っている本人が決定することになります。 普通なら 関数をコールする側では、数値との比較で判断したいでしょうから、 null では返さないで、 0とか -1とか、コールした側が使いやすいようにするでしょう。 今回の関数は、整数でなく、見つけたタグのオブジェクトを返す仕様の関数ということなので 本来はオブジェクトを返すのではありますが、 対象が見つからないといった異常時には、0とかundefinededではなく、nullを返したほうが その関数を使う側にとって便利でしょう、、、、ということです。 つまり、返り値は、関数の利用方法を想定して、関数を作る自分が決める事柄です。

noname#226032
質問者

お礼

難しくてわからないので、再質問します。 もっと初心者にもわかるように解説していただけるとありがたいです。

その他の回答 (5)

回答No.5

> するとvoid型の関数かどうかがわかれば、nullかundefindedかどうか自動的にわかるということですね。 いやいや、そういう意味ではありません。 関数のreturn値として、 nullを返すようにも、undefined を返すようにも 自分がどのようにコーディングするか次第です。 しかし、その教科書の意図しているのは、アンカータグが見つからなかったときに undefinedでなくnullを戻すようにコーディングするのが、望ましいでしょう。 ということでしょう。 なお、void型の関数 という C言語やJava言語の言い方をして 混乱させてしまったようで 申し訳ないです。 JavaScriptには  void(0) というなにもしない演算子(関数でなく)がありますが、これがundefinedを返します。

noname#226032
質問者

お礼

難しいですね。 JavaScriptには  void(0) というなにもしない演算子(関数でなく)がありますが、これがundefinedを返します。 以外はnullと考えてよいでしょうか?

  • think49
  • ベストアンサー率59% (285/482)
回答No.4

No.1 です。 > void型の関数は下記のことですか? 「void型」とは何のことですか? 明示的に return をせず、new 演算子を使わずに関数呼び出しをすれば、その関数の帰り値は undefined となりますが、これを「void型」と称しているのでしょうか。 function sample () {} console.log(sample()); // undefined いずれにしても、「void型」はJavaScriptには存在しない独自用語だと思われます。 > void形でない関数はnullという認識でよろしいでしょうか。 いいえ。 「Object 型を返す関数」が返すべきオブジェクトが存在しない時に null を返り値とします。 getElementById は対象の要素ノードが存在すれば要素ノードとなるオブジェクトを返しますが、存在しなければ null を返します。

noname#226032
質問者

お礼

難しいですね、初心者の私には難しすぎます、 ありがとうございました。

回答No.3

> return値を持たないvoid型の関数では、関数の返り値はundefined。 > void形でない関数はnullという認識でよろしいでしょうか。 そういうことですね。 この例でいえば アンカータグを取得してreturn値で返す関数ということのようなので return値がのあるべき関数ということになるでしょう。 このとき、検索対象となるアンカータグが存在しなかった場合に  undefinedを返すように コーディングすることも可能ではありますが、 undefinedでなく、nullをreturnするようにしておくと、 その関数をコールする側にとって判定や条件分岐がしやすくなるでしょう。

noname#226032
質問者

お礼

ありがとうございます。 するとvoid型の関数かどうかがわかれば、nullかundefindedかどうか自動的にわかるということですね。 関数名でどちらか識別できるのですか?

回答No.2

>関数で値が返されなかった場合とはalert()のように引数がなかった場合という意味でしょうか? >それともretunr 変数名などのreturnがない場合という意味でしょうか? 後者です、 関数で値を返すというのは、 returnの値のことです。 ただ、return値を持たないvoid型の関数では、関数の返り値はundefinedとなります。 > 関数で値が返されなかった場合はundefined その通りです。 ですので、  値を返さない関数(つまりvoid型関数) の場合は常にundefinedが返るが  値を返す関数では、有効値またはnullを返すべき というのが、その教科書で意図でしょう。 通常は、見つかった値なりオブジェクトをreturnで返すけれども、 返すべき値が見つからなかったら、return null; で返してくれれば、 その関数をコールした親側にとっては、対象が見つからなかったのか、 それとも変数の未定義のバグなのか  の区別しやすいと いうことになります。

noname#226032
質問者

お礼

void型の関数は下記のことですか? 難しくてよくわかりません。 return値を持たない関数のことを示すようですが、それは returnを使えない関数ということでしょうか? それともプログラマーが設定しなかった関数のことでしょうか? https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/void つまり return値を持たないvoid型の関数では、関数の返り値はundefined。 void形でない関数はnullという認識でよろしいでしょうか。

  • think49
  • ベストアンサー率59% (285/482)
回答No.1

ES7 ではオブジェクトが意図的に存在しない事を表す場合には null 値を使います。 getElementById もその仕様に準じています。 http://www.ecma-international.org/ecma-262/7.0/#sec-null-value Re: websaitojisaku さん

noname#226032
質問者

お礼

void型の関数は下記のことですか? 難しくてよくわかりません。 return値を持たない関数のことを示すようですが、それは returnを使えない関数ということでしょうか? それともプログラマーが設定しなかった関数のことでしょうか? https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/void つまり return値を持たないvoid型の関数では、関数の返り値はundefined。 void形でない関数はnullという認識でよろしいでしょうか。

関連するQ&A

  • JavaScriptのnullはいつ使う?

    JavaScriptにはnullという値がありますが、いつ使うのでしょうか。 値が定義されていない変数やプロパティには、undefinedが入っていますし、 undefinedを代入することもできます。 C#でのnullの使い方と同じように、undefinedが使えちゃってます。 ではnullはいつ使うのでしょう? undefinedではなくnullでなければダメなケースって何がありますか?

  • 代入ができない。(undefined)

    環境:XP SP2, IE6/php, html, javascript submitした際にjavascriptの関数(getNo())が呼ばれ、その関数内で代入ができず参っています。 .php ----- <? $setNo = [111,222,333,444,555]; for($i=0;$i<5;$i++) {?> <input type="text" name="no[<?=$i;?>]" value="<?=$setNo[i];?>" id="no"> <?}?> (submit省略) .js ----- function getNo(obj) { var orgNo = document.all("no"); var bufNo = ""; //初期化空 //var bufNo ; //初期化しないと※1 //var bufNo = "huga";//初期化"huga"※2 for(var k=0; k<orgNo.length; k++) {  alert(orgNo[k].value);//k=0なら111と表示される bufNo = orgNo[k].value;//代入してるのに alert(bufNo='+bufNo); //空のまま →代入されてない なぜ?? //alert(bufNo='+bufNo);//※1undefined→代入されてない //alert(bufNo='+bufNo);//※2huga→代入されてない alert(orgNo='+orgNo[k].value);//k=0のときなら111と表示される } .jsには他にもsubmitから呼ばれている関数があり それらは正常に動作しますが、この関数だけおかしいので 書き直してみたりしましたが改善されません。 また、関数内で配列も宣言してますが、 配列要素にfor文のiなどを[i]のようにいれても、配列の値がうまく変数に代入できません。 ただし、[0]や[2]と指定すると正しい値が表示され、代入もできます。 undefinedになることが問題なのではなく 代入されない理由がわかりません。 どういうことになっているのか教えてください。

  • func.arityで、undefined

    とほほのjavascriptで勉強しているのですが http://www.tohoho-web.com/js/function.htm 関数オブジェクトのfunc.arityのところ 関数が要求する引数の個数を返します。 とあるのに、 function goukei(a, b, c) { return(a + b + c); } n = goukei.arity; document.write(n); このコードを書いて実行しても 引数の個数の3ではなく、undefinedが表示されます。 ちゃんと引数は3個だし、functionで定義した関数も、document.write文の前に宣言してあり ぱっとみ問題ないように思われるのですが、どうしてundefinedと表示されるのでしょうか。

  • obj.property のundefined判定

    obj.property のundefined判定 未定義のローカル変数を評価すると、以下の結果になります。 <script type="text/javascript"><!-- var a; if(a === undefined){ alert('a is undefined!'); } // エラーは発生しない if(b === undefined){ alert('b is undefined!'); } // 「ReferenceError: b is not defined」のエラーが発生し、if文が評価されない if('undefined' === typeof b){ alert('b is undefined!'); } // エラーは発生しない //--></script> 未定義のローカル変数は undefined との比較ではチェックできず、typeof でチェックする必要があることが分かります。 対して、「存在が保証されているオブジェクトの存在しないプロパティ」でチェックすると、以下の結果になります。 <script type="text/javascript"><!-- var obj = { a:'valueA', b:'valueB' }; if(obj.property === undefined){ alert('obj.property is undefined!'); } // エラーは発生しない if('undefined' === typeof obj.property){ alert('obj.property is undefined!'); } // エラーは発生しない //--></script> 不思議に思い、ECMA-262 3rd Edition仕様書を読んでみたところ、下記文言が見つかりました。 ---------- 8.6.2.1 [[Get]] (P) O の [[Get]] メソッドがプロパティ名 P で呼出されると、次のステップがとられる: 1. O が P という名前のプロパティを持っていなければ、ステップ 4 へ進む。 2. そのプロパティの値を取得する。 3. Result(2) を返す。 4. O の [[Prototype]] が null ならば、undefined を返す。 5. [[Prototype]] の [[Get]] メソッドを、プロパティ名 P で呼び出す。 6. Result(5) を返す。 http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/8_Types.html#section-8.6.2 ---------- この場合、ステップ4の「obj.property が nullなため undefined を返す」という処理が行われた、という解釈で合っているでしょうか? ほぼ正しいと感じているのですが、「仕様書の中で見るべきところが合っているのか」に自信が持てず、確信に至っていません…。

  • returnがundefinedになってしまう。

    登録フォームhtml(php)からonclickで呼び出すvalidate functionから、ある値の有効性をチェックする別のcheck_data functionを呼び出しています。 check_data functionのソースは以下です。 function check_data(data) { var ajaxRequest; try{ //Opera 8.0+,Firefox,Safari ajaxRequest = new XMLHttpRequest(); }catch(e){ //Internet Explorer Browsers try{ ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP"); }catch(e){ try{ ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP"); }catch(e){ //something went wrong alert("your browser broke!"); return false; } } } //Create a function that will receive date sent from the server ajaxRequest.onreadystatechange = function(){ if(ajaxRequest.readyState==4){ var ajaxDisplay = document.getElementById('data_msg'); ajaxDisplay.innerHTML = ajaxRequest.responseText; var val = ajaxRequest.responseText; return val; } } var date = new Date(); var timestamp=date.getTime(); //var data = document.getElementById('data').value; data = data; var queryString = "?tm=" + timestamp + "&data=" + data; ajaxRequest.open("GET","data_check.php" + queryString, true); ajaxRequest.send(null); } これを validate functionから var vdata = check_data(data); alert(vdata); みたいな感じで呼び出しています。 alertにしているのは単に値が正確に返っているかチェックするためです。 しかし、このvdataに入ってるはずの値がundefinedになってしまうのです。 check_data function内でvar val = ajaxRequest.responseText; をalert(val)する場合には正確な値がalertされるのですが、 validate functionから呼び出してvar vdata = check_data(data); する部分で何故かundefinedになってしまうのです。 responseTextでデータが取得される前にreturnされてしまいundefined になるのかとも思うのですが、たとえばreturn val;の代わりにreturn 10; などにしてもvalidate functionから呼び出すと、undefinedになってしまいます。 何が問題なんでしょうか? IE6とFireFox3.03で同様の結果になります。 因みに function test() { var test = 'ok'; return test; } をvalidate functionから呼び出した場合は キチンと'ok'がalertされます。

  • 関数の引数に未定義の変数を渡すとエラーが出る

    自作の関数で、issetとemptyを一緒に判定する関数を作っているのですがエラーが出ます。 ある変数が「未定義」または「null」または「""(空白)」の場合はnullである、という関数を作りたいです。 ------------------------------------------ function is_null_ex($value){  if (!isset($value)) {return true;}               // 未定義かnullの場合、trueを返す  else if (strlen(strval($value)) === 0) {return true;}   // 空白の場合はtrueを返す  else {return false;}                      // $valueに値が入っている場合はfalseを返す } is_null_ex($val); ------------------------------------------ 上記の関数で$valueが未定義の場合にfuncを使うと、次のようなエラーが出ます。 Notice: Undefined variable: val つまり、未定義の変数を引数に渡すとエラーが出ます。 「未定義なら関数に渡さなければ?」と思うかもしれませんが、そもそもこの関数は「未定義」または「null」または「""(空白)」を判定したい関数なのです。 この場合、どうすれば良いのでしょうか? エラーは出ますが上記の関数で「if (!isset($value)) {return true;}」の部分できちんと判定はされています。 PHP5.3系で運用しています。 ぞうぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • NULL値をゼロとして扱うには?

    JavaScriptでNULL値をゼロとして扱いたいのですが、"parseFloat"や"eval"などで変換してもはゼロ数値として扱ってくれません。やはり、"NaN"や"Undefined"かどうか判断して、そうであった場合は"0"に変換するというステップが必要なのでしょうか? なんかスムーズじゃなくて納得できません。

  • 配列が勝手にnullになってしまいます。

    javascript初級者です。よろしくお願いします。 現在要素の色を判別して、白でなかったら徐々に色を変化させ白に近づけるプログラムを作成しています。 その中で「色を変化させる」関数を作成したのですが、どうしてもうまくいきません。 関数は以下のようなものです。 function changeColor(color){ if(color!="rgb(255, 255, 255)"){  var oldcolor=color.match(/([0-9]{3}),.([0-9]{3}),.([0-9]{3})/);  var newcolor="rgb("+(Number(oldcolor[1])+5)+","+oldcolor[2]+","+oldcolor[3]+")";  alert(color);  alert(newcolor);  return(newcolor); } return(color); } alertはデバック用に書き足してあります。 さて、このプログラムを動作させると まず「rgb(125, 255, 255)」というダイアログボックスが表示され 次に「rgb(130, 255, 255)」というダイアログボックスが表示されます。 ここまでは期待通りの動作です。 しかし、このダイアログボックスを閉じると「null」と書かれたダイアログボックスが開き、さらにそれを閉じるとfirebug上で「oldcolor is null」というエラーになってしまいます。 alert(newcolor);で正しい結果が返ってきているのだからnullって事は無いはずなのですが、とにかくうまくいきません。 「null」のダイアログボックスもナゾですし、分からないことだらけです。 どうかお助けください。よろしくお願いします。

  • NULLが返ってこない…。

    原因がわからないため質問をさせて頂きます。 <%-- JSP <input type="text" name="name"> //名前 String name = request.getParameter("name"); Data data = new Data(); //コンストラクタをnew data.setName(name); --%> <%-- class(Bean) private String n = null; public void setName(String name){ if(name != null){ n = name; }else{ n = null; } public String getName(){ if(name != null){ return name; }else{ return name; } } --%> 値をgetParameter()メソッドで取得をして 値をsetName(name);でセットをしています。 セットした側でもし値があるのであれば その値を変数に格納。 もし値がなければnullを変数に格納しています。 しかし System.out.println(data.getName().equals("");//true System.out.println(data.getName().equals(null);//false; となりnullを返してくれません…。 このコードに何を足したらnullを返してくれるのか わかりません。 わかる方がいらっしゃいましたらよろしくお願い致します。

    • ベストアンサー
    • Java
  • nullの実態は何なのでしょう?

    nullを調べたら、 変数がオブジェクトを参照していないことを意味する特別な値を表します。 と有りましたが、この特別な値とは実際にはいくつ?なのでしょうか?

専門家に質問してみよう