我见过人们使用正则表达式,typeof或诸如isNaN之类的内置函数;检查变量/对象的属性是否为数字。
但是今天我发现了一个“ hack”:
if(a.x*1) {
//a.x if a number
} else {
//a.x is not a number; a.x*1 is NaN
}
我只是想知道这个技巧是否有缺点。
编辑:我无法控制a.x
的值,但是我知道它可以是数字(1.2
),字符串("error"
)或可以强制转换的字符串到一个数字("1.2"
)。我需要一种快速干净的方法来检查其有效性并将其转换为数字。
Edit2:如果我用a.x*1!==NaN
进行检查怎么办?
答案 0 :(得分:3)
您的支票会错误地声称0
不是数字,所以不,它不能代替isNaN
或类似的数字。
请注意,如果您想知道a.x
是否已经已经一个数字(而不是可以强制转换为数字的内容),即使isNaN
也不是正确的工具,因为它将报告"12"
是数字,或者任何日期实例都是。要检查它是否已经已经一个数字(而不是可以强制转换为一个数字),您需要typeof
。 (当然,typeof NaN
是"number"
,因此您也必须考虑到这一点。)
因此,如果您想知道a.x
是否已经是一个数字,而不是NaN
:
if (typeof a.x === "number" && !isNaN(a.x))
如果您想知道它是一个数字还是可以隐式强制为非NaN
的数字:
if (!isNaN(a.x))
答案 1 :(得分:0)
将1
乘以someVariable - 0
将导致隐式转换为数字。这与执行+someVariable
或Number(someVariable)
或显式+
相同。
使用建议的方法的一个缺点是,使用一元加号(Number
)或调用function isNumber(someVariable) {
if(someVariable*1) {
console.log(`"${someVariable}" is a number. For real: ${typeof someVariable}`)
} else {
console.log(`"${someVariable}" is not a number. It was a ${typeof someVariable}`)
}
}
//these are correct
isNumber(1);
isNumber("abc");
//these are incorrect
isNumber(0);
isNumber("123");
isNumber(" 321");
isNumber([1]); //logged as simply *1* the string value of an array with with one element is that element
var obj = {
name: "Fred",
age: 42,
valueOf: function() {
return this.age;
}
}
//this is also incorrect
isNumber(obj)
作为转换版本在JavaScript中是惯用的,这意味着它已广为人知,因此使用另一种方法实现相同的方法可能会造成混淆,并使您的代码更难阅读。
但是,另一方面,所有这些转换的结果都无法准确地告诉您该值是否为数字。请考虑以下内容:
if (resultOfImplicitConversion)
根据定义,检查某些操作的结果会告诉您该操作的结果。因此,通过检查结果来检查是否可以将某些内容隐式转换为数字,可以确切地告诉您-可以将源隐式转换为数字。
此外,在执行 var client = new HttpClient();
client.BaseAddress = new Uri(uri);
client.DefaultRequestHeaders.Remove("authorization");
client.DefaultRequestHeaders.Add("authorization", "Token "+base64token);
var content = new StringContent(JsonString, Encoding.UTF8,
"application/json");
HttpResponseMessage response = await client.PutAsync(queryString, content);
时,您正在检查结果是否为真或假。这与检查其类型不同。
因此,您提出的方法的陷阱在于,它在尝试验证的两个步骤中都不准确,并且还可能不准确地向将来的代码读者(包括您自己)展示了您的意图。
如果要检查值是否为数字,请follow this great answer on StackOverflow