Node js: process.stdin.on и тестирование числа с помощью typeof vs isNaN - PullRequest
1 голос
/ 25 марта 2020

Я изучаю веб-разработку и начинаю свое путешествие с node.js (уже работал над JS), поэтому извините, если мой вопрос - вопрос Нуба :) Я уже нашел несколько похожих вопросов на форуме, но не совсем то же самое, и до сих пор не понимаю, что происходит.

Я не знаю, почему typeof не работает в node.js, так как он работает с JS в консоли. Мне удалось заставить его работать с функцией isNaN , но кто-то может объяснить мне, что происходит с функцией typeof?

process.stdin.resume()
process.stdin.setEncoding('utf8')

console.log('What\'s your age ? ')
process.stdin.on('data', (int) => {
    if (int > 99 ) {
        console.log('Enter an age below 99')
    } else if (typeof int != 'number') {
        console.log('Enter a number')
        console.log(int)
        console.log(typeof int)
    } else {
        let year = 2020 - int
        if (year > 2020) {
            console.log("Year is above 2020")
        } else {
            console.log('Hello you were born in ' + year)
        }
    }
    process.exit()
})

Попытка с возрастом 39, это регистрирует 'Введите число ', даже если это цифра c запись ...! Console.log (typeof int) дает мне 'string'.

Если я изменяю код с помощью функции isNan, она отлично работает:

process.stdin.resume()
process.stdin.setEncoding('utf8')

console.log('What\'s your age ? ')
process.stdin.on('data', (int) => {
    if (int > 99 ) {
        console.log('Enter an age below 99')
    } else if (isNaN(int)) {
        console.log('Enter a number')
        console.log(int)
        console.log(typeof int)
    } else {
        let year = 2020 - int
        if (year > 2020) {
            console.log("Year is above 2020")
        } else {
            console.log('Hello you were born in ' + year)
        }
    }
    process.exit()
})

Имеет ли это какое-то отношение к процессу. заявление stdin.on? Большое спасибо за ваши ответы!

1 Ответ

0 голосов
/ 25 марта 2020

typeof не работает, потому что обратный вызов process.stdin.on("data", callback) получит строку после того, как вы позвоните readable.setEncoding("utf8").

См. node.js документы :

По умолчанию кодирование не назначено, и данные потока будут возвращены как объекты буфера. Установка кодировки приводит к тому, что данные потока возвращаются как строки указанной кодировки, а не как объекты Buffer. Например, вызов readable.setEncoding ('utf8') приведет к тому, что выходные данные будут интерпретированы как данные UTF-8 и переданы как строки. Вызов readable.setEncoding ('hex') приведет к тому, что данные будут закодированы в шестнадцатеричном формате строки.

Кроме того, typeof aStringValue === "number" равно false.

const foo = "foo";
console.log(typeof foo === "number"); // false

isNaN приведет к преобразованию строки в число, поэтому ваш второй пример работает.


В любом случае, я думаю, что самый простой способ справиться со всем этим - это использовать parseInt(int, 10) с помощью try / catch для явного преобразования данных в число вместо использования стольких неявных приведений.

...