Как проверить, является ли объект обычным объектом в JavaScript - PullRequest
0 голосов
/ 05 октября 2018

У меня есть созданная библиотека слияния , которая рекурсивно объединяет объекты.Иногда посередине может быть объект, который на самом деле является специальным классом (например, Timestamp из Firestore).

В своей функции слияния я проверяю, является ли что-то объектом или нет, как это:

function isObject (payload) {
  const getType = Object.prototype.toString.call(payload).slice(8, -1)
  return getType === 'Object'
}

Однако с помощью этой проверки некоторые специальные классы со специальными прототипами по-прежнему считаются обычными объектами JavaScript.

Моя проблема:
Объектпотеряет свой прототип специального класса, потому что я рекурсивно сливаю только значения, не относящиеся к прототипу.

Мой вопрос:
Как изменить указанную выше функцию, чтобы она не только проверяла,это объект JavaScript, но также проверьте, является ли он обычным объектом JavaScript ?

По сути, я только хочу вернуть true на isObject(obj), если obj является объектом, подобным этому: {} или с любым реквизитом.

Но как только прототип отличается (и, следовательно, это особый класс), тогда я хочу вернуть false на isObject(obj)

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

это может быть сложно, так как некоторые типы javascript имеют typeof «объект», как показано ниже

console.log(typeof []) // object
console.log(typeof null) // object

Простой способ проверить простой объект - использовать метод Object toString, а также проверитьдля null вот так

/**@return boolean */
function isObject(val) {
   const _toString = Object.prototype.toString;
   return val !== null && _toString.call(val) === '[object Object]';
}

сейчас мы проверяем это

isObject({}); // true
isObject({a: 2, b: 3}); // true
isObject(null); // false
isObject([]); // false
isObject(new Object()); // true
isObject(new Array()); // false
0 голосов
/ 05 октября 2018

Помимо проверки прототипа, вы можете проверить, является ли constructor Object:

const isPlainObject = obj => obj.constructor === Object && Object.getPrototypeOf(obj) === Object.prototype;

const obj1 = { foo: 'bar' };
const obj2 = new Date();
const obj3 = [];
[obj1, obj2, obj3].forEach(obj => console.log(isPlainObject(obj)));

Обратите внимание, что использование getPrototypeOf и проверка того, что === - Object.prototype более надежно, чем использование toString - toString может вернуть что-либо после того, какall.

Если вы собираетесь передать что-то, что является неопределенным или неопределенным, в isPlainObject, тогда, конечно, включите проверку, чтобы убедиться, что obj является правдивым, прежде чем пытаться получить доступ к свойствам на нем:

const isPlainObject = obj => obj && obj.constructor === Object && Object.getPrototypeOf(obj) === Object.prototype;

const obj1 = { foo: 'bar' };
const obj2 = new Date();
const obj3 = [];
[obj1, obj2, obj3].forEach(obj => console.log(isPlainObject(obj)));
...