【问题标题】:Javascript: How to differentiate object literalsJavascript:如何区分对象文字
【发布时间】:2019-06-11 21:04:58
【问题描述】:

我想知道我们如何区分对象字面量和 json 对象,以及日期、函数等其他对象。

由于typeof 运算符和instanceof Object 运算符对这两个对象都返回true,有没有办法区分它们?

PS: 我不想通过反向排除日期和函数来做到这一点,因为它不会处理日期或函数以外的情况。

【问题讨论】:

  • 您是否尝试过instanceof Date,例如,检查日期对象,而不是通用对象?
  • 看看various ways to detect plain objects。基本上只使用Object.getPrototypeOf(obj) == Object.prototype

标签: javascript json object


【解决方案1】:

所有非原始对象都是对象,但并非所有对象也是日期或函数。不要检查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 对象

请记住there's no such thing as a "JSON Object"

【讨论】:

  • 但是其他不是日期或函数的对象呢?
  • 只需确定您想要比较它们的对象,然后检查他们的instanceofs,就像我在上面所做的那样
  • 我的用例是这样的,我有一个深度复制函数,它可以深度复制对象,但只返回不是 json 的所有内容。为此,我必须确保我正在迭代的对象是具有键 gist.github.com/Manzurkds/2bc6c11988aaabe8bd24d176eec2015f 的实际对象
  • 您是否试图区分普通对象和其他非普通对象,是吗? (JSON 格式的任何内容都是 字符串,而不是对象,请参阅答案中的链接)
【解决方案2】:

如果您只想复制 Javascript 对象(包括数组,因为它们也是对象),但不包括无效的 JSON 对象(如Dates、Functions 等),最简单的方法之一是将 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 对象(即,其中只有基元和数组的普通对象)。这样,您可以区分Dates 和其他“复杂”对象。查看 JSON 规范(或 Wikipedia)以了解 JSON 支持哪些数据类型。

【讨论】:

    猜你喜欢
    • 2011-08-18
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2011-08-21
    • 1970-01-01
    相关资源
    最近更新 更多