所以,我遇到了一个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,因为即使没有正确引用它也没有错误。所以它实际上并不重要,但我总是喜欢有后备,这就是我很好奇的原因。
答案 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'];