2012-07-01 84 views
2

我有一個方法接收一些東西,它需要確定收到的值的類型。我可以使用typeof來執行常規比較,比如它是數字還是字符串。但我怎麼能做到這一點的JSON對象?他們JSON比較帶來了錯誤:執行`typeof JSON`比較

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

所以我想與JSON比較JSON對象類型是不一樣?

原始代碼是這樣的:

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

check({compare: "me"}) 
+0

你的意思是'instanceof'對嗎? – Pointy

+2

無論如何,這個問題沒有道理; JSON是一個字符串或一個對象; JavaScript中沒有JSON「type」。 – Pointy

+0

@好的,對不起,這是'instanceof' :)修正了這個問題。 – noncom

回答

3

的類型將是object,不JSON。要查看您正在處理的內容,可以檢查它是否包含您要查找的屬性。檢查長度,或者是否有特定的鍵。

這是關於使用JSON的相當不錯的信息頁面。 JSON in JavaScript

+0

所以我在想完全錯誤。我來自嚴格類型的語言土地,所以這是預期:) – noncom

+1

@noncom您可能還想閱讀http://en.wikipedia.org/wiki/Duck_typing –

+0

僅供參考 - 「JavaScript中的JSON」鏈接返回404錯誤。 – fletchsod

1

第一個type of返回字符串,第二,沒有類型JSONtype of中可能的返回值。 see the this page for detail

你的情況

您會收到"object"

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將產生「對象」(關於對象的類型理論類型的更少)。

如果你想針對一個特定的類型將測試和對象爲此不得不測試它的所有預期的屬性和方法

+1

在你的例子中,b和c都是對象,而d是一個字符串,但是_none_是JSON **。除了它沒有[JSON](http://json.org)語法所需的雙引號屬性名稱之外,d是_almost_ JSON。 JSON不是JavaScript語法的一部分。 _parsing_ JSON的結果是一個對象。術語「JSON」僅適用於在[json.org](http://json.org)中定義的對象的字符串表示形式。還要注意的是並非所有的JavaScript對象都可以表示爲JSON(因爲JSON沒有'undefined'類型並且沒有函數)。 – nnnnnn

+0

@nnnnnn JavaScript對象表示法=== JSON。引號是可選的,JavaScript中的所有對象文字都是使用JavaScript對象表示法編寫的。 Hole指的是JSON是有效的JavaScript,並且我的觀點與上面的對象一起說明爲什麼JavaScript對象表示法不是一種類型 –

+0

是,「JSON」是JavaScript對象表示法的縮寫,但JSON是用於_data interchange_的_string_格式它的語法是JavaScript中有效的一個子集。 (這意味着JSON可以與任何現代編程語言一起使用 - 就是這一點。)JS代碼中的JS對象文字是_not_ JSON。引號在JS對象文字中是可選的,但不在JSON中 - 如果你要在你的JSON上使用'eval',缺少引號並不重要,但這是不好的做法。更多信息[here](http://stackoverflow.com/questions/6489783/whats-the-difference-between-javascript-object-and-json-object)。 – nnnnnn

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實現類似的結果