#javascript #arrays #slice #default-value #conditional-operator
Вопрос:
Отказ от ответственности: Я новичок в JS. Итак, все мои тесты проходят, кроме одного — последнего — и я не могу понять, как это исправить. Почему 0 возвращает последний элемент, а не пустой массив? Кроме того, в отдельном примечании, когда я попытался использовать значение по умолчанию, оно вернуло неправильные значения, поэтому я решил включить условный оператор.
const takeRight = (array, n) => {
n = -n;
//setting both default and a negative value for 'n': if there is no number, then n should be -1
const condition = !n ? -1 : n;
return array.slice(condition);
};
console.log(takeRight([1, 2, 3])); // returns [3] --> expected [3]
console.log(takeRight([1, 2, 3], 2)); //returns [2, 3] --> expected [2,3]
console.log(takeRight([1, 2, 3], 5)); //returns [1, 2, 3] --> expected [1,2,3]
console.log(takeRight([1, 2, 3], 0)); //returns [3] --> expected []
Ответ №1:
Проблема заключается в вычислении condition
переменной:
const condition = !n ? -1 : n;
выражение !0
истинно, поэтому n
изменяется на -1
когда имеет значение 0
.
Если вы хотите свериться не с цифрами, используйте isNaN
.:
const takeRight = (array, n) => {
n = isNaN(n) ? -1 : -n;
return array.slice(n);
};
Комментарии:
1. Спасибо! Чувак, я знал, что это будет простое решение, но не настолько простое. Полный момент «ладонь к лицу»
Ответ №2:
Проблема может быть в вашем выражении лица. Проверьте на «Не номер»
const condition = isNaN(n) ? -1 : n;
MDN: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/isNaN
Комментарии:
1. Спасибо! Не могу поверить, что я это пропустил.
Ответ №3:
Итак, прежде всего, вы не должны переназначать аргументы. Но реальная проблема здесь !n
в том, чтобы проверить, существует ли она. Это может быть ловким трюком здесь и там, но на самом деле это просто сбивает с толку. Префиксация чего-либо с помощью a !
в JavaScript превращает его в логическое значение, а затем отрицает его, и правила для этого преобразования не очевидны, а также не одинаковы на всех языках. Но в JS !0
дает тот же результат, !undefined
что и or !null
, потому что число 0 часто символизирует «выключенное состояние», в основном a false
, но короче. В любом случае, чтобы избежать всего этого, просто используйте параметры по умолчанию и используйте тернарный оператор в операторе return для проверки конкретного случая n = 0
, подобного этому:
const takeRight = (array, n = 1) => n === 0 ? [] : condition array.slice(-n);
Вы, конечно, можете сделать это немного более подробным:
const takeRight = (array, n = 1) => {
if (n === 0) {
return [];
}
return condition array.slice(-n);
};
РЕДАКТИРОВАТЬ: !""
true
Кстати, даже возвращается, что тоже не совсем «очевидно», поэтому использование !
для проверки того, определено ли что-то или существует, действительно может вызвать проблемы и неожиданные результаты. Я бы не советовал этого делать, если вы действительно не знаете, что вы делаете и почему.
Комментарии:
1. «во-первых, вы не должны переназначать аргументы» Спасибо вам за это! Мне уже говорили об этом раньше, так что приятно услышать это снова — чтобы осознать это, и я мог быть более осведомленным и стратегически подходить к коду, который я использую(т. Е. самоконтроль), а не просто использовать код, с которым мне комфортно.