Я зашел в узел в терминале и создал глобального пользователя с global.user = {admin: false}. Я также создал учетную запись var account = {balance: 1000}. Затем я набрал
delete user
=> true
delete account
=> false
Почему удаление чего-либо, созданного глобально, возвращает true, но удаление чего-либо, созданного с помощью var (которое из моего понимания также является глобальным) возвращает false?
Во-первых, 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
или нет.
var account
создает локальную переменную в текущей области видимости. global.user = xxx
назначает свойство global
объекту, которое предопределено в глобальной области видимости. Это очень разные вещи. delete
можно использовать для удаления свойств из глобального объекта. Его нельзя использовать для удаления объектов из локальной области, поскольку это не функция, поддерживаемая Javascript.
вы не удаляете свойство объекта 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
>
Упоминается здесь:
Любое свойство, объявленное с помощью var, не может быть удалено из глобальной области или из области действия.
В случае отказа удалить операцию возвращает false.
Возвращаемое значение delete является true для всех случаев, за исключением случаев, когда свойство является собственным неконфигурируемым свойством, и в этом случае false возвращается в нестрогом режиме.
Также
Оператор delete удаляет заданное свойство из объекта. При успешном удалении оно вернет true, иначе будет возвращено false.
Любое свойство, объявленное с помощью var
не может быть удалено из глобальной области видимости или из области действия функции и, следовательно, возвращает false
Проверьте документацию MDN на удаление