一文搞懂 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()
来检测对象类型,它是一个通用的方法,主要用来精准地检测一个引用数据类型具体是什么类型。让我解释一下它的原理:
Object.prototype.toString
是 JavaScript 中的一个方法,它返回一个表示对象的字符串,例如"[object Array]"
表示数组对象。call()
方法允许您在特定的上下文中调用一个函数。在这种情况下,call(arr)
将会在arr
对象上调用Object.prototype.toString
方法,然后返回表示对象类型的字符串。- 在 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
系列方法:
Object.getOwnPropertyNames(obj)
: 返回一个数组,包含对象自身的所有**可枚举和不可枚举(enumerable)**属性名称。Object.getOwnPropertySymbols(obj)
: 返回一个数组,包含对象自身的所有符号类型的(symbol 定义的属性,即内置 Symbols)属性键。Object.getOwnPropertyDescriptors(obj)
: 返回一个对象,其中包含对象自身的所有属性描述符。每个属性的名称对应属性的键,属性的值是该属性的描述符对象。属性描述符对象包含有关属性的各种信息,例如是否可写、是否可枚举、是否可配置等。(我们不配置的时候是有默认值的)
示例:
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
if (JSON.stringify(res.data) == "{}") {
console.log("res.data为{}");
}
2.使用 Object.keys()
或 Object.getOwnPropertyNames()
这两个方法返回对象自身的属性数组。如果数组的长度为 0,那么对象就是空对象。
本质上来说 getOwnPropertyNames 更加准确,因为它包含了可枚举和不可枚举两种属性!
function isEmptyObject(obj) {
return Object.keys(obj).length === 0;
}
var obj = {};
console.log(isEmptyObject(obj)); // 输出 true
或者:
function isEmptyObject(obj) {
return Object.getOwnPropertyNames(obj).length === 0;
}
var obj = {};
console.log(isEmptyObject(obj)); // 输出 true
注意:使用 for…in 来遍历对象判断是否为{},这个方案是不妥的,因为会遍历原型链,不能保证是否是空对象!