在Python中,对于字典d
,
d.setdefault('key', value)
如果d['key'] = value
不在'key'
中,则设置d
,否则保持不变。
在Javascript对象上执行此操作是否有一种干净的惯用方法,还是需要if
语句?
答案 0 :(得分:19)
if (!('key' in d)) d.key = value;
或
'key' in d || (d.key = value);
(最后一个使用the short-circuit behavior of conditional expressions。)
“d.key || (d.key = value)
”在另一个答案中提出了错误:如果一个元素存在但评估为false
(false
, null
, 0
, -0
, ""
, undefined
, NaN
),它将被静默覆盖。
虽然这可能是预期的,但它很可能不适用于上述案例的所有。因此,在这种情况下,请分别检查值:
if (!('key' in d) || d.key === null) d.key = value;
答案 1 :(得分:9)
它基本上就像使用if
语句,但更短:
d.key || (d.key = value);
或者
d.key = d.key || value;
更新:正如@bobtato所说,如果该属性已设置为值false
,它将覆盖它,因此更好的方法是:
!d.key && d.key !== false && (d.key = value);
或者,按照他的建议去做(只是缺少版本):
'key' in d || (d.key = value);
// including overwriting null values:
('key' in d && d.key !== null) || (d.key = value);
答案 2 :(得分:6)
不建议这样做,并且永远不是一个好主意来扩充内置类。相反,最好创建自己的内置类实现,就像YUI库一样(YArray等)。但是,我会反驳这一点,因为我经常发现像这样实现有用的捷径是编写干净的可维护代码的好处:
if (undefined === Object.prototype.setdefault) {
Object.prototype.setdefault = function(key, def) {
if (! this.hasOwnProperty(key)) {
this[key] = def;
}
return this[key];
};
}
所以,让我们看看它在行动......
var a = {};
a.setdefault('mylist', []).push(1);
a.setdefault('mylist', []).push(2);
console.log(a.mylist.toString());
1,2
正如已经指出的那样,使用thing = thing || defaultThing
永远不是一个好主意,因为它只测试true
或thing == true
的非类型相等。与键入的相等相反:thing === true
或thing !== undefined
。因此,以内联方式正确编码setdefault
的唯一方法是在任何地方使用此代码段:
/* null == thing is equivalent to... */
if (undefined !== thing && null !== thing) {
thing = defaultThing;
}
/* ...but it's not explicit and linters don't like it! */
但正如我已经说过的,这只会给你的代码增加膨胀,并且很容易从" copy-and-paste"中获得错误。综合征。
答案 3 :(得分:5)
内置任何内容,但此功能可以执行此操作:
function setDefault(obj, prop, deflt) {
return obj.hasOwnProperty(prop) ? obj[prop] : (obj[prop] = deflt);
}
如果obj
只包含非虚假值,obj[prop] || (obj[prop] = deflt)
是一个很好的简单替代方法(但deflt
会覆盖任何虚假的值)。这样做的另一个好处是deflt
只有在需要它时才会被评估,所以它可以是一个昂贵的表达式。
答案 4 :(得分:2)
a={}
key='3'
value = 2
a[key] = a[key] == undefined ? value : a[key]
## a = {'3': 2 }
答案 5 :(得分:1)
如今,您也可以进行java.lang.NoClassDefFoundError: com/google/common/util/concurrent/internal/InternalFutureFailureAccess