Skip to content

一文搞懂 js 判断引用数据类型的方法

1.怎么精准判断一个引用数据类型(比如 Array)

注意:没有 JSON.stringify 方法,因为这个只是针对于空的数组或者对象

1.instanceof 方法

arr instanceof Array;

2.构造函数 constructor

用 a.constructor 获取实例的构造函数,实例的构造函数 constructor 指向构造函数 arr.constructor === Array;

需要注意的是,使用typeof操作符只能判断原始类型和函数,使用instanceof操作符和constructor属性可以判断对象是否是特定类的实例。当使用instanceof操作符和constructor属性时,需要确保对象的原型链上没有其他对象的构造函数等于目标类型,否则可能导致判断错误。

3.通用的方法 toString

Object.prototype.toString.call(a) === '[object Array]'; (函数对象有 prototype)

Object.prototype.toString.call(a) 方法详解

Object.prototype.toString.call() 来检测对象类型,它是一个通用的方法,主要用来精准地检测一个引用数据类型具体是什么类型。让我解释一下它的原理:

  1. Object.prototype.toString 是 JavaScript 中的一个方法,它返回一个表示对象的字符串,例如 "[object Array]" 表示数组对象。
  2. call() 方法允许您在特定的上下文中调用一个函数。在这种情况下,call(arr) 将会在 arr 对象上调用 Object.prototype.toString 方法,然后返回表示对象类型的字符串。
  3. 在 JavaScript 中,各种内置对象都有一个 toString 方法。当您使用 Object.prototype.toString.call() 时,它会调用该对象的原型链上的 toString 方法。

数组:'[object Array]'

对象:'[object Object]'

4.数组自身的方法 isArray ——> 只对数组有用

Array.isArray(arr);

5.查看原型对象 getPrototypeOf

Object.getPrototypeOf(arr) === Array.prototype 或者 arr.__proto__=== Array.prototype

2.Object.getOwnProperty 系列方法

我在面试的时候答错了,把 Object.getPrototypeOf(arr)答成了:Object.getOwnProperty,实际上并没有这个 api,而是有这个系列的 api!没有专门叫这个名字的 api。

在 JavaScript 中,Object.getOwnProperty 系列方法用于获取对象的属性描述符,以及对象自身的属性名称(不包括继承来的属性)

以下是 Object.getOwnProperty 系列方法:

  1. Object.getOwnPropertyNames(obj): 返回一个数组,包含对象自身的所有**可枚举和不可枚举(enumerable)**属性名称。

  2. Object.getOwnPropertySymbols(obj): 返回一个数组,包含对象自身的所有符号类型的(symbol 定义的属性,即内置 Symbols)属性键。

  3. Object.getOwnPropertyDescriptors(obj): 返回一个对象,其中包含对象自身的所有属性描述符。每个属性的名称对应属性的键,属性的值是该属性的描述符对象。

    属性描述符对象包含有关属性的各种信息,例如是否可写、是否可枚举、是否可配置等。(我们不配置的时候是有默认值的)

示例:

js
const obj = {
  name: "John",
  age: 30,
};

// 获取对象自身的所有属性名称(不包括继承来的属性)
const propertyNames = Object.getOwnPropertyNames(obj);
console.log(propertyNames); // 输出:["name", "age"]

// 获取对象自身的所有符号类型的属性键
const symbols = Object.getOwnPropertySymbols(obj);
console.log(symbols); // 输出:[]

// 获取对象自身的所有属性描述符
const propertyDescriptors = Object.getOwnPropertyDescriptors(obj);
console.log(propertyDescriptors);
// 输出:
// {
//   name: { value: 'John', writable: true, enumerable: true, configurable: true }, //非常详细的信息
//   age: { value: 30, writable: true, enumerable: true, configurable: true }
// }

Object.getOwnPropertyNames() 返回对象自身的所有属性名称,包括可枚举和不可枚举的属性,但不包括符号类型的属性键。 Object.getOwnPropertySymbols() 返回对象自身的所有符号类型的属性键,不包括其他类型的属性键。Object.getOwnPropertyDescriptors() 返回一个对象,包含对象自身的所有属性描述符。每个属性描述符对象包含值、可写性、可枚举性和可配置性等属性。

2.JS 判断对象是否为空对象{}

1.JSON.stringify

js
if (JSON.stringify(res.data) == "{}") {
  console.log("res.data为{}");
}

2.使用 Object.keys()Object.getOwnPropertyNames()

这两个方法返回对象自身的属性数组。如果数组的长度为 0,那么对象就是空对象。

本质上来说 getOwnPropertyNames 更加准确,因为它包含了可枚举和不可枚举两种属性!

js
function isEmptyObject(obj) {
  return Object.keys(obj).length === 0;
}

var obj = {};
console.log(isEmptyObject(obj)); // 输出 true

或者:

js
function isEmptyObject(obj) {
  return Object.getOwnPropertyNames(obj).length === 0;
}

var obj = {};
console.log(isEmptyObject(obj)); // 输出 true

注意:使用 for…in 来遍历对象判断是否为{},这个方案是不妥的,因为会遍历原型链,不能保证是否是空对象!