在JavaScript中将变量设置为未定义是否安全?

时间:2012-12-06 22:05:41

标签: javascript variables coding-style undefined

我喜欢有点干净的代码:

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

对我来说,第二个是不必要的长而且难以阅读。我的问题是,将变量设置为可能未定义的变量是否真的安全/好的做法?

3 个答案:

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

Also... coffeescript is pretty cool