在此示例中,函数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
所以现在传递的参数是一个字符串,但仍然是字符串 被视为数字。请帮助我理解这里发生了什么?
答案 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));