你将如何检查在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:'' %>