Обычно я использую это условие, чтобы проверить, является ли значение данных объектом или нет:
// function A
export const isObject = item => {
return item && item.constructor === Object;
};
так легче понять, но мой друг обычно использует эту функцию для проверки данных с тем же условием, что и выше isObject(value) {}:
// function B
export function isObject(value) {
return typeof value === "object" && !Array.isArray(value) && value !== null;
}
мы запутались, когда возникает конфликт, когда мы хотим объединиться с последней веткой, поэтому вот вопрос, Between function A & B which one is better to cover most case regarding object data?, можете ли вы объяснить это, чтобы я лучше знал об этом.
@CertainPerformance спасибо за ваш ответ, значит, вы выбрали третью функцию, возможную для этого случая? Вы можете объяснить, почему вы выбрали его?
Есть объекты, для которых ваша первая функция вернет false, а вторая функция вернет true, и есть объекты, для которых ваша первая функция вернет true, а вторая функция вернет false. Они делают очень разные вещи.
См. также stackoverflow.com/questions/15315694/…



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Предполагая, что вы хотите идентифицировать простые объекты, которые наследуются от Object.prototype и не являются подклассами чего-то другого:
Первый подход можно обмануть, потому что свойство .constructor не обязательно ссылается на функцию-конструктор, используемую для создания функции — объект может присвоить этому свойству что-то еще.
const isObject = item => {
return item && item.constructor === Object;
};
const a = [];
console.info(a.constructor == Array);
a.constructor = Object;
console.info(a.constructor === Object);
console.info(isObject(a));Второй подход можно обмануть, потому что помимо массивов, которые наследуются от Object.prototype, есть и другие вещи, которые не являются простыми объектами или массивами — например, HTMLElements и многие, многие другие вещи.
function isObject(value) {
return typeof value === "object" && !Array.isArray(value) && value !== null;
}
console.info(isObject(document.body));
console.info(isObject(new Proxy({}, {})));Поэтому я предпочитаю Object.getPrototypeOf, с которым вы можете быть совершенно уверены, что непосредственным внутренним прототипом значения является Object.prototype, и что в нем нет ничего особенного.
const isObject = item => Object.getPrototypeOf(item) === Object.prototype;
console.info(isObject([]));
console.info(isObject({}));
console.info(isObject(document));Конечно, это может потерпеть неудачу, если Object.getPrototypeOf будет перезаписано, но если вы в этот момент, в любом случае почти ничему нельзя доверять.
Обратите внимание, что многие вещи наследуются от Object.prototype, которые дадут true для этого, например Number.prototype — если вы хотите исключить эти виды, вы можете проверить, существует ли свойство .constructor.
спасибо за ваш ответ, он действительно объясняет, какое условие, при котором средство проверки не сможет выполнить обе функции, которые я упомянул выше
о, вы можете немного отредактировать его и поместить свою функцию в качестве функции, которую вы выбираете, чтобы любому, кто видит эту проблему, было легче найти функцию для ответа
Думаю, я бы сделал
Object.getPrototypeOf(item) === Object.prototype