nikolayshabalin
@nikolayshabalin
Автор профессиональных курсов в HTML Academy

Почему при передаче значений null, undefined и NaN в метод массива slice() поведение разное и почему оно такое?

Привет.
Интересует именно почему Javascript ведёт себя именно так.

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

Что стоит знать:
  • Метод slice принимает в любой из параметров число. Если приходит не число, то JS старается преобразовать к числу. Это легко доказать. Стоит только передать boolean -array.slice(false, true);
  • Значениями по-умолчанию первого параметра равно 0, а второго array.length - 1


Суть.
Давай передадим в slice - undefined.
По Флэнэгану undefined при приведение к числу превращается в NaN. Для дальнейшего расследования это важно.

const array = [1, 2, 3, 4, 5];
let newArray = array.slice(undefined); // [1, 2, 3, 4, 5]
let newArray = array.slice(undefined, undefined); // [1, 2, 3, 4, 5]
let newArray = array.slice(undefined, 2); // [1, 2]
let newArray = array.slice(2, undefined); // [3, 4, 5]


Кажется, что slice не понимает, что происходит и вместо undefined ставит значение по-умолчанию и такая работа ясна.

Теперь заполним slice - NaN
Ожидается, что будет работать как undefined
NaN при приведение к числу, собственно, NaN

const array = [1, 2, 3, 4, 5];
let newArray = array.slice(NaN); //[1, 2, 3, 4, 5]
let newArray = array.slice(NaN, NaN); //[]
let newArray = array.slice(2, NaN); // []
let newArray = array.slice(NaN, 2); // [1, 2]


А здесь складывается ощущение, что NaN это 0

Null и NaN работает одинаково. Собственно вопрос, почему именно так?
  • Вопрос задан
  • 304 просмотра
Решения вопроса 1
rockon404
@rockon404
Frontend Developer
Вы все неправильно поняли. Обращайтесь в такие моменты к спецификациям.
1. Если вы передаете NaN, нативная функция ToNumber возвращает NaN, затем ToInteger заменяет значение на +0.
2. Если вы передаете null, ToNumber заменяет его на +0.
3. Если передаете undefined первым аргументом, его сначала ToNumber заменяет на NaN, затем ToInteger на +0.
4. Если вы передаете undefined вторым аргументом, алгоритм использует вместо него длину массива.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы