Как вы можете проверить свойство undefined в ejs для node.js?
Каков наилучший способ проверить свойство undefined в шаблоне ejs?
(Я использую node.js пакет от TJ Holowaychuk)
Пример:
var tpl = '<% if (foo) { %>foo defined<% } else { %>foo undefined<% } %>';
console.log(ejs.render(tpl, { locals: { bar: "baz" } }));
Я ожидаю, что это сделает "foo undefined". Вместо этого он выдает ошибку foo undefined.
Я знаю, что это не должно быть проблемой, так как это ожидаемое поведение в тестах. Есть ли простой способ избежать этого?
Единственное найденное мной решение - использовать метод hasOwnProperty
.
var tpl = '<% if (hasOwnProperty("foo")) { %>foo defined<% } else { %>foo undefined<% } %>';
console.log(ejs.render(tpl, { locals: { bar: "baz"} }));
Это не вызывает никаких ошибок.
Есть ли лучший способ сохранить шаблон в чистоте? Или почему это ошибка?
Ответы
Ответ 1
Другой способ проверить свойство - косвенно ссылаться на него с помощью объекта locals
. Используя ваш пример:
var tpl = '<% if(locals.foo){ %>foo defined<% }else{ %>foo undefined<% } %>';
console.log(ejs.render(tpl, { locals: { bar: "baz"} }));
Ответ 2
Я использовал бы typeof
, как в if (typeof foo == 'undefined')
. Я использую оператор typeof
со строкой "undefined", тогда как некоторые люди могут напрямую сравнивать с глобальной переменной undefined
. Я предпочитаю этот метод, потому что он защищен от какого-либо разработчика библиотеки террористических JS, изменяя значение глобальной переменной, оставляя ваш код сломанным.
Это также может быть выражено как тройной, что некоторые считают "чище" из-за отсутствия завитушек:
var tpl = '<% (typeof foo != "undefined" ? %>foo defined<% : %>foo undefined<% ) %>';
Ответ 3
Простейший и самый чистый по моему мнению:
<%= (!!locals.foo)?foo:'' %>