在 JavaScript 中,变量声明和变量赋值是两个不同的步骤。var 声明的变量会被提升(hoisting),但不会被赋值。让我们分析以下代码:
console.log(typeof a); // 输出什么?
var a;
变量提升
在 JavaScript 中,变量声明会被提升到其作用域的顶部,但变量赋值不会被提升。因此,上述代码在执行时会被解释为:
var a;
console.log(typeof a); // 输出什么?
typeof 操作符
typeof 操作符用于返回一个变量或表达式的类型。在变量 a 被声明但未赋值时,它的值是 undefined。
结果
因此,console.log(typeof a); 会输出 undefined,因为在执行 typeof a 时,变量 a 已经被声明,但尚未赋值。
完整代码如下:
console.log(typeof a); // 输出: "undefined"
var a;
总结:在变量声明但未赋值之前,使用 typeof 操作符会返回 undefined。
在 JavaScript 中,let 和 var 的行为有所不同,特别是在变量提升(hoisting)方面。让我们分析以下代码:
console.log(typeof a); // 输出什么?
let a;
变量提升与暂时性死区(Temporal Dead Zone)
与 var 不同,let 声明的变量不会被提升到其作用域的顶部。相反,它们在声明之前是不可访问的,这段时间被称为暂时性死区(TDZ)。
typeof 操作符
typeof 操作符用于返回一个变量或表达式的类型。然而,当使用 let 声明的变量在暂时性死区内被访问时,会抛出 ReferenceError。
结果
因此,console.log(typeof a); 会抛出 ReferenceError,因为在执行 typeof a 时,变量 a 还处于暂时性死区内。
完整代码如下:
console.log(typeof a); // 抛出 ReferenceError: Cannot access 'a' before initialization
let a;
总结:在使用 let 声明的变量之前访问它们会导致 ReferenceError,即使是使用 typeof 操作符。