Javascript 如果数字为0,则空性测试失败
出于某种原因,我的老板更改了我在JS中获得的数据,因此,如果我收到字符串,现在我可以收到从0到n的字符串或数字。直到今天,当我发现要测试的数字正好是0时,旧代码块才出现问题 原因是该代码:Javascript 如果数字为0,则空性测试失败,javascript,Javascript,出于某种原因,我的老板更改了我在JS中获得的数据,因此,如果我收到字符串,现在我可以收到从0到n的字符串或数字。直到今天,当我发现要测试的数字正好是0时,旧代码块才出现问题 原因是该代码: if(myObject.getData()) { ... } else { //here's where I go } getData返回字符串和数字,但当数字为0时,if测试将其作为布尔值,结果总是false,而两行之后,在花括号内,我需要数字0将其发送到服务器 检查数据是否为非空、非假、
if(myObject.getData()) {
...
}
else {
//here's where I go
}
getData返回字符串和数字,但当数字为0时,if测试将其作为布尔值,结果总是false,而两行之后,在花括号内,我需要数字0将其发送到服务器
检查数据是否为非空、非假、非布尔甚至非布尔并保留我的0的最佳方法是什么?您可以在if语句中引入OR,使用严格相等运算符检查它是否为数值0==: 一些测试用例:
data = "" // false
data = false // false
data = undefined // false
data = 0 // true
data = 1 // true
data = "test" // true
您可以在if语句中引入OR,使用严格相等运算符==,检查它是否为数值0: 一些测试用例:
data = "" // false
data = false // false
data = undefined // false
data = 0 // true
data = 1 // true
data = "test" // true
相反,您似乎只需要非空字符串和数字。如果该假设正确,您可以使用并执行以下操作:
var data = myObject.getData();
if((typeof data === 'string' && data !== '') || typeof data === 'number') {
//...
}
else{
//here's where I go
}
这种方法有两个关键好处:
输入格式是明确的,因此是自文档化的。
它可以防止将来对输入类型进行任何修改。
相反,您似乎只需要非空字符串和数字。如果该假设正确,您可以使用并执行以下操作:
var data = myObject.getData();
if((typeof data === 'string' && data !== '') || typeof data === 'number') {
//...
}
else{
//here's where I go
}
这种方法有两个关键好处:
输入格式是明确的,因此是自文档化的。
它可以防止将来对输入类型进行任何修改。
myObject.getData=未定义是否应尝试parseIntmyObject.getData?因为0是一个错误的值…@epascarello:好的,我理解这一点,我正在寻找一个好的解决方案:-myObject.getData=未定义的工作应该尝试parseIntmyObject.getData?因为0是一个错误的值…@epascarello:好的,我理解这一点,我正在寻找一个好的解决方案:-这是我的第一个想法,但我认为它不是很优雅,我做了另一件事,也不那么优雅:我将所有数据转换为字符串,并使用trim测试它们是否返回非空值string@3000你不需要那样做。if语句的第一部分将过滤掉所有错误值,包括空字符串;然后,第二部分将检查Falsy值是否正好等于0。@3000此解决方案的一个问题是,如果您的上司再次更改输入,则可能是如果传递了任何对象,它将接受该值作为真实值。这可能有点奇怪,但考虑到输入类型已经被修改过一次,防范它可能是明智的。这是我的第一个想法,但我认为它不太优雅,我做了另一件事情,也不那么优雅:我将所有数据转换为字符串,并使用trim测试它们是否返回非空的值string@3000你不需要那样做。if语句的第一部分将过滤掉所有错误值,包括空字符串;然后,第二部分将检查Falsy值是否正好等于0。@3000此解决方案的一个问题是,如果您的上司再次更改输入,则可能是如果传递了任何对象,它将接受该值作为真实值。这可能有点奇怪,但考虑到输入类型已经被修改过一次,防范它可能是明智的。