【问题标题】:Is it safe to set variables as undefined in JavaScript? [closed]在 JavaScript 中将变量设置为未定义是否安全? [关闭]
【发布时间】:2012-12-06 22:05:40
【问题描述】:

我喜欢简洁的代码:

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

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

【问题讨论】:

  • 第二个例子不应该是推送而不是分配吗?
  • 你是对的,我编辑了帖子。

标签: javascript variables coding-style undefined


【解决方案1】:

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

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

您的替代方案似乎也没有什么意义(当然与您的第一个代码 sn-p 做同样的事情),因为它在 @987654322 时具有完全不同的行为@ 不是错误的(将其分配给自己而不是将其推送到generalValues)。 (对问题的编辑解决了这个问题。) p>

你的第一个例子肯定有很多不必要的括号,可以这样写:

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

..并且可能会更好地写成

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

您的一般观点似乎是,“为什么第一个 sn-p 使用 currentVar?”答案是属性查找不是免费的。因此,一旦您在aBigObject 上查找了Key1,在结果上查找了Key2,在that 的结果上查找了Key3,您记住并重复使用它而不是查找又起来了。 JavaScript 对象是哈希图,查找成本很低​​,但它们不是免费。但在那种特定的情况下,你可以用另一种方式来做(见上文)。

【讨论】:

  • 对不起,我可能对所有的编辑感到困惑。感谢您的帮助,我从来不知道运算符可以这样使用。
  • @DillPixel:是的,JavaScript || 运算符是 curiously powerful。 :-)
【解决方案2】:

你有没有想过

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

【讨论】:

    【解决方案3】:
    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

    【讨论】:

      猜你喜欢
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-01
      • 2014-10-19
      • 2021-01-10
      相关资源
      最近更新 更多