Por lo general, uso esta condición para verificar si un valor de datos es Objeto o no:
// function A export const isObject = item => { return item && item.constructor === Object; }; ya que es más fácil de entender, pero mi amigo generalmente usa esta función para verificar datos con la misma condición que la anterior isObject(value) {} :
// function B export function isObject(value) { return typeof value === "object" && !Array.isArray(value) && value !== null; } nos confundimos cuando hay un conflicto cuando queremos fusionarnos con la última rama, así que aquí está la pregunta, Between function A & B which one is better to cover most case regarding object data? , ¿Puedes explicarlo también para que tenga un mejor conocimiento al respecto?
Suponiendo que desea identificar objetos simples que heredan de Object.prototype y no son subclases de otra cosa:
El primer enfoque podría ser engañado porque la propiedad .constructor no se refiere necesariamente a la función constructora utilizada para crear la función: un objeto podría asignar otra cosa a esa propiedad.
const isObject = item => { return item && item.constructor === Object; }; const a = []; console.log(a.constructor == Array); a.constructor = Object; console.log(a.constructor === Object); console.log(isObject(a)); El segundo enfoque podría ser engañado porque hay otros tipos de cosas además de las matrices que heredan de Object.prototype que no son objetos simples ni matrices, como HTMLElements y muchas, muchas otras cosas.
function isObject(value) { return typeof value === "object" && !Array.isArray(value) && value !== null; } console.log(isObject(document.body)); console.log(isObject(new Proxy({}, {}))); Así que prefiero Object.getPrototypeOf , con el que puede estar bastante seguro de que el prototipo interno inmediato del valor es Object.prototype , y que no es nada más especial.
const isObject = item => Object.getPrototypeOf(item) === Object.prototype; console.log(isObject([])); console.log(isObject({})); console.log(isObject(document)); Podría fallar si se sobrescribe Object.getPrototypeOf , por supuesto, pero si estás en ese punto, casi nada es confiable de todos modos.
Tenga en cuenta que muchas cosas se heredan de Object.prototype que se Number.prototype true si desea excluir esos tipos, puede verificar si existe una propiedad .constructor .