Приведение нуля через parseInt() в JS
Задачка которая принимает список неотрицательных целых чисел и строк и возвращает новый массив чисел.
const filterlist = [1, 2, "a", "b", 0];
function filter_list(l) {
let arrayResult = [];
for (const iteml of l) {
if (parseInt(iteml)) {
arrayResult.push(iteml);
}
}
return arrayResult;
}
const res = filter_list(filterlist);
for (let i = 0; i < res.length; i++) {
console.log(res[i]);
}
// console.log(parseInt(0));
При выполнении данного кода получается, что парсятся только 1 и 2, а 0 остаётся в пролёте, но почему тогда, когда я в консоль привожу приведение (закомментированная строка), то показывает, что это число. Я понимаю, что ноль ложное значение, но как обойти тогда?
'number' — это строка, возвращаемая оператором typeof, когда тип переменной или значения — число.
Проверка typeof item === 'number' позволяет узнать, является ли переменная числом, соответсвенно 0 туда тоже входит
=== в данном случае выполняет строгое сравнение, проверяя и тип, и значение.
const filterlist = [1, 2, "a", "b", 0];
function filter_list(l) {
let arrayResult = [];
for (const item of l) {
if (typeof item === 'number') {
arrayResult.push(item);
}
}
return arrayResult;
}
const res = filter_list(filterlist);
for (let i = 0; i < res.length; i++) {
console.log(res[i]);
}
но тут важно помнить, что NaN тоже число, поэтому можно добавить
if (typeof item === 'number' && !isNaN(item)) {
//добавить проверку, что это также не NaN
}
если мы хотим и строковые числа учесть, то можно еще проверку добавить
if ((typeof item === 'number' && !isNaN(item)) || (!isNaN(parseFloat(item)) && isFinite(item)))
!isNaN(parseFloat(item)) проверяет, можно ли преобразовать строку в число, а isFinite() исключает бесконечные значения, такие как Infinity и -Infinity. Но помните, что parseFloat()/parseInt() может корректно преобразовывать строки, начинающиеся с чисел, даже если за ними следуют другие символы, и надо понимать оно нам надо, или как (например, 123bukvi=>123). Чтобы избежать таких случаев, можно использовать дополнительную проверку...