如何在JavaScript中“默认”布尔属性?

时间:2015-04-02 21:56:35

标签: javascript

在JavaScript中,我经常使用||运算符来获取某些属性的值 - 或默认值。例如:

var dens = mapping.defaultElementNamespaceURI||mapping.dens||'';

如果mappingdefaultElementNamespaceURI,则会使用它,否则请查找dens或默认情况下使用空字符串。

但是如果我的属性是布尔值,则它不起作用:

var dom = mapping.allowDom || mapping.dom || true;

即使truemapping.dom,也会返回false

我想知道,默认布尔属性的最佳(简洁但仍然可读)语法是什么?默认情况下,如果定义了属性,则使用其值,否则提供一些默认值。我可以为此编写一个函数,当然,也许它有点像a || b || c一样优雅?

代码示例:



var a = {};
$('#result').text(a.boo||a.b||true);

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre id="result"></pre>
&#13;
&#13;
&#13;


更新

似乎没有&#34;语法上的甜蜜&#34;这样做的方法,所以我已经使用了写一个函数:

var defaultValue = function()
{
    var args = arguments;
    if (args.length === 0)
    {
        return undefined;
    }
    else
    {
        var defaultValue = args[args.length - 1];
        var typeOfDefaultValue = typeof defaultValue;
        for (var index = 0; index < args.length - 1; index++)
        {
            var candidateValue = args[index];
            if (typeof candidateValue === typeOfDefaultValue)
            {
                return candidateValue;
            }
        }
        return defaultValue;

    }
}

将最后一个参数视为默认值。返回与默认值具有相同类型的第一个参数。

6 个答案:

答案 0 :(得分:3)

你会发现最接近优雅的东西是:

var dom = mapping.allowDom ? mapping.allowDom : mapping.dom ? mapping.dom : true;

正如所指出的,这只是一种存在检查。您可以执行以下任一操作来接受false值:

var dom = mapping.allowDom != null ? mapping.allowDom : mapping.dom != null ? mapping.dom : true;

var dom = 'allowDom' in mapping ? mapping.allowDom : 'dom' in mapping ? mapping.dom : true;

完整性更新:如果您有要比较的值的变量列表,则更新中的函数是理想的。但是,如果我们比较的唯一内容是提到的2(我们控制设置/验证mapping.thing),我的代码将如下所示。 (我也不知道你以后如何使用dom。)

var dom = mapping.allowDom || mapping.dom;
dom = dom === undefined ? true : dom;

任何超过2个元素的东西,我可能会选择你的方法。

答案 1 :(得分:2)

a.x || b
如果a.x是“falsey”,则

将返回b的值 - undefined,空字符串,0,其他一些值。

如果您需要显示某些内容,除非该字段位于对象中,即使该字段的值为false,您也必须明确说明。

'x' in a ? a.x : b

如果明确将a.x设置为undefined,则该表达式将返回'undefined',而不是b。

答案 2 :(得分:1)

这比接受的答案要长很多,但它应该从我理解的内容中准确地给出你想要的东西。

var mapping = {dom: false};
var dom = typeof mapping.allowDom !== "undefined" ? mapping.allowDom : typeof mapping.dom !== "undefined" ? mapping.dom : true;
$('#result').append("" + dom);

对这个小提琴的更多测试。

http://jsfiddle.net/myra7x2m/

答案 3 :(得分:1)

另一种不错的实现形式是通过函数和switch而没有控制表达式,这使得它更好地成为if / else块:

dom = (function() {
    switch (false) {
      case mapping.allowDom == null:
        return mapping.allowDom;
      case mapping.dom == null:
        return mapping.dom;
      default:
        return true;
    }
})();

你可以在这里测试一下

http://jsfiddle.net/w3jtsk5u/

如果您想知道为什么我要比较== null而不是!= null并且它仍在工作,那么我使用的是switch(false),因此与之比较的值为false,否定了表达

对于小型朋友,当然可以写:

dom = (function(){switch(false){
  case mapping.allowDom == null: return mapping.allowDom;
  case mapping.dom == null:      return mapping.dom;
  default:                       return true;
}})();

仍然可读:)

答案 4 :(得分:0)

当涉及到布尔值测试为null的选项是要走的路:

var dom;
if (mapping.allowDom != null) {
  dom = mapping.allowDom;
} else if (mapping.dom != null) {
  dom = mapping.dom;
} else {
  dom = true;
}

我会在函数或Maybe monad中包含上面的内容。请注意,这是我使用==!=运算符的唯一用例,任何其他比较始终是===!==运算符。因为== null将测试null或undefined。

答案 5 :(得分:0)

OR运算符将返回第1个&#39; truthy&#39;值,如果该值被评估为false,它将检查下一个直到最后一个。

因此,它只能出现虚假或“假”的情况。值作为序列中最后一个的默认值。