2010-11-15 13 views
12

在這本書中的Javascript好的部件,CH 3的對象上打開的頁面上,它指出:當他說undefined不能成爲房產價值時,crockford是什麼意思?

對象是屬性,其中一個屬性有一個名字和一個值的容器。屬性名稱可以是任何字符串,包括空字符串。屬性值可以是除undefined之外的任何Javascript值。

未定義在書中強調錶示這是是文字。

然而,在實踐中,我能夠做到這一點。

var a = { "name": undefined }; 

我的理解有什麼問題?

回答

8

我相信答案是,他錯了。你可以設置var a = { "name": undefined };

  • a.name === undefined
  • a.name === a.someFakeProperty

這裏就是他們是不同的,雖然:

  • 'someFakeProperty' in a === false
  • 'name' in a === true

或者,做不同的方式,

  • a.hasOwnProperty('someFakeProperty') === false
  • a.hasOwnProperty('name') === true

使用有點臭名昭著for..in循環,

for (var i in a) { 
    alert(i); 
} 

...會給你name

因此,根據價值,您可能無法區分undefined和undefined,但它們在內部完全不同。

此外:他也是錯誤的屬性名稱 - a[window] = 43; a[window] == 43;就好了。當然,你不能這樣做a.window,但a.___只是a['___']的語法糖。正如在評論中指出的那樣,屬性名稱被轉換爲字符串,所以我錯了這一點。

+3

他對屬性名稱沒有錯,當使用括號表示法時,表達式將被轉換爲ToString,屬性名稱可以是*僅字符串*,例如:'var o = {toString:function(){return'foo'; }},a = {}; a [o] ='測試'; alert(a ['foo']);'在這個例子中,訪問'a [o]'會將'o'轉換爲字符串,產生''foo''作爲屬性名稱... – CMS 2010-11-15 04:40:45

+0

是的。試試'[[[object DOMWindow]'] == 43'。 – 2010-11-15 04:45:26

+0

啊,我明白了......串演並沒有出現在我身上。答案已更正。 – 2010-11-15 04:53:52

0

也許這:

var a = {"name": x}; //x is undefined, so it will cause an error. 

只是我的理解。

2

我想他想說的是,物業的價值不能爲undefined,因爲undefined正是JavaScript如何表示不存在的屬性。換句話說,如果你有下列對象

var a = { "name": undefined }; 

然後a.nameundefined,但這樣是a.someFakeProperty。然而,正如Ben Lee在他的評論中指出的那樣,當您使用for循環迭代a的屬性時,name仍然會顯示,而someFakeProperty不會。因此,看起來克羅克福德在表達這個問題時有點不準確。

+3

但有一種方法可以區分。如果你做'a = {「name」:undefined};'然後立即跟進'for(att in a){alert(att); }',你會看到'name'出現。所以在內部它被存儲爲對象的一個​​屬性,其值爲'undefined'。 – 2010-11-15 04:18:36

+0

// @本:非常有趣!我剛剛在Firefox中測試過,看起來你是對的。嗯,我不知道Crockford想說什麼,然後... – bcat 2010-11-15 04:20:33

相關問題