likes
comments
collection
share

以史为鉴,可以知兴替--走进大厂面试的小细节,es6前的版本,常量

作者站长头像
站长
· 阅读数 62

前言

let和const这两个关键字,是在es6中被引入的。这一版本目的在对语言的大量改进和扩展。let用于声明具有块级作用域的变量,而const则声明只读的常量,在初始化后就不能被重新分配。这些特性改善了变量的作用域的管理,让JavaScript的编程更加灵活和安全。

那么在早期版本的JS语言中,如何定义一个常量呢?

一个问题

如果给你这么一段代码,你该如何优化?

var pi = 3.1415926

啊?,这还不简单,pi是常量,应该将var改为const,让它的值不能被改变。

这个回答非常正确,但是只能拿到90分,在早期JS的版本中,没有letconst关键字,所以,在定义常量时,往往会将常量的名字大写,这就是在当时的编程习惯 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是不可修改的。

以史为鉴,可以知兴替--走进大厂面试的小细节,es6前的版本,常量 常量作为对象的属性来使用,Object.defineProperty 来定义不可改变。 在MDN官方文档中,还有这样一个方法Object.freeze(),实现起来更加简单、轻松。

以史为鉴,可以知兴替--走进大厂面试的小细节,es6前的版本,常量

解决问题

现在,给你这么一段代码,你该如何优化?

var pi = 3.1415926

可以将var改为const,声明一个不可改变值的常量,值为3.1415926,将它的常量名改为大写,符合编程习惯。哦,对了,将它作为对象的属性来使用,Object.defineProperty 来定义不可改变。这或许是一个作为面试开胃前菜的满意回答。

总结

es6版本,用letconst来弥补类var的不足,解决了变量提升的问题,引入了块级作用域,并且增强了代码的可读性和意图的表达,减少了意外的全局变量。但是并没有删除var这个关键字,我想,这就是我们了解历史的意义,对照早期的版本不足,逐渐完善。学习这个过程也是如此,每天借鉴昨天的不足,改正错误,慢慢进步。

今天的小细节分享到这,下期不见面不散。

转载自:https://juejin.cn/post/7374256269995753526
评论
请登录