执行 `typeof JSON` 比较

Posted

技术标签:

【中文标题】执行 `typeof JSON` 比较【英文标题】:Perform a `typeof JSON` comparison 【发布时间】:2012-07-02 08:21:21 【问题描述】:

我有一个接收某些东西的方法,它需要确定接收到的值的类型。我可以使用typeof 来执行常规比较,例如它是数字还是字符串。但是我怎样才能为 JSON 对象做到这一点呢?将它们与JSON 进行比较会出现错误:

Uncaught TypeError: Expecting a function in instanceof check, but got #

所以我猜想将 JSON 对象类型与JSON 进行比较不是这样吗?

原来的代码是这样的:

check = (what) ->
  if what instanceof JSON
    alert "Yooo"

check(compare: "me")

【问题讨论】:

反正这个问题没有意义; JSON 要么是字符串,要么是对象; javascript 中没有 JSON“类型”。 @Pointy 是的,对不起,是instanceof :) 已修复。 没有 JSON 对象之类的东西,除非您指的是承载 2 个方法的原生 window.JSON 对象。 【参考方案1】:

首先type of返回字符串,其次,在type of可能的返回值中没有Type JSON这样的东西。 see the this page for detail

在您的情况下,您将收到"object"

【讨论】:

【参考方案2】:
class JSON
   constructor: (@data) ->

   get: (key) ->
     @data[key]

   set: (key, value) ->
     @data[key] = value

a = new JSON "foo":"My foo", "bar" : 4

a.get('foo')
a.data.foo
a.data['foo']

console.log(a instanceof JSON)

:D 你真的不应该这样做,至少不要创建 JSON 类型。但是您可以为几乎任何东西创建自己的包装器。将它与 Object.defineProperty 结合以基于 @data 设置 getter 和 setter,您可以做一些强大的事情。它没有 method_missing 方法,但您可以使用 Object.defineProperty 实现类似的结果

【讨论】:

【参考方案3】:

JSON 代表 JavaScript 对象表示法,它只是对象文字在 JavaScript 中编写方式的一个名称,它不是一种类型。

var a = "foo":"My foo","bar" : 4;
var b = "foo":"My foo","bar" : 0;
var c = "foo":"My c foo","barella" : -1;
var d = '"baz":"My baz","bar" : 4';

a,b,c 和 d 都是对象类型的前三个对象字符串类型的第四个。从类型理论的角度来看,您可以说前两个具有相同的类型。如果您执行了eval("var e =" + d),则将评估 d 中的字符串,并且由于 d 是序列化为 JSON 的对象,因此结果将是分配给 e 的有效对象。

换句话说,JSON 不是类型,它是 JavaScript 语法的一部分,评估 JSON 的结果是一个对象,并且该对象的类型将根据对象字面量而有所不同。在这样的对象上使用typeof 将产生“对象”(较少考虑对象的类型理论类型)。

如果您希望针对特定类型进行测试和反对,则必须针对所有预期的属性和方法对其进行测试

【讨论】:

在您的示例中,a、b 和 c 都是对象,d 是字符串,none 是 JSON。 d 是几乎 JSON,除了它没有JSON 语法要求的双引号属性名称。 JSON 不是 JavaScript 语法的一部分。 解析 JSON 的结果是一个对象。术语“JSON”仅适用于json.org 中定义的对象的字符串表示。另请注意,并非所有 JavaScript 对象都可以表示为 JSON(因为 JSON 没有 undefined 类型并且不执行函数)。 @nnnnnn JavaScript 对象表示法 === JSON。引号是可选的,JavaScript 中的所有对象字面量都是使用 JavaScript 对象表示法编写的。漏洞是 JSON 是有效的 JavaScript,我对上面对象的观点是说明为什么 JavaScript 对象表示法不是类型 是的,“JSON”是 JavaScript Object Notation 的首字母缩写,但 JSON 是 数据交换string 格式,其语法是一个子集JavaScript 中有效的内容。 (这意味着 JSON 几乎可以与任何现代编程语言一起使用——这就是重点。) JS 代码中的 JS 对象字面量是 not JSON。引号在 JS 对象文字中是可选的,但在 JSON 中不是 - 如果您要在 JSON 上使用 eval,那么缺少引号并不重要,但这是不好的做法。更多信息here. @nnnnnn 我同意你的报价部分(这对我来说是新的,因为我使用过的所有解析器真的不在乎)但是根据 rfc4627,其余部分并不准确。您定义为 JSON 的是 JSON text 而不是它本身的格式。准确地说,它是(派生自)ECMAScript 语法的一个子集。所有这些仍然与答案和问题无关,因为这些示例是关于 JSON 不是一种类型而是一种格式 当使用实际的首字母缩略词“JSON”时,它指的是基于 JS 对象字面语法的数据交换格式,不是指实际的 JS 代码。这是两个截然不同的概念。如果您阅读 rfc4627,它会说“JavaScript Object Notation (JSON) 是一种用于结构化数据序列化的文本格式。它源自 JavaScript 的对象文字”——也就是说,它支持我所说的而不是你所说的'在说。请注意,json.org 以更易读的格式呈现与 rfc4627 相同的信息。【参考方案4】:

类型将是object,而不是JSON。要查看您正在使用的内容,您可以检查它是否具有您正在寻找的属性。检查长度,或者是否有特定的键。

这是一个关于使用 JSON 的非常好的信息页面。 JSON in JavaScript

【讨论】:

所以我的想法完全错了。我来自严格类型的语言领域,所以这是意料之中的 :) 仅供参考 - “JavaScript 中的 JSON”链接返回 404 错误。

以上是关于执行 `typeof JSON` 比较的主要内容,如果未能解决你的问题,请参考以下文章

比较typeof与instanceof

获取 JSON 对象内的 typeof 元素

比较对象类型时 typeof 和 is 有啥区别? [复制]

__typeof与typeof

typeof()和instanceof()用法区别

Go reflect反射