Почему удаление global и удаление var приводят к различным выводам в Node?

1

Я зашел в узел в терминале и создал глобального пользователя с global.user = {admin: false}. Я также создал учетную запись var account = {balance: 1000}. Затем я набрал

delete user
=> true

delete account
=> false

Почему удаление чего-либо, созданного глобально, возвращает true, но удаление чего-либо, созданного с помощью var (которое из моего понимания также является глобальным) возвращает false?

Изображение 174551

  • 0
    оба возвращают истину в моем случае
  • 0
    я добавил изображение, чтобы вы знали, что я не ошибаюсь
Показать ещё 2 комментария
Теги:

4 ответа

2
Лучший ответ

Во-первых, delete - это удаление свойств объекта, а не удаление переменных. Из MDN:

Оператор удаления JavaScript удаляет свойство из объекта

И, в строгом режиме:

var, let и const создают неконфигурируемые свойства, которые нельзя удалить с помощью оператора delete. В строгом режиме это повысит значение SyntaxError.

Если вы просто попробуете это в node.js в строгом режиме:

var x = "hello";
delete x;

Ты получишь:

SyntaxError: Delete of an unqualified identifier in strict mode.

В нестрогом режиме delete возвращает false и ничего не делает и не будет генерировать исключение (для соображений обратной совместимости).


В node.js весь ваш код находится внутри функции модуля, поэтому все, что вы объявляете с помощью var, НЕ является глобальным. Это локальная переменная внутри функции модуля и локальные переменные, объявленные внутри функции, не могут быть удалены с delete поскольку это не функция, поддерживаемая Javascript. Что делает var - он создает локальную переменную в текущей области.

global.user = xxx присваивает свойство ранее существующему global объекту, который предопределен в глобальной области. Свойства global объекта (как и любые другие настраиваемые свойства объекта) можно удалить с помощью delete.

true или false возвращаемое значение из оператора delete сообщает вам, delete ли delete или нет.

  • 0
    но тогда в чем разница между локальной переменной и свойством объекта в этом контексте? Как вообще возможно иметь свойство глобального объекта, если в функции модуля происходит определение чего-либо?
  • 1
    @Dog - var account создает локальную переменную в текущей области видимости. global.user = xxx назначает свойство global объекту, которое предопределено в глобальной области видимости. Это очень разные вещи. delete можно использовать для удаления свойств из глобального объекта. Его нельзя использовать для удаления объектов из локальной области, поскольку это не функция, поддерживаемая Javascript.
Показать ещё 4 комментария
1

вы не удаляете свойство объекта account. но для случая пользователя он переходит к global объекту и удаляет из него user ключ. поэтому, если вы попытаетесь удалить неопределенную переменную, она будет показывать true.

> global.user = {1:2}
{ '1': 2 }
> delete user
true
> delete nice
true
> var account  = {3: 4}
undefined
> delete account 
false
> account
{ '3': 4 }
> global.user
undefined
> delete account['3']
true
> delete user
true
> nice = undefined
undefined
> delete nice
true
> 
1

Упоминается здесь:

Любое свойство, объявленное с помощью var, не может быть удалено из глобальной области или из области действия.

В случае отказа удалить операцию возвращает false.

1

Возвращаемое значение delete является true для всех случаев, за исключением случаев, когда свойство является собственным неконфигурируемым свойством, и в этом случае false возвращается в нестрогом режиме.

Также

Оператор delete удаляет заданное свойство из объекта. При успешном удалении оно вернет true, иначе будет возвращено false.

Любое свойство, объявленное с помощью var не может быть удалено из глобальной области видимости или из области действия функции и, следовательно, возвращает false

Проверьте документацию MDN на удаление

Ещё вопросы

Сообщество Overcoder
Наверх
Меню