如何可靠判断JS对象是否包含指定预期字段外的其他属性
实现方案
核心逻辑是维护允许出现的字段白名单,遍历对象的自有可枚举属性做校验,只要存在任意一个不在白名单内的属性,就判定存在额外字段,完全避开字段缺省导致长度判断失效的问题。
实现代码
/** * 检测对象是否存在pageSize/pageStart/page三个分页字段之外的额外属性 * @param {Object} obj 待检测对象 * @returns {boolean} 存在额外属性返回true,不存在返回false */ function hasExtraPaginationProps(obj) { // 存储允许出现的字段白名单 const allowedProps = new Set(['pageSize', 'pageStart', 'page']); // 遍历对象所有自有可枚举属性 for (const key of Object.keys(obj)) { if (!allowedProps.has(key)) { // 发现白名单外的属性直接返回结果 return true; } } // 所有属性均在白名单内,无额外字段 return false; }
逻辑说明
- 用
Set存储白名单字段,属性查找时间复杂度为O(1),比数组includes的遍历查找效率更高 - 用
Object.keys()只会获取对象自身的可枚举属性,不会把原型链上继承的属性纳入校验范围,避免误判 - 不需要关心三个允许字段是否全部存在,只要出现白名单外的属性就立刻终止遍历返回结果,性能更好
测试示例
针对你给出的场景做校验:
// 示例对象,存在额外的userName字段 let testObj1 = { pageStart: 50, page: 2, userName: "Bobby" }; console.log(hasExtraPaginationProps(testObj1)); // 输出true // 缺省部分允许字段,无额外属性 let testObj2 = { page: 1, pageSize: 10 }; console.log(hasExtraPaginationProps(testObj2)); // 输出false // pageStart取值为0的合法场景 let testObj3 = { pageStart: 0, page: 1, pageSize: 10 }; console.log(hasExtraPaginationProps(testObj3)); // 输出false // 空对象场景 console.log(hasExtraPaginationProps({})); // 输出false
注意:如果你的业务场景需要校验对象上的不可枚举自有属性,可以把遍历逻辑里的
Object.keys(obj)替换为Object.getOwnPropertyNames(obj),常规前端业务场景下Object.keys已经可以覆盖绝大多数需求。
内容的提问来源于stack exchange,提问作者CourtneyJ
相关产品推荐
相关产品推荐

