JavaScript中的NaN行为

时间:2018-05-14 13:21:46

标签: javascript types nan coercion type-coercion

在此示例中,函数sanitise()

如果传递的值不是数字

,则

返回NaN

否则它将返回传递的值。

Case1: function sanitise(x) { if (isNaN(x)) { return NaN; } return x; } console.log(sanitise(1)); // expected output: "1" console.log(sanitise('NotANumber')); // expected output: NaN

因此,如果参数是这个函数,则过滤并输出相同的 只有一个数字而不是字符串或任何其他类型。我看到一个例外 案例2。

在案例2中,我传递一个包含字符串的变量(任何东西都是 在引号中)。为了确认相同我甚至安慰了价值的类型 包含在变量“input”中。

Case2: function sanitise(x) { if (isNaN(x)) { return NaN; } return x; } var input = '1'; console.log(typeof input); console.log(sanitise(input)); // expected output: NaN // But actual output: 1 console.log(sanitise('NotANumber')); // expected output: NaN

所以现在传递的参数是一个字符串,但仍然是字符串 被视为数字。请帮助我理解这里发生了什么?

2 个答案:

答案 0 :(得分:1)

你偶然发现了isNaN()令人困惑的特殊情况行为。 Check the documentation for more details.

但是,简而言之,NaN在这种特殊情况下的工作方式由文档中的这一行定义 -

  

当isNaN函数的参数不是Number类型时,   值首先被强制转换为数字

因此,在您的情况下,首先将字符串“1”强制转换为数字,然后进行检查。这就是你得到“意外”行为的原因。 如果要严格检查类型,可以使用typeof value !== 'number'

进行检查

答案 1 :(得分:-1)

Please run and try to understand

function sanitise(x) 
{ 
    if (!isNaN(x)) 
    { 
        return 'NaN'; // if you return NaN javascript treat as number  
    } 
    console.log(x)
    return x; 
} 
var input = '1'; 
console.log(typeof input); 
console.log(typeof sanitise(input), sanitise(input));