You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何可靠判断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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 17:25:33