【问题标题】:Type of this is always object while checking for a valid Javascrip Object在检查有效的 Javascript 对象时,此类型始终为对象
【发布时间】:2020-10-27 11:27:28
【问题描述】:

我在 javascript 中编写了一个 Prototype 函数来确定实体是否是有效的 Javascript 对象。类似以下的东西


// Check if Object is Valid & Have at least one element

Object.prototype._isValidObject = function () {
    return this && typeof this === 'object' && !Array.isArray(this) && Object.keys(this).length >= 1;
};

问题是它为大多数值返回 TRUE,甚至对于 string,因为 this 被视为对象任何值,如数组、字符串或 json 等。可能有其他方法可以做到这一点,但我需要为此创建一个原型函数。请确定确定值是否是具有至少一项的有效 Javascript 对象的正确方法。谢谢

编辑 通过有效的 Javascript / JSON 对象,我的意思是这样的:

{
  id:100,
  name:'somename',
  email:'maiL@mail.com'
}

更准确地说,以下是我想要的:


const j = {id:100,name:'somename', email:'maiL@mail.com'};

const s = "{id:100, name:'somename', email:'maiL@mail.com'}"; 

j._isValidObject(); // Should return true
s._isValidObject(); // Should return false

const j 对我有效,因为它是一个具有键值对的对象。 const s 对我无效,因为它是对象的字符串表示形式,而不是对象本身。 const s 可以像 const j 一样转换为有效的 Object,但现在 const s 只是一个字符串。

编辑 我找到了解决方案,并将其发布在答案中。尽管我没有将其标记为已接受的答案,因为我不确定这是否是最好的方法。如果有人有更好的解决方案,请发布。谢谢

【问题讨论】:

  • 请先定义什么是“有效的 JSON 对象”。
  • 根据定义,任何 Javascript 对象都是有效的对象,因为几乎任何东西都是对象,所以几乎所有东西都是对象。询问您要排除的具体内容可能更容易。
  • 现在我们已经了解了什么是 JavaScript 对象,您仍然需要定义什么构成“有效” JavaScript 对象。日期对象是否有效? DOM 元素对象是否有效?
  • Turning this around, 您要解决什么问题?您不知道是否有任何特定变量包含必须解码的 JSON 字符串或已解码的值?如上面我的字符串示例所示,这是一个糟糕的情况,因为这个问题通常不能真正回答字符串。这是一个需要通过更好地定义数据流来解决的问题;即你应该知道在任何时候你是否期望有 JSON 或 Javascript 值。您根本不需要猜测。

标签: javascript json javascript-objects


【解决方案1】:

我找到了解决方案,但我没有将其标记为已接受的答案,因为我不确定这是否是最好的方法。如果有人有更好的解决方案,请发布。谢谢


// Check if Object is Valid & Have at least one element

Object.prototype._isValidObject = function () {
    return this
           && !(this instanceof String)
           && !Array.isArray(this)
           && Object.keys(this).length >= 1;
};

【讨论】:

  • console.log(console._isValidObject()); 没有人可以回答你的问题,因为你还没有分享你对什么是有效对象的定义。
  • 我在编辑部分的示例中已明确提到,对我而言,有效对象是具有键值关系的对象,例如哈希映射,可以通过访问键来访问其值-名称作为索引。就像我们通过创建类的对象来访问任何 oops 编程语言中的类成员一样。它不应该是字符串表示,而是一个实际的对象
  • 问题,any Javascript 对象符合该定义(undefined 等特殊值除外)。
  • 我意识到了。这就是为什么我要求一种解决方案来区分字符串表示和字节码对象。变量 obj = 新 C1(); var str = "class C1{}";.我们不能说 str 是 C1 类的对象。它只是一个字符串表示。 obj 是一个对象。所以 var s = {} 和 var j = "{}" 是有区别的。
  • @Himanshu 是的,所以唯一明确的规则似乎是:“它是一个字符串吗?”但同样,如果它是一个字符串,也并不意味着它是一个 JSON 字符串,它很可能只是一个……字符串。要为您的问题提供有用的解决方案,我们需要知道您对此的考虑程度以及该问题的相关性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 2016-01-20
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多