近日用const
声明一个变量发现一个问题,如果声明的同时没有赋值,就会报错Missing initializer in const declaration
以下是分别以const、let、var声明显示的结果
const 方式声明
const a = null
const b
const c = 1
const d = '2'
const e = false
console.log('a ==', typeof a);
console.log('b ==', typeof b);
console.log('c ==', typeof c);
console.log('d ==', typeof d);
console.log('e ==', typeof e);
打印结果
let或var方式声明
使用let
或var
声明后没有报错,这是因为在 JavaScript 中,const
、var
和 let
是用来声明不同行为的变量的关键字。让我们分别看一下它们的行为:
const
使用 const
声明一个变量时,必须在声明的同时初始化这个变量。这是因为 const
声明的变量是一个常量,不允许改变其绑定的值。因此,如果你试图声明一个未初始化的 const
变量,将会导致一个语法错误。
const b; // SyntaxError: Missing initializer in const declaration
正确的做法是在声明时就给它一个初始值:
const b = 5; // 正确
var
使用 var
声明的变量具有函数作用域,并且会被提升(hoisted)。这意味着 var
声明的变量在声明之前就可以被访问,但它的值默认为 undefined
,直到你给它赋一个具体的值为止。
console.log(b); // 输出 undefined
var b = 5;
console.log(b); // 输出 5
这里,即使我们在 console.log(b)
之前还没有给 b
赋值,由于变量提升,b
已经被声明了,因此它的值默认为 undefined
。
let
使用 let
声明的变量同样具有块级作用域,并且也会被提升,但与 var
不同的是,let
声明的变量在声明之前的访问会导致一个引用错误(ReferenceError),因为它们处于暂时性死区(temporal dead zone, TDZ)。
console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 5;
但是,如果你只是声明了 let
变量而不初始化它,那么它会在声明之后默认为 undefined
,直到你给它赋值为止:
let b;
console.log(b); // 输出 undefined
b = 5;
console.log(b); // 输出 5
总结
const
需要在声明时初始化,并且不能重新赋值,未初始化会导致语法错误。var
可以声明时不初始化,默认值为undefined
,并在声明之前可访问。let
可以声明时不初始化,默认值为undefined
,但在声明之前访问会抛出引用错误。