Есть ли бóльшая пустота чем undefined?

236
07 апреля 2018, 21:43

#delete #undefined #array #empty

Да, есть.

Думаю, всем известно, что для удаления элемента, в JS, используется undefined:

lеt variable = 'string'
variable = undefined

Им не часто пользуются, ведь в JS работает автоматический сборщик мусора, и мало кто заботится об удалении элементов. Ещё реже встречаются люди, которые знают о существовании метода delete, а тем более те, кто замечал различия в использовании undefined и delete.

let o = {
    A: 9,
    B: 9,
}
delete o['A']
console.log(
    Object.keys(o)//массив//["B"]//length: 1
);

Далее в моём вопросе, и следующем за ним ответе, будет рассмотрен частный, но очень важный, случай различия в использовании undefined и delete в контексте массивов.

Итак (барабанная дробь) внимание, вопрос…

В чём различия при удалении элемента массива методами undefined и delete и какие серьёзные и не очень последствия за этим следуют?

let arr = ['A','B','C','D','E','F']
delete arr[0]
arr[1] = undefined
arr[2] = void 0
Answer 1

Ещё реже встречаются люди, которые знают о существовании метода delete

delete - оператор, а не метод!

В чём различия при удалении элемента массива методами undefined и delete

Присвоение undefined и оператор delete не удаляют элемент массива. Они "удаляют"/устанавливают значение, содержащееся в массиве. Сам элемент массива, после такого "удаления" остается - он становится не определенным, но позволяет выполнять операции с ним (смысл термина элемент !== смыслу термина содержимое элемента. Хотя, безусловно, ==).
А различие в том, что присвоение undefined - это присвоение значения, со всеми вытекающими последствиями... тогда как delete, именно удаляет содержимое элемента.

Для удаления элементов массива, в JavaScript существует Array.splice(). Прямое назначение метода как раз в этом (и в добавлении элементов). А delete - предназначен для удаления свойств объектов.

Answer 2

Главное различие - что оператор delete удаляет элемент массива. Хоть при этом длинна массива не изменится и адресовать удалённый элемент вы по прежнему сможете. Но оператор in не обнаружит элемент удалённый таким способом:

let arr = ['A','B','C','D','E','F']
arr[2] = undefined
console.log(2 in arr)  // ===> true
delete arr[3]
console.log(3 in arr) // ===> false

Подробнее тут

READ ALSO
Как начать понимать спецификации JavaScript?

Как начать понимать спецификации JavaScript?

Проблема в том, что я изучаю Java Script по мануалам и статьям, самостоятельноИспользую пока его просто для того, чтобы сделать тривиальные задачи

259
Из GSAP в WEBGL

Из GSAP в WEBGL

Есть приложение в ангуляре, которое использует GSAP анимациюОно меняет svg с помощью timeline, а точнее, Есть один svg и внутри него много и они анимируются...

225
Ошибка JSON при запуске бота

Ошибка JSON при запуске бота

При запуске бота вылазит это

203
Ошибка с reCAPTCHA

Ошибка с reCAPTCHA

Из-за этой ошибки могут не работать другие js файлы?

197