在JavaScript中,我经常使用||
运算符来获取某些属性的值 - 或默认值。例如:
var dens = mapping.defaultElementNamespaceURI||mapping.dens||'';
如果mapping
有defaultElementNamespaceURI
,则会使用它,否则请查找dens
或默认情况下使用空字符串。
但是如果我的属性是布尔值,则它不起作用:
var dom = mapping.allowDom || mapping.dom || true;
即使true
为mapping.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;
更新
似乎没有&#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;
}
}
将最后一个参数视为默认值。返回与默认值具有相同类型的第一个参数。
答案 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);
对这个小提琴的更多测试。
答案 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;
}
})();
你可以在这里测试一下
如果您想知道为什么我要比较== 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,它将检查下一个直到最后一个。
因此,它只能出现虚假或“假”的情况。值作为序列中最后一个的默认值。