4

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

未捕获的类型错误:在 instanceof 检查中需要一个函数,但得到了 #< Object>

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

原代码如下:

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

check({compare: "me"})
4

4 回答 4

4

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

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

于 2012-07-01T19:11:20.600 回答
1

第一个返回字符串,第二个,可能的返回值中type of没有类型之类的东西。有关详细信息,请参阅此页面JSONtype of

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

于 2012-07-01T19:18:22.650 回答
1

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将产生“对象”(较少考虑对象的类型理论类型)。

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

于 2012-07-01T19:21:26.110 回答
1
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 获得类似的结果

于 2012-07-05T07:39:25.517 回答