使用枚举改进 JavaScript
枚举(Enums)是许多编程语言中常见的数据结构特性。虽然 JavaScript 原生没有此功能,但我们可以快速轻松地添加它们。
什么是枚举?
在我们深入代码并学习如何创建枚举之前,我们应该先讨论一下什么是枚举。我们先从数组开始。这个数组是 Web 应用中可能出现的错误类型的列表。
const errors = ['Data Error', 'Lunch Error', 'Mom Error'];
虽然数组允许我们存储以后可以使用的错误类型列表,但它确实要求开发人员记住名称以及它们在数组中出现的顺序。
console.log( errors[0] );
//if you remember that zero refers to 'DataError'
//then you get the right value.
枚举通过创建一个不可编辑的值列表来解决此问题,其中每个值都有一个字符串名称作为键。
因此,可以使用 JavaScript 对象更紧密地复制这一点。
const errors = {
DATAERROR: 'Data Error',
LUNCHERROR: 'Lunch Error',
MOMERROR: 'Mom Error'
}
使用对象,我们可以避免必须记住每个值的位置的问题。
console.log( errors['DATAERROR'] );
我们仍然存在这样的问题:任何键或值都可以被编辑或删除。
因此,枚举是运行时无法更改的键值对列表。
创建 JavaScript 枚举
既然对象比数组更适合复制枚举,那么我们需要解决只读问题。这就引出了Object.freeze
方法。
该Object.freeze
方法允许我们获取任何对象并更改每个属性的可配置和可写属性描述符,以便不能对键或值进行任何更改。
const errors = Object.freeze({
DATAERROR: 'Data Error',
LUNCHERROR: 'Lunch Error',
MOMERROR: 'Mom Error'
});
console.log( errors['LUNCHERROR'] );
//we can use either square bracket syntax
//or dot notation to access the values
console.log( errors.MOMERROR );
使用const
还将阻止任何新值被分配到errors
原始对象并替换原始对象。
枚举的应用
作为我们如何使用枚举的一个例子,我们可以想象一个简单的 Web 应用程序,它尝试按顺序执行一些异步任务,当其中任何一个任务失败时,它将抛出特定于该任务的错误。
Promise.resolve(123)
.then(async (id)=>{
let url = `https://example.com/users/${id}`;
let resp = await fetch(url)
if(!resp.ok) throw new Error(errors['DATAERROR']);
return 'burger';
})
.then(async (food) => {
let isGood = await enjoyAsyncLunch(food);
if(!isGood) throw new Error(errors['LUNCHERROR']);
return true;
})
.then((ready) => {
if( !askMomForPermission() ) throw new Error(errors.MOMERROR);
})
.catch((err)=> {
console.error(`Reason for failure is ${err.message}`);
});
创建枚举对象的一个额外好处是,现在大多数 IDE(如 VSCode)都能够使用代码完成来显示错误的可能值。
鏂囩珷鏉ユ簮锛�https://dev.to/prof3ssorst3v3/improving-your-javascript-with-enums-5ck4