1

我正在使用 express 框架创建一个带有 nodejs 的简单网站,couchdb 用于数据库,EJS 用于模板。有时我的一些字段在我的一些 JSON 文档中为空或未定义,我需要处理它。

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

那段代码似乎可以很好地处理未定义的“测试”字段,但下面的代码会抛出一个错误,提示“测试未定义”

<% 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 回答
2

要检查是否定义了测试,您需要这样做:

<% if (this.test) { %>
   here, test is defined
<% } %>
于 2014-02-19T14:26:33.273 回答