在Node.js REPL中进行编码时,我不小心使用了symbol
关键字声明了一个新的new
,并且由于Symbol()
不是构造函数,如本摘要所示,我遇到了一个错误,
let sym = new Symbol("some description");
// TypeError: Symbol is not a constructor
// at new Symbol (<anonymous>)
所以我认为这很好,我会以正确的方式进行操作,但是又出现了另一个错误。
let sym = Symbol("some description");
// SyntaxError: Identifier 'sym' has already been declared
这对我来说很奇怪,因为我期望自从声明导致错误以来,该变量根本没有定义,但是现在我似乎已经定义了它。我的下一个猜测是,它可能有一个undefined
值,所以我尝试到达此变量并查看其拥有什么值。
console.log(sym);
// ReferenceError: sym is not defined
什么?那么变量sym
是否已定义和未定义?
我什至尝试使用对象的块作用域,以便可以使用Object.prototype.hasOwnProperty()
函数检查变量是否确实存在于对象中,但不幸的是,出现了相同的问题,整个对象变得不确定,并且无法访问。
let obj = {
a: 4,
b: new Symbol("some description"),
};
// TypeError
console.log(obj);
// ReferenceError
let obj = {};
// Syntax Error
我发现,如果我使用var
声明,这个问题可能会消失,因此我认为它与我不知道的块作用域有关。
关于这个问题,我有3个问题:
变量sym
在哪里定义,未定义在哪里?这个案子与“临时死区”的想法有什么联系?
sym
拥有什么价值?
如何为sym
变量分配新值?
此问题是特定于此情况的,还是任何错误的let / const声明都会导致相同的问题?