面试官:JS判断对象为空有几种方法?

简介: 面试官:JS判断对象为空有几种方法?

640.jpg

1、ES6的 Object.keys()

Object.keys()是一个对象方法,该方法返回一个数组,包含指定对象自有的可枚举属性, 用此方法只需要判断返回的数组长度是否为0,为0就是空对象

let obj = {}
let arr = Object.keys(obj)
console.log(arr.length === 0)  // true

2、JSON.stringfy()

将Javascript对象转换为JSON字符串

let obj = {}
console.log(JSON.stringify(obj) === '{}') // true

这个也是最容易想到的,但是该方法有个缺点,那就是 JSON.stringify()只能序列化对象的可枚举的自有属性,即如果有属性是不可枚举或继承属性的话,结果也是true如:

let obj = {}
Object.defineProperty(obj, 'num', {  // 添加一个不可枚举属性
  value: 1,
  enumerable: false
})
console.log(JSON.stringify(obj) === '{}') // true
Object.prototype.sex = '女' // 原型上添加可枚举的属性
console.log(JSON.stringify(obj) === '{}') // true

3、Object.hasOwnPrototype()

Object.hasOwnPrototype()用来判断指定对象自身是否含有某个属性(非继承), 继承过来的属性会被过滤掉,自身的属性会返回的是true

  let a = {
    name: 'xiaoming',
    brother: undefined
  }
  Object.prototype.sex = '男'
  Object.defineProperty(a, 'sister', {
      value: 'xiaohong',
       enumerable: false
  })
  console.log(a.hasOwnProperty('name')) // true 自身属性
  console.log(a.hasOwnProperty('brother')) // true 
  console.log(a.hasOwnProperty('sex')) // false 原型链上继承的属性
  console.log(a.hasOwnProperty('sister')) // true 不可枚举属性

4、Object.getOwnPropertyNames()

获取到对象中的属性名,存到一个数组中,返回数组对象,我们可以通过判断数组的length来判断此对象是否为空

let obj = {}
console.log(Object.getOwnPropertyNames(obj).length === 0) // true

此外,不可没枚举的也可以检测出来

Object.defineProperty(obj, 'sister', {
    value: 'xiaohong',
     enumerable: false
})
console.log(Object.getOwnPropertyNames(obj).length === 0) // false

5、for..in 循环

let obj = {}
function empty () {
  for (let key in obj) {
    console.log(false, '该对象不是空对象')
    return false
  }
  console.log(true, '该对象是空对象')
  return true
}

扩展:如果只考虑对象自身的属性,而不是继承来的,可以用Object.getOwnPropertyNames() 或 Object.hasOwnProperty() 来进行过滤

function empty () {
  for (let key in obj) {
    console.log(false, '该对象不是空对象')
    if (Object.getOwnPropertyNames().length === 0) return false
  }
  console.log(true, '该对象是空对象')
  return true
}

往期:

面试官:判断数组的方式有哪些

一文解析 Pinia 和 Vuex ,带你全面理解这两个 Vue 状态管理模式

20 个 JS 工具函数助力高效开发

相关文章
|
4月前
|
监控 负载均衡 JavaScript
有哪些有效的方法可以优化Node.js应用的性能?
有哪些有效的方法可以优化Node.js应用的性能?
292 69
|
3月前
|
JavaScript Linux 内存技术
Debian 11系统下Node.js版本更新方法详解
本指南详细介绍在Linux系统中安装和管理Node.js的步骤。首先检查现有环境,包括查看当前版本和清除旧版本;接着通过NodeSource仓库安装最新版Node.js并验证安装结果。推荐使用nvm(Node Version Manager)进行多版本管理,便于切换和设置默认版本。同时,提供常见问题解决方法,如权限错误处理和全局模块迁移方案,以及版本回滚操作,确保用户能够灵活应对不同需求。
285 0
|
3月前
|
JavaScript Linux 内存技术
Debian 11系统下Node.js版本更新方法
Debian 11更新Node.js主要就是这三种方式,无论你是初涉其中的新手还是找寻挑战的专家,总有一种方式能满足你的需求。现在,你已经是这个
311 80
|
3月前
|
人工智能 前端开发 Java
Java 面试资料中相关代码使用方法与组件封装方法解析
这是一份详尽的Java面试资料代码指南,涵盖使用方法与组件封装技巧。内容包括环境准备(JDK 8+、Maven/Gradle)、核心类示例(问题管理、学习进度跟踪)、Web应用部署(Spring Boot、前端框架)、单元测试及API封装。通过问题库管理、数据访问组件、学习进度服务和REST接口等模块化设计,帮助开发者高效组织与复用功能,同时支持扩展如用户认证、AI推荐等功能。适用于Java核心技术学习与面试备考,提升编程与设计能力。资源链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
103 6
Java 面试资料中相关代码使用方法与组件封装方法解析
|
5月前
|
编解码 JavaScript 前端开发
【Java进阶】详解JavaScript的BOM(浏览器对象模型)
总的来说,BOM提供了一种方式来与浏览器进行交互。通过BOM,你可以操作窗口、获取URL、操作历史、访问HTML文档、获取浏览器信息和屏幕信息等。虽然BOM并没有正式的标准,但大多数现代浏览器都实现了相似的功能,因此,你可以放心地在你的JavaScript代码中使用BOM。
161 23
|
10月前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
214 1
|
7月前
|
前端开发 JavaScript
有没有方法可以保证在JavaScript中多个异步操作的执行顺序?
有没有方法可以保证在JavaScript中多个异步操作的执行顺序?
297 58
|
5月前
|
人工智能 算法 数据库
美团面试:LLM大模型存在哪些问题?RAG 优化有哪些方法?_
美团面试:LLM大模型存在哪些问题?RAG 优化有哪些方法?_
|
5月前
|
JavaScript 前端开发 Java
js 垃圾回收机制的方法
JS回收机制方法讲解
|
7月前
|
自然语言处理 JavaScript 前端开发
当面试官再问我JS闭包时,我能答出来的都在这里了。
闭包(Closure)是前端面试中的高频考点,广泛应用于函数式编程中。它不仅指函数内部定义的函数,还涉及内存管理、作用域链和垃圾回收机制。闭包可以让函数访问其外部作用域的变量,但也可能引发内存泄漏等问题。通过合理使用闭包,可以实现模块化、高阶函数和回调函数等应用场景。然而,滥用闭包可能导致代码复杂度增加、调试困难以及潜在的性能问题。为了避免这些问题,开发时应谨慎处理闭包,避免不必要的嵌套,并及时清理不再使用的变量和监听器。
303 16
当面试官再问我JS闭包时,我能答出来的都在这里了。