ES6中let和const的核心特性与对象冻结详解

作者:异步漫步

时间:2026-10-22

浏览:420

本文详解ES6中let和const的声明特性,包括消除变量提升、块级作用域及暂时性死区。重点解析const对内存地址的锁定机制,并提供递归冻结对象的完整代码示例,帮助开发者深入理解常量与只读对象的实际应用。

文章目录

ES6变量声明背景

在JavaScript开发中,传统上使用var关键字来声明变量。由于JavaScript采用函数级作用域机制,函数内部可以访问外部定义的变量,但函数外部无法访问函数内部定义的变量。接下来将深入介绍ES6标准引入的let和const关键字的具体行为与特性。

let关键字特性

let关键字具备以下核心特性:

1.不存在变量提升现象:即声明前使用,报ReferenceError。适用于for循环计数器。 2.暂时性死区:即在块级作用域内使用let声明变量,该变量只能在该作用域内使用。 3.不允许重复声明:let声明过的变量不能再次声明,否则报错。

const关键字特性

const关键字的特性与let类似,但增加了常量约束:

第一,const同样不存在变量提升现象。第二,const也受暂时性死区规则约束。第三,const不允许对同一变量进行重复声明。第四,const用于声明只读常量,要求在声明时必须进行初始化赋值。第五,const本质上是锁定了变量所指向的内存地址。对于基本数据类型,值直接存储在该地址中;对于复合类型(如对象),该地址存储的是一个指向对象的指针。虽然指针本身不可改变,即不能指向其他对象,但指针所指向的对象内部属性是可以修改的。

对象冻结代码示例


 cost foo = {}; 
 // 可以改变foo的属性
 foo.prop = 123;
 foo.prop //123 
 // 不可以使foo指向别的对象
 foo = {}; //TypeError: "foo" is read-only

彻底冻结对象实现

为了演示对象冻结机制,请参考以下代码示例:


// 彻底冻结
var constantize = (obj) => {

  Object.freeze(obj); 

  Object.keys(obj).forEach( (key, i) => {

    if( typeof obj[key] === 'object' ){

     constantize( obj[key] );

    } 
  }); 
}   

通过上述代码可以看到,使用Object.freeze可以彻底冻结对象及其嵌套属性,实现真正的常量保护。

综上所述,本文详细解析了ES6中let和const的关键特性,包括变量提升、作用域限制及常量冻结机制。希望这些内容能帮助开发者更好地掌握现代JavaScript的变量声明规范。如有任何疑问,欢迎留言交流,我们将及时回复。感谢大家对本站的支持!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章