你将如何检查在ejs为node.js未定义的属性?

在ejs模板中检查未定义的属性的最佳方法是什么?

(我使用TJ Holowaychuk的node.js包 )

例:

var tpl = '<% if (foo) { %>foo defined<% } else { %>foo undefined<% } %>'; console.log(ejs.render(tpl, { locals: { bar: "baz" } })); 

我希望这个渲染“foo undefined”。 它确实会抛出一个foo未定义的错误。

我知道这不是一个问题,因为这是testing中的预期行为。 有没有简单的方法来避免这种情况?

我find的唯一解决scheme是使用hasOwnProperty方法。

 var tpl = '<% if (hasOwnProperty("foo")) { %>foo defined<% } else { %>foo undefined<% } %>'; console.log(ejs.render(tpl, { locals: { bar: "baz"} })); 

这不会引发任何错误。

有没有更好的方法来保持模板清洁? 或者为什么会抛出这个错误?

testing属性的另一种方法是通过locals对象间接引用它。 用你的例子:

 var tpl = '<% if(locals.foo){ %>foo defined<% }else{ %>foo undefined<% } %>'; console.log(ejs.render(tpl, { locals: { bar: "baz"} })); 

我会使用typeof ,如if (typeof foo == 'undefined') 。 我使用typeof运算符的string“undefined”,而有些人可能会做一个直接比较undefined全局variables。 我更喜欢这种方法,因为它可以防止一些恐怖分子的JS库开发人员更改全局variables的值,导致代码被破坏。

这也可以表示为一个三元组,有些人认为由于没有curl而认为是“干净”的:

 var tpl = '<% (typeof foo != "undefined" ? %>foo defined<% : %>foo undefined<% ) %>'; 

我认为最简单,最清洁:

<%= (!!locals.foo)?foo:'' %>