我喜欢有点干净的代码:
var currentVar = aBigObject['Key1']['Key2']['Key3'];
generalValues.push(((!currentVar) ? 0 : currentVar));
替代方案(我认为)是这样的:
if (!aBigObject['Key1']['Key2][Key3']) generalValues.push(0);
else generalValues.push(aBigObject['Key1']['Key2']['Key3']);
对我来说,第二个是不必要的长而且难以阅读。我的问题是,将变量设置为可能未定义的变量是否真的安全/好的做法?
答案 0 :(得分:1)
你有没有想过
var currentVar = aBigObject['Key1']['Key2']['Key3'] || 0;
generalValues.push(currentVar);
答案 1 :(得分:1)
前者对我来说是不必要的长而且难以阅读。我的问题是,将变量设置为可能未定义的变量是否真的安全/好的做法?
完全安全因为它不会导致错误。这也意味着您不必再次执行所有这些查找。
您的替代方案似乎也没什么意义(当然不是与您的第一个代码段做同样的事情),因为它在{{1}时有完全不同的行为} 不是 falsey(将其分配给自己而不是将其推送到 (对问题的编辑修复此问题。) aBigObject['Key1']['Key2][Key3']
)。
你的第一个例子肯定有很多不必要的内容,可以写成:
generalValues
..并且可能更好地写成
var currentVar = aBigObject['Key1']['Key2']['Key3'];
generalValues.push(!currentVar ? 0 : currentVar);
您的一般观点似乎是,“为什么第一个代码段使用generalValues.push(aBigObject['Key1']['Key2']['Key3'] || 0);
?”答案是,属性查找不是免费的。因此,一旦您在currentVar
上查找Key1
,在结果上查找aBigObject
,在 的结果上查找Key2
,你记住并重复使用它而不是再次查找它。 JavaScript对象是哈希映射,查找很便宜,但它们不是 free 。但在特定的案例中,您可以采用其他方式(见上文)。
答案 2 :(得分:0)
a = {};
var b = a.foo;
这不会引发任何错误,并将局部变量b
设置为值undefined
。没错。
但是,当您拥有嵌套属性时,事情会变得疯狂,其中任何级别都可能未定义。
a = {};
var b = a.foo.bar;
此示例引发异常。如果可能没有任何嵌套,则需要在钻孔之前测试每个级别。
a = {};
var b = a.foo && a.foo.bar;
鉴于此,此代码应该推送深层嵌套的值(如果存在)。如果没有,请改为0
。
generalValues.push(
(
aBigObject.Key1 &&
aBigObject.Key1.Key2 &&
aBigObject.Key1.Key2.Key3
) || 0
);