aboutsummaryrefslogtreecommitdiff
path: root/files/ja/web/javascript/reference/global_objects/undefined/index.html
blob: d4f0e54903bc9ec95790830906982b63b5489c67 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
---
title: undefined
slug: Web/JavaScript/Reference/Global_Objects/undefined
tags:
  - JavaScript
  - Language feature
  - Reference
  - 言語機能
translation_of: Web/JavaScript/Reference/Global_Objects/undefined
---
<div>{{jsSidebar("Objects")}}</div>

<p>グローバルの <code><strong>undefined</strong></code> プロパティはプリミティブ値 <code>{{Glossary("Undefined", "undefined")}}</code> を表します。これは JavaScript における{{Glossary("Primitive", "プリミティブ型")}}の一つです。</p>

<p>{{js_property_attributes(0,0,0)}}</p>

<div>{{EmbedInteractiveExample("pages/js/globalprops-undefined.html")}}</div>

<div class="hidden">このデモのソースファイルは GitHub リポジトリに格納されています。デモプロジェクトに協力したい場合は、 <a href="https://github.com/mdn/interactive-examples">https://github.com/mdn/interactive-examples</a> をクローンしてプルリクエストを送信してください。</div>

<h2 id="Syntax" name="Syntax">構文</h2>

<pre class="syntaxbox notranslate">undefined</pre>

<h2 id="Description" name="Description">解説</h2>

<p><code>undefined</code> は、<em>グローバルオブジェクト</em>のプロパティです。すなわちグローバルスコープ内の変数です。 <code>undefined</code> の初期値はプリミティブ値である <code>{{Glossary("Undefined", "undefined")}}</code> です。</p>

<p>最近のブラウザー (JavaScript 1.8.5 / Firefox 4 以降) での <code>undefined</code> は、 ECMAScript 5 仕様により、設定不可、書込不可のプロパティとなります。 (そうでない場合でも、上書きは避けてください。)</p>

<p>まだ値が代入されていない変数は <code>undefined</code> 型となります。評価しようとしている変数に値が代入されていない場合、メソッドや文も <code>undefined</code> を返します。値を {{jsxref("Statements/return", "return")}} しない関数も <code>undefined</code> を返します。</p>

<div class="note">
<p><strong>ご注意ください</strong> グローバルスコープ以外のスコープでは{{Glossary("Identifier", "識別子")}} (変数名) として使うことができますが (<code>undefined</code>{{jsxref("Reserved_Words", "予約語", "", 1)}}でないため)、コードの管理やデバッグが困難になるためおすすめできません。</p>

<pre class="brush: js example-bad notranslate">//こんなことはしないこと!

// "foo string" をログ出力する
(function() {
  var undefined = 'foo';
  console.log(undefined, typeof undefined);
})();

// "foo string" をログ出力する
(function(undefined) {
  console.log(undefined, typeof undefined);
})('foo');
</pre>
</div>

<h2 id="Examples" name="Examples"></h2>

<h3 id="Strict_equality_and_undefined" name="Strict_equality_and_undefined">厳密等価と undefined</h3>

<p><code>undefined</code> と厳密等価・非等価演算子を使って、変数に値があるか調べることができます。次のコードでは、変数 <code>x</code> が定義されていないため、 <code>if</code> 文は true に評価されます。</p>

<pre class="brush: js notranslate">var x;
if (x === undefined) {
  // ここの文は実行される
}
else {
  // ここの文は実行されない
}
</pre>

<div class="note">
<p><strong>注:</strong> ここでは、標準の等価演算子ではなく厳密等価演算子を使わないといけません。厳密等価演算子とは違い、 <code>x == undefined</code> は、 <code>x</code><code>null</code> であるかどうかもチェックするからです。 <code>null</code><code>undefined</code> と等しくありません。</p>

<p>詳しくは、{{jsxref("Operators/Comparison_Operators", "比較演算子","","true")}}を参照してください。</p>
</div>

<h3 id="typeof_operator_and_undefined" name="typeof_operator_and_undefined">typeof 演算子と undefined</h3>

<p>代わりに、 {{jsxref("Operators/typeof", "typeof")}} を使用することができます。</p>

<pre class="brush: js notranslate">var x;
if (typeof x === 'undefined') {
   // ここの文は実行される
}
</pre>

<p>{{jsxref("Operators/typeof", "typeof")}} を使う理由の一つとして、こちらは変数が宣言されていなくてもエラーにはなりません。</p>

<pre class="brush: js notranslate">// 直前まで x は宣言されていない
if (typeof x === 'undefined') { // エラーなしで true と評価される
   // ここの文は実行される
}

if (x === undefined) { // ReferenceError が発生

}
</pre>

<p>しかし、もう一つの選択肢があります。JavaScriptは静的にスコープされた言語なので、変数が宣言されているかどうかを知るには、それが含まれるコンテキストで宣言されているかどうかを見ることで読み取ることができます。</p>

<p>グローバルスコープは{{jsxref("globalThis", "グローバルオブジェクト", "", 1)}}に結びつけられているので、グローバルコンテキストに変数が存在するかどうかのチェックは、<em>グローバルオブジェクト</em>にプロパティが存在することを、 {{jsxref("Operators/in", "in")}} 演算子を使用してチェックすることで行うことができます。</p>

<pre class="brush: js notranslate">if ('x' in window) {
  // x がグローバルに定義されている場合のみ、ここの文を実行
}</pre>

<h3 id="void_operator_and_undefined" name="void_operator_and_undefined">void 演算子と undefined</h3>

<p>3 つ目の方法として、{{jsxref("Operators/void", "void")}} 演算子があります。</p>

<pre class="brush: js notranslate">var x;
if (x === void 0) {
  // ここの文は実行される
}

// 直前まで y は宣言されていない
if (y === void 0) {
  // ReferenceError: y is not defined が発生
}
</pre>

<h2 id="Specifications" name="Specifications">仕様書</h2>

<table class="standard-table">
 <thead>
  <tr>
   <th scope="col">仕様書</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>{{SpecName('ESDraft', '#sec-undefined', 'undefined')}}</td>
  </tr>
 </tbody>
</table>

<h2 id="Browser_compatibility" name="Browser_compatibility">ブラウザーの互換性</h2>

<p>{{Compat("javascript.builtins.undefined")}}</p>

<h2 id="See_also" name="See_also">関連情報</h2>

<ul>
 <li>JavaScript の {{Glossary("Primitive", "プリミティブ型")}}</li>
 <li>{{jsxref("null")}}</li>
</ul>