Разница в эффективности между parseInt () и Number.isInteger () в следующем сценарии массива Javascript? - PullRequest
1 голос
/ 20 мая 2019

Я работаю над проблемами кодирования Javascript ES6 на freecodecamp.org, и одна из них поручила мне использовать функцию обозначения стрелки:

  1. Взять массив действительных чисел.
  2. Фильтртолько положительные целые числа в новый массив и
  3. возведите в квадрат эти положительные целые числа.

Я успешно выполнил задачу, но построил свой код для шага 2, отфильтровав исходный массив с помощью чисел.isInteger ().Предоставленный ответ Freecodecamp.org использует parseInt ().

Я не понимаю, зачем нам нужно анализировать целые числа, если они уже являются целыми числами, или почему parseInt () не выдает ошибку, поскольку его параметр запрашивает строку.

Мой основной вопрос: Оба одинаково приемлемы?Кто-нибудь может привести меня к дальнейшим неприятностям в будущем?

Единственный тесно связанный стек, который я обнаружил, был здесь (который был немного полезен).Ниже приведен мой код, за которым следует код ответа, предоставленный freecodecamp.org.ПРИМЕЧАНИЕ. Мне известно, что в моем коде есть несколько дополнительных шагов.Я не большой поклонник стрелочных обозначений и все еще совершенствую свою организацию кода!


МОЙ КОД ::

const realNumberArray = [4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2];

const squareList = (arr) => {

"use strict";

// dictates what numbers are filter()'d out of original array

const checkElement = (value) => value > 0 && Number.isInteger(value) == true;

const integersOnly = arr.filter(checkElement); //filters ONLY positive integers into new array

ПРЕДОСТАВЛЯЕТСЯ ОТВЕТНЫЙ КОД ::

const realNumberArray = [4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2];

const squareList = (arr) => {

"use strict";

const squaredIntegers = arr.filter( (num) => num > 0 && num % parseInt(num) === 0 ).map( (num) => Math.pow(num, 2) );

Ответы [ 3 ]

0 голосов
/ 20 мая 2019

parseInt пытается преобразовать значение, которое вы передаете ему, в целое число, если вы вызовете его с помощью этого параметра parseInt("30"), он вернет вам значение 30 в виде числа.Если вы вызываете его со значением, которое не может быть преобразовано в целое число, например parseInt("hello world"), он вернет NaN.

Number.isInteger проверяет, является ли данное значение целым числом, возвращающим истинное или ложное логическое значение.Number.isInteger(1) вернет true, Number.isInteger("hello world") или Number.isInteger(3.14) вернет false.

0 голосов
/ 20 мая 2019

Я не понимаю, зачем нам нужно анализировать целые числа, если они уже являются целыми числами.

Тебе не нужно. Это злоупотребление parseInt. Они должны были использовать Math.floor вместо этого по своему прямому назначению.

Почему parseInt() не выдает ошибку, поскольку ее параметр запрашивает строку?

Потому что это старый API, и он очень снисходительный. Вместо того, чтобы выдавать ошибки, он просто приводит свой аргумент к строке, а затем пытается разобрать это.

Мой основной вопрос: одинаково ли приемлемы оба?

Нет, parseInt абсолютно недопустимо. Вы нашли намного лучшее решение с isInteger. Причина, по которой они не использовали его, вероятно, заключается в том, что isInteger - это относительно новая функция, добавленная в ES6.

0 голосов
/ 20 мая 2019

Документы немного вводят в заблуждение - первый параметр parseInt не имеет , чтобы быть строкой. Глядя на спецификацию , первый аргумент приводится к строке как первый шаг:

Когда вызывается функция parseInt, предпринимаются следующие шаги:

  1. Пусть inputString будет ToString (string).

Одна из проблем с parseInt заключается в том, что, если он имеет начальный ноль, он может интерпретироваться как восьмеричный в некоторых (старых) браузерах и как базовый 10 в других (более новых) браузерах , По этой причине, если вы хотите поддерживать упомянутые старые браузеры, лучше либо всегда указывать основание (как второй параметр), либо использовать Number.

Тем не менее, в этой конкретной ситуации это не имеет значения, потому что вызов parseInt по номеру никогда не приведет к нулю в начале.

Тем не менее, я думаю, что рекомендуемый ответ немного вводит в заблуждение - поскольку вы знаете, что числа, используемые в тесте, всегда будут положительными, было бы более целесообразно использовать Math.floor, чем parseInt для этой цели, поскольку вы просто пытаетесь получить значение с плавающей точкой, а не пытаетесь превратить строку в число.

...