1

エクスプレスフレームワーク、データベース用のcouchdb、テンプレート用のEJSを使用して、nodejsで簡単なWebサイトを作成しています。一部の JSON ドキュメントで一部のフィールドが null または未定義である場合があり、それを処理する必要があります。

<% if (typeof test !== 'undefined') { %>
  <p><%= test %></p>
<% } %>

そのコードは未定義の「test」フィールドをうまく処理しているようですが、以下のコードは「test is undefined」というエラーをスローします

<% if (test) { %>
  <p><%= test %></p>
<% } %>

javascript が test が未定義であることを理解せず、if 句に false を入れるだけなのはなぜですか?

4

3 に答える 3

9

「未定義」の概念は、JavaScript 言語で定義されている変数の状態とは異なるためです。この理由は理解できますが、特に変数名とオブジェクト プロパティに関して、その影響が混乱する可能性があります。

未定義の変数にアクセスしようとすると例外がスローされることを示しました。この状態 (変数が定義されていない) を「未定義」型と混同しないでください。

if (bogusVariable) { // throws ReferenceError: bogusVariable is not defined.
typeof(bogusVariable); // => undefined - wow, that's confusing.

ただし、定義されていないオブジェクトのプロパティは安全にテストできます。

var x = {}; // an object
x.foo; // => undefined - since "x" has no property "foo".
typeof(x.foo); // => undefined
if (!x.foo) { /* true */ }

すべての変数が実際には「グローバル」オブジェクト (Web ブラウザーでは「グローバル」または「ウィンドウ」) のプロパティであることに注意することで、このプロパティを利用できます。

bogus; // => ReferenceError: bogus is not defined.
global.bogus; // => undefined (on node/rhino)
window.bogus; // => undefined (on web browsers)

したがって、次のように EJS コードを記述できる場合があります。

<% if (global.test) { %>
  <p><%= test %></p>
<% } %>

はい、JavaScript 言語の多くの部分と同様に、混乱を招きます。

于 2012-05-04T16:43:21.287 に答える
4

ほとんどの言語は次のようになります。

  irb
  >> foo
  NameError: undefined local variable or method `foo' for main:Object
        from (irb):1
于 2012-05-04T16:35:01.633 に答える