我有一个接收某些东西的方法,它需要确定接收值的类型。我可以使用typeof
来执行常规比较,例如它是数字还是字符串。但是我如何为JSON对象执行此操作?将它们与JSON
进行比较会出现错误:
未捕获的TypeError:在instanceof check中期望一个函数,但得到#<对象>
所以我想将JSON对象类型与JSON
进行比较不是这样的吗?
原始代码如下:
check = (what) ->
if what instanceof JSON
alert "Yooo"
check({compare: "me"})
答案 0 :(得分:4)
类型为object
,而不是JSON
。要查看您正在使用的内容,您可以检查它是否具有您正在寻找的属性。检查长度,或者是否有特定的按键。
这是一个关于使用JSON的非常好的信息页面。 JSON in JavaScript
答案 1 :(得分:1)
第一个type of
返回字符串,第二个,在JSON
可能的返回值中没有类型type of
。 see 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
获得类似的结果