执行 `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` 比较的主要内容,如果未能解决你的问题,请参考以下文章