好奇其他人如何为此创建一个后备:som var = number 0 ||假?

时间:2013-11-01 17:53:27

标签: javascript

所以,我遇到了一个bug,并认为它很有趣。一旦我坐下来思考它5秒钟,它是有道理的但很好​​奇将来如何通过它。

所以,我在obj中设置了一些哈希值。 (来自更大的obj的代码片段)。

   someBigObj : {
       someObj : {
         item1 : 0
         item2:  1
         item4:  2
         item3:  3
      }
  }

所以,我这样设置,因为我需要引用一个与这些项目相关的数据对应的数组位置。

所以,如果我碰巧引用item1 - 看看我们得到了什么。

var varReference = someBigObj.someObj['item1'] || false;
// which is equivalent to 
var varReference = 0 || false;

看看那里发生了什么?该引用为0.因此varReference始终为false。在这种情况下,我实际上想要数字0,因为我需要访问数组元素。我认为将它串起来对我来说很奇怪,因为它不是一个字符串,而是一个整数。我怎么还能使用这个||的后备false,但实际上将数字0视为有效值。

注意:我知道我可以明确地测试等...只是好奇是否有一个快捷方式或本机js(我不知道)解决了我的解决方案。想出类似的东西会起作用但却没有。

 Number(0) || false

补充说明:我结束时没有放|| false,因为即使没有正确引用它也没有错误。所以它实际上并不重要,但我总是喜欢有后备,这就是我很好奇的原因。

3 个答案:

答案 0 :(得分:3)

如果您希望falsey值通过测试,那么测试可能需要明确查看undefined,而不仅仅是假值。

var varReference = someBigObj.someObj['item1'] !== undefined ? someBigObj.someObj['item1'] : false;

请注意,许多合法值都是假的,例如0""null(和其他人)。

答案 1 :(得分:2)

您可以使用内联if来明确检查您的值是否为undefined

var varReference = (typeof(someBigObj.someObj['item1']) !== 'undefined') ? someBigObj.someObj['item1'] : false;

答案 2 :(得分:1)

您应该检查属性中是否存在in operator的对象,而不是尝试查看属性中的值(以及有时会失败的虚假):

var varReference = 'item1' in someBigObj.someObj
                     ? someBigObj.someObj['item1']
                     : false;

可以简化为

var varReference = 'item1' in someBigObj.someObj && someBigObj.someObj['item1'];