45

ejsテンプレートで未定義のプロパティをチェックするための最良の方法は何ですか?

(私はTJ Holowaychukによるnode.jsパッケージを使用しています)

例:

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

これで「fooundefined」がレンダリングされると思います。代わりに、 fooの未定義エラーをスローします。

これはテストで予想される動作であるため、これが問題になることはないことを私は知っています。これを回避する簡単な方法はありますか?

私が見つけた唯一の解決策は、このhasOwnProperty方法を使用することです。

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

これはエラーをスローしません。

テンプレートをきれいに保つためのより良い方法はありますか?または、なぜこのエラーがスローされるのですか?

4

4 に答える 4

72

localsプロパティをテストする別の方法は、オブジェクトを介して間接的にプロパティを参照することです。あなたの例を使用して:

var tpl = '<% if(locals.foo){ %>foo defined<% }else{ %>foo undefined<% } %>';
console.log(ejs.render(tpl, { locals: { bar: "baz"} }));
于 2011-09-07T14:06:48.920 に答える
31

のように を使用typeofif (typeof foo == 'undefined')ます。私typeofは文字列「未定義」で演算子を使用しますが、undefinedグローバル変数と直接比較する人もいます。私がこの方法を好むのは、一部のテロリストの JS ライブラリ開発者がグローバル変数の値を変更して、コードが壊れたままになるのを防ぐためです。

これは 3 値として表現することもできます。これは、カーリーがないため「よりクリーン」と見なす人もいます。

var tpl = '<% (typeof foo != "undefined" ? %>foo defined<% : %>foo undefined<% ) %>';
于 2011-09-02T22:52:15.570 に答える
15

私の意見では、最もシンプルでクリーンです。

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

于 2014-02-26T23:31:01.650 に答える