Express,EJS,挑战未定义的测试

Cos*_*sta 1 ejs node.js express

我正在创建一个简单的网站,其中nodejs使用快速框架,couchdb用于数据库,EJS用于模板化.有些时候我的某些JSON文档中的某些字段为null或未定义,我需要处理它.

<% if (typeof test !== 'undefined') { %>
  <p><%= test %></p>
<% } %>
Run Code Online (Sandbox Code Playgroud)

这段代码似乎处理'测试'字段未定义就好了,但下面的代码抛出一个错误,上面写着'测试未定义'

<% if (test) { %>
  <p><%= test %></p>
<% } %>
Run Code Online (Sandbox Code Playgroud)

为什么javascript不能理解test是未定义的,然后在if子句中放入false?

mae*_*ics 9

因为"undefined"的概念不同于JavaScript语言中定义的变量的状态.其原因是可以理解的,但效果可能会令人困惑,特别是关于变量名称和对象属性.

您已经演示了如何尝试访问未定义的变量将引发异常.不要将此状态(未定义变量)与"未定义"类型混淆:

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

但是,可以安全地测试未定义的对象的属性:

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

您可以通过注意所有变量实际上是"全局"对象(在Web浏览器中为"全局"或"窗口")的属性来利用此属性.

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

所以你可以这样编写你的EJS代码:

<% if (global.test) { %>
  <p><%= test %></p>
<% } %>
Run Code Online (Sandbox Code Playgroud)

是的,它与JavaScript语言的许多部分一样令人困惑.