以史为鉴,可以知兴替--走进大厂面试的小细节,es6前的版本,常量
前言
let和const这两个关键字,是在es6中被引入的。这一版本目的在对语言的大量改进和扩展。let用于声明具有块级作用域的变量,而const则声明只读的常量,在初始化后就不能被重新分配。这些特性改善了变量的作用域的管理,让JavaScript的编程更加灵活和安全。
那么在早期版本的JS语言中,如何定义一个常量呢?
一个问题
如果给你这么一段代码,你该如何优化?
var pi = 3.1415926
啊?,这还不简单,pi是常量,应该将var
改为const
,让它的值不能被改变。
这个回答非常正确,但是只能拿到90分,在早期JS的版本中,没有let
和const
关键字,所以,在定义常量时,往往会将常量的名字大写,这就是在当时的编程习惯 var PI = 3.1415926
这便是es6前常量声明的一种方式。
所以我们现在将上述代码优化,将常量定义为 const PI = 3.1415926
,如果你现在就是这么干的话,保持下去,这是一个良好的编程习惯。
还有什么办法呢?
嗯?还有方法?!——没错,还有!
使用var PI = 3.1415926
毕竟是当时“约定俗成”的方法,在执行引擎看来,它还是能够被修改的,我们来看这样一段代码,它在没有const关键字的es6前版本中,真正实现了定义常量。
var myObj = {
// PI : 3.1415926
}
Object.defineProperty(myObj,'PI',{
value:3.1415926,
writable:false, //可修改
configurable:true //可配置
})
myObj.PI = 2
console.log(myObj.PI)
定义一个对象myObject,调用对象的defineProperty()方法,传入一个对象,对象属性名称,一个描述符对象(定义了属性的各种特性),然后将value,用键值对的方式,赋值为3.1415926,将writable的值为false,这样我们用对象.属性名的方式访问,而且这个属性的value是不可修改的。
常量作为对象的属性来使用,
Object.defineProperty
来定义不可改变。
在MDN官方文档中,还有这样一个方法Object.freeze()
,实现起来更加简单、轻松。
解决问题
现在,给你这么一段代码,你该如何优化?
var pi = 3.1415926
可以将var改为const,声明一个不可改变值的常量,值为3.1415926,将它的常量名改为大写,符合编程习惯。哦,对了,将它作为对象的属性来使用,
Object.defineProperty
来定义不可改变。这或许是一个作为面试开胃前菜的满意回答。
总结
es6版本,用let
和const
来弥补类var
的不足,解决了变量提升的问题,引入了块级作用域,并且增强了代码的可读性和意图的表达,减少了意外的全局变量。但是并没有删除var这个关键字,我想,这就是我们了解历史的意义,对照早期的版本不足,逐渐完善。学习这个过程也是如此,每天借鉴昨天的不足,改正错误,慢慢进步。
今天的小细节分享到这,下期不见面不散。
转载自:https://juejin.cn/post/7374256269995753526