Какая функция лучше подходит для большинства случаев, чтобы проверить, являются ли данные объектом или нет между двумя функциями ниже

Обычно я использую это условие, чтобы проверить, является ли значение данных объектом или нет:

// 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?, можете ли вы объяснить это, чтобы я лучше знал об этом.

Думаю, я бы сделал Object.getPrototypeOf(item) === Object.prototype

CertainPerformance 18.03.2022 03:38

@CertainPerformance спасибо за ваш ответ, значит, вы выбрали третью функцию, возможную для этого случая? Вы можете объяснить, почему вы выбрали его?

Rakis Friski 18.03.2022 03:47

Есть объекты, для которых ваша первая функция вернет false, а вторая функция вернет true, и есть объекты, для которых ваша первая функция вернет true, а вторая функция вернет false. Они делают очень разные вещи.

Bergi 18.03.2022 04:42

См. также stackoverflow.com/questions/15315694/…

Bergi 18.03.2022 04:43
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предполагая, что вы хотите идентифицировать простые объекты, которые наследуются от 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.

спасибо за ваш ответ, он действительно объясняет, какое условие, при котором средство проверки не сможет выполнить обе функции, которые я упомянул выше

Rakis Friski 18.03.2022 04:15

о, вы можете немного отредактировать его и поместить свою функцию в качестве функции, которую вы выбираете, чтобы любому, кто видит эту проблему, было легче найти функцию для ответа

Rakis Friski 18.03.2022 04:17

Другие вопросы по теме