Node.js/javascript helper,用于使用typeof运算符的默认值

Node.js/javascript helper,用于使用typeof运算符的默认值,javascript,node.js,Javascript,Node.js,我已经厌倦了总是写这样的代码: <% box_content = typeof box_content != 'undefined' ? box_content : ''%> <% box_class = typeof box_class != 'undefined' ? box_class : 'box'%> node.js、javascript或节点模块是否对此有任何帮助? 一个简单的函数,如果未提供默认值,则返回默认值或false 我们经常需要这个,我不明白为什么

我已经厌倦了总是写这样的代码:

<% box_content = typeof box_content != 'undefined' ? box_content : ''%>
<% box_class = typeof box_class != 'undefined' ? box_class : 'box'%>
node.js、javascript或节点模块是否对此有任何帮助? 一个简单的函数,如果未提供默认值,则返回默认值或false

我们经常需要这个,我不明白为什么node.js框架中没有任何东西可以帮助开发人员处理这个问题

我正在考虑将其添加到我的项目中,但我更愿意将其作为实用函数放在underline.js中。您认为如何?

如果声明了box_内容和box_类,但它们的值可能未定义,那么您可以使用| |-:

请注意,我没有尝试给foo一个语义名称。这些都太主观了,你无论如何都会想要自己的-

还要注意,这也要求声明变量,即使其值未定义。如果变量可以声明,也可以不声明,那么内联typeof是您唯一的实际选项

仅对于全局变量,无论是否声明变量,这都有效:

function foo(varName, defValue) {
    var val;
    if (varName in global) {
        val = global[varName];
    }
    if (typeof val === "undefined") {
        val = defValue;
    }
    return val;
}
…其中全局是指浏览器上类似全局对象的窗口

用法注意:变量的名称现在是字符串:


但同样,它只对全局变量有用,这可能是您正在避免使用的。

这可能有点不对劲,但这里有一个函数,可以让您输入一个不存在的变量而不会出错

function foo(inputVar,backupPlanVar){
   with(arguments.callee.caller){
      var evalVar;
      try{
         evalVar = this[inputVar];
      }catch(e){
         evalVar = backupPlanVar || undefined;
      }
      return evalVar;
   }
}

var abc = 123
foo('abc');
> 123
foo('nonExistantVariable');
> undefined
foo('nonExists', 456);
> 456

我不太愿意实际使用它,但可能是在一些模板代码中?

是的,在本例中,但我不仅需要在EJS中使用它。在EJS中,正确的方法是使用对象,就像在局部变量中一样,只检查该对象中的键,而不是检查是否定义了多个变量。我想编写自己的单行函数真的很难?函数defaultx,val{return typeof x==='undefined'?val:x;}?另外,请注意,如果变量已声明:box\u content!==未定义。节省了一些击键。@torazaburo不,这并不难,这不是重点。关键是,默认情况下,这应该属于node.js框架。如果不是,则将其发送到库,以便在客户端和浏览器中使用相同的内容。如果box\u内容设置为假布尔值,则此操作不起作用。@Vadorequest:确实不起作用。如果另一种选择是“box”,这似乎不太可能。问题是要有一种方法来处理默认值,而不必总是考虑应该包含哪些变量。这还不够好,因为虚假值也有例外。@Vadorequest:我同意你必须知道自己在做什么。这是一条普遍的规则。然而,| |经常是足够好的。当字符串不是有效值、数字0和NaN不是有效值、对象引用null不是有效值时,它已经足够好了……没有神奇的子弹,你必须检查你想要的东西。如上所述,对于EJS或其他框架,在这些框架中,您传递值并将其神奇地实例化为变量,您传递一个对象,因此您只需检查定义的单个变量,然后检查对象中的键,这要简单得多。这只适用于全局变量,对于全局变量,有更好的解决方案。与arguments.callee.caller一起使用没有任何意义;例如,它不允许您访问调用上下文中的变量。当然,严格模式下不允许打电话。我承认这并不理想,但我认为这可能会激励OP想出一个解决方案。但投票否决我的答案,编辑你的帖子以包含其中的一个想法,然后发布一条关于它有多糟糕的讽刺性评论——当然,我们不要忘记或原谅,在严格模式下,来电者是不被允许的。
function foo(varName, defValue) {
    var val;
    if (varName in global) {
        val = global[varName];
    }
    if (typeof val === "undefined") {
        val = defValue;
    }
    return val;
}
<% box_content = foo('box_content', '')%>
<% box_class = foo('box_class', 'box')%>
function foo(inputVar,backupPlanVar){
   with(arguments.callee.caller){
      var evalVar;
      try{
         evalVar = this[inputVar];
      }catch(e){
         evalVar = backupPlanVar || undefined;
      }
      return evalVar;
   }
}

var abc = 123
foo('abc');
> 123
foo('nonExistantVariable');
> undefined
foo('nonExists', 456);
> 456