语句和申明✅
let const var 区别
答案
特性/区别 | var | let | const |
---|---|---|---|
作用域 | 函数作用域 | 块级作用域 | 块级作用域 |
变量提升 | 有,声明提升但不会初始化 | 无,必须先声明后使用 | 无,必须先声明后使用 |
暂时性死区(TDZ) | 无 | 有 | 有 |
是否允许重复声明 | 允许 | 不允许 | 不允许 |
是否必须初始化 | 否 | 否 | 是,声明时必须赋值 |
是否可修改 | 可以 | 可以 | 不可重新赋值(但对象属性可变) |
是否绑定到全局对象 | 是(全局var变量为window属性) | 否 | 否 |
变量泄露 | 循环变量可能泄露为全局变量 | 不会 | 不会 |
核心总结:
let
和const
不存在变量提升,存在暂时性死区,不能重复声明。const
声明常量,声明时必须初始化,且不可重新赋值,但对象属性可变。var
声明的变量会绑定到全局对象(如 window),let
和const
不会。- 作用域采用词法作用域,
let
/const
为块级,var
为函数级。
示例说明
变量提升
答案
变量提升(Hoisting)是 JavaScript 中的一个重要概念,指的是变量和函数声明会在代码执行前被“提升”到当前作用域的顶部。这意味着你可以在声明之前访问变量或调用函数,但行为会因声明方式不同而异。JavaScript 在执行代码前,会先进行“预解析”阶段,把所有的变量声明(var
)和函数声明提升到作用域顶部。这是因为 JS 采用了先解析后执行的机制,保证变量和函数在整个作用域内都可用。
var
声明的变量:只提升声明,不提升赋值。访问时值为undefined
。let
和const
声明的变量:不会被提升(实际上会被提升但不会初始化),在声明前访问会报错(暂时性死区)。- 函数声明:整个函数会被提升,可以在声明前调用。
- 函数表达式:如果用
var
声明,只提升变量名,不能提前调用。
console.log(a) // undefined
var a = 10
foo() // 输出 'hello'
function foo () {
console.log('hello')
}
console.log(b) // ReferenceError
const b = 20
- 避免在声明前访问变量,尤其是
let
和const
,否则会报错。 - 推荐先声明再使用,代码更清晰、可维护。
- 理解提升机制有助于避免“意外的 undefined”或报错。
变量提升是 JS 预解析的结果,理解它有助于写出更健壮的代码。建议优先使用 let
和 const
,减少因提升带来的困惑。
for...of
、for...in
、for
循环的区别简表
答案
循环类型 | 适用对象 | 遍历内容 | 是否保证顺序 | 常见用途 |
---|---|---|---|---|
for | 数组、类数组等 | 索引(可取值) | 是 | 固定次数、数组遍历 |
for...in | 对象、数组 | 可枚举属性名 | 否 | 对象属性遍历 |
for...of | 可迭代对象 | 元素值 | 是 | 数组、Set、Map等 |
for...of
适合遍历数组、字符串、Set、Map等可迭代对象的元素值。for...in
适合遍历对象的可枚举属性(包括原型链上的)。for
适合需要手动控制循环次数或按索引遍历数组的场景。