Переменные, объявленные с const
или let
, не назначаются глобальному объекту, поэтому ваш
const fooBar = 3;
не отображается, когда вы делаете
Object.getOwnPropertyDescriptor(this,'fooBar').configurable
Глобальные объекты присваиваются только переменным, объявленным с var
(или никогда не объявляемым вообще, только назначенным, например, с foo
).
delete
будет возврат :
true для всех случаев, кроме случаев, когда свойство является собственным ненастраиваемым свойством, и в этом случае возвращается false в нестрогом режиме.
window.foo
, не объявленный с var
, let
или const
, , является настраиваемым свойством. window.bar
, объявленное с помощью var bar
, присваивается window
как ненастраиваемое свойство.
delete fooBar
возвращает false
, потому что fooBar
, хотя фактически не является свойством window
, является автономным идентификатором, который не может быть удален - delete
приведет к false
всякий раз, когда используется delete
подобным образом выкинул бы ошибку в строгом режиме:
'use strict';
const someVar = true;
delete someVar;
Но noexist
не является идентификатором в вашем коде, поэтому нет никакой операции, чтобы даже пытаться выполнить, поэтому он возвращает true
(и в строгом режиме не будет выдано никакой ошибки).