-2

我喜欢有一些干净的代码:

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']);

对我来说,第二个不必要地冗长且难以阅读。我的问题是,将变量设置为可能未定义的东西真的安全/良好吗?

4

3 回答 3

1

你有没有想过

var currentVar = aBigObject['Key1']['Key2']['Key3'] || 0;
generalValues.push(currentVar);
于 2012-12-06T22:08:52.970 回答
1

对我来说,前者不必要地冗长且难以阅读。我的问题是,将变量设置为可能未定义的东西真的安全/良好吗?

这是非常安全的,因为它不会导致错误。这也意味着您不必再次进行所有这些查找。

您的替代方案似乎也没有什么意义(当然您的第一个代码片段做的事情不同),因为它在aBigObject['Key1']['Key2][Key3'] 虚假时具有完全不同的行为(将其分配给自己而不是推动它generalValues)。 (对问题的编辑解决了这个问题。)

你的第一个例子当然有很多不必要的括号,可以写成:

var currentVar = aBigObject['Key1']['Key2']['Key3'];
generalValues.push(!currentVar ? 0 : currentVar);

..并且可能更好地写成

generalValues.push(aBigObject['Key1']['Key2']['Key3'] || 0);

您的一般观点似乎是,“为什么第一个片段使用currentVar?” 答案是属性查找不是免费的。因此,一旦您完成了Key1on aBigObjectKey2结果和Key3that查找,您就会记住并重用它,而不是再次查找它。JavaScript 对象是哈希图,查找很便宜,但它们不是免费的。但在这种特定情况下,您可以采用另一种方式(见上文)。

于 2012-12-06T22:09:30.427 回答
0
a = {};
var b = a.foo;

这不会引发错误,并将局部变量设置bundefined. 这没什么错。

但是,当您拥有嵌套属性时,事情会变得很疯狂,其中任何级别都可能是未定义的。

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
);

还有……coffeescript 很酷

于 2012-12-06T22:10:10.993 回答