Поведение NaN в JavaScript - PullRequest
0 голосов
/ 14 мая 2018

В этом примере функция 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 я передаю переменную, содержащую строку (все, что в кавычках). Чтобы подтвердить то же самое, я даже утешил тип значения содержится в переменной «вход».

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 голосов
/ 14 мая 2018
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)); 
0 голосов
/ 14 мая 2018

Вы наткнулись на странное поведение isNaN(). Более подробную информацию смотрите в документации.

Но, вкратце, как NaN работает в этом особом случае, определяется этой строкой в ​​документации -

Когда аргумент функции isNaN не имеет типа Number, значение сначала приводится к числу

Итак, в вашем случае строка '1' сначала приводится к числу, а затем проверяется. Вот почему вы получаете "неожиданное" поведение. Если вы хотите строго проверить тип, вы можете проверить, используя typeof value !== 'number'

...