不用const,如何声明一个常量?

77 阅读4分钟

在编程的世界里,JavaScript(简称JS)如同一位随时代变迁而愈发成熟的智者,尤其在2015年迎来了一次里程碑式的飞跃——ECMAScript 2015(ES6)的发布。这次更新不仅仅是语言语法上的优化,更是编程理念和实践方式的一场革命,深刻影响了我们如何定义变量与常量,以及如何更优雅地组织和管理代码。本文将带您穿越这场变革的时空隧道,从基础概念到实战技巧,一探究竟。

JavaScript的2015年:ES6的分水岭

想象一下,如果时间回到2015年之前,JS开发者们在变量声明时几乎只有var这一把钥匙。然而,var的宽松规则,如变量提升(hoisting)和函数作用域而非块作用域,常使得代码变得难以理解和调试。比如,下面的代码可能会让你皱眉:

if (true) {
    var message = "Hello, world!";
}
console.log(message); // 输出 "Hello, world!"

即使message变量在逻辑块内声明,它依然可以在外部访问到,这就是变量提升带来的副作用。

ES6:常量登场,大写的约定

随着ES6的降临,letconst这对新伙伴横空出世,为变量声明带来了一场革命。特别是const,它的出现标志着JavaScript对常量管理的正式支持。常量,顾名思义,就是程序运行过程中其值不能改变的量。在编码实践中,通常将常量名称全部大写,以示区别,这是一种广为接受的编程习惯,比如:

var PI = 3.1415926;

这样的命名约定,让阅读代码的人一眼就能识别出哪些是不应该被修改的值。

挥别var,拥抱严格模式

ES6鼓励开发者减少使用var,转而采用letconst。但更重要的是,它引入了“严格模式”(strict mode),只需在文件或函数顶部加上"use strict";,严格模式下,JS引擎会对代码进行更严格的检查,禁止了一些不安全或容易引起误解的语法,比如未声明变量前就直接使用。这有助于避免潜在错误,提升代码质量,同时避免了直接声明变量而不使用var时,默认将其挂载到全局对象上的问题,减少了全局变量污染的风险。

常量的高级玩法:Object.definePropertyObject.freeze

在处理更复杂的场景时,如何确保对象的属性也不可更改呢?这时,Object.defineProperty就派上了用场。通过它,我们可以精确控制对象属性的行为,例如将其设置为不可写:

var myObj = {

}
Object.defineProperty(myObj,'PI',{
    value: 3.1415926,
    writable:true,  //  true 可改; false 不可改
    configurable:true, 
    enumerable:true,
})
myObj.PI = 2 
console.log(myObj.PI); // 3.1415926

MDN文档Object.freeze()的轻松之路

提到学习JavaScript,MDN(Mozilla Developer Network)文档是每位开发者绕不开的知识宝库。在MDN的建议中,对于想要快速创建不可变对象的需求,Object.freeze()无疑是一个简便且高效的选择。相比Object.defineProperty需要逐一定义每个属性的行为,对于复合类型的常量(如对象和数组),仅仅使用Object.defineProperty来控制属性的可写性并不能阻止其内部元素的修改。于是,Object.freeze应运而生,Object.freeze()一步到位,大大简化了操作流,它能够“冻结”一个对象,使其所有属性(包括子属性)都变为不可修改:

const obj = {
    prop: 42,
  };
  Object.freeze(obj);
  obj.prop = 33;
  console.log(obj.prop); // 42 这里将不会被修改

面试准备:深入理解与实战技巧

在准备大厂面试时,关于常量的考察远不止于此。面试官可能会进一步探索你对以下领域的理解:

  • 深拷贝与浅拷贝:在处理对象常量的复制时,深拷贝与浅拷贝的区别及应用尤为重要,以避免通过引用修改原对象。
  • 模块化与命名空间:在大型项目中,如何通过ES6模块系统或工具(如Webpack)有效管理常量,避免命名冲突。
  • 性能考量:虽然constObject.freeze提升了代码的安全性,但在特定场景下,频繁使用可能对性能产生影响,理解其背后机制是关键。
  • 设计模式结合:常量在设计模式中的应用,如单例模式中的配置常量、工厂模式中的默认参数设定等,展现你的代码设计思维。

结语

JavaScript的进化史,是技术进步与社区智慧的结晶。从ES6开始,常量的定义与管理迈入了新的阶段,这不仅仅是语法糖的增加,更是对代码质量和可维护性的一次全面升级。掌握这些核心概念和最佳实践,不仅能够帮助你在大厂面试中游刃有余,更重要的是,在日常开发中编写出更加健壮、易于维护的代码。