Javascript: Как отличить объектные литералы - PullRequest
0 голосов
/ 11 июня 2019

Я хочу знать, как мы можем различать литералы объектов и объекты json с другими объектами, такими как Дата, Функция и т. Д.

Поскольку оператор typeof и оператор instanceof Object возвращаютtrue для обоих объектов, есть ли способ различить их?

PS: я не хочу делать это путем обратного исключения Date и Function, так как он не будет обрабатывать случаи, отличные от Dateили функция.

Ответы [ 2 ]

2 голосов
/ 11 июня 2019

Все, что не является примитивом, является объектом, но не все, что является объектом, также является датой или функцией. Вместо проверки instanceof Object, проверьте instanceof Date или instanceof Function:

const obj = {};
const date = new Date();
const fn = () => 'foo';

console.log(date instanceof Date);
console.log(obj instanceof Date);

console.log(fn instanceof Function);
console.log(obj instanceof Function);

и объекты JSON

Имейте в виду, что не существует такого понятия, как "объект JSON"

0 голосов
/ 11 июня 2019

Если вы просто хотите сделать копию объекта Javascript (включая массивы, поскольку они тоже объекты), но исключая недействительные объекты JSON (например, Date s, Function s и т. Д.),один из самых простых способов - преобразовать объект Javascript в строку JSON, а затем повторно проанализировать его:

function deepCopy(input){
  const json = JSON.stringify(input);
  return JSON.parse(json);
}

const obj1 = { "hello": "world" };
const obj2 = deepCopy(obj1);

// obj1 and obj2 are two distinct objects
obj1["hello"] = "bye";
console.log( obj2["hello"] ); // world

// this works for arrays too
const a = [1, 2, [3, 4]];
const b = deepCopy(a);

ПРИМЕЧАНИЕ: имейте в виду, что, даже если он работает, он не самый лучшийрешение (особенно из-за проблем с производительностью).

Вы также можете написать функцию, целью которой является анализ объекта Javascript, чтобы определить, может ли он быть допустимым объектом JSON (то есть простым объектомс только примитивами и массивами в нем).Таким образом, вы можете отличить от Date s и других «сложных» объектов.Посмотрите на спецификацию JSON (или Википедию), чтобы узнать, какие типы данных поддерживает JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...