将变量与1相乘以检查是否为数字

时间:2018-10-02 07:29:08

标签: javascript

我见过人们使用正则表达式,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进行检查怎么​​办?

2 个答案:

答案 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将导致隐式转换为数字。这与执行+someVariableNumber(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