执行`typeof JSON`比较

时间:2012-07-01 19:08:15

标签: javascript json coffeescript

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

  

未捕获的TypeError:在instanceof check中期望一个函数,但得到#<对象>

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

原始代码如下:

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

check({compare: "me"})

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

第一个type of返回字符串,第二个,在JSON可能的返回值中没有类型type ofsee the this page for detail

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

答案 2 :(得分:1)

JSON代表JavaScript Object表示法,它只是一个用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将产生" object" (减少对象的类型理论类型)。

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

答案 3 :(得分: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

获得类似的结果