在這本書中的Javascript好的部件,CH 3的對象上打開的頁面上,它指出:當他說undefined不能成爲房產價值時,crockford是什麼意思?
對象是屬性,其中一個屬性有一個名字和一個值的容器。屬性名稱可以是任何字符串,包括空字符串。屬性值可以是除undefined之外的任何Javascript值。
注:未定義在書中強調錶示這是是文字。
然而,在實踐中,我能夠做到這一點。
var a = { "name": undefined };
我的理解有什麼問題?
在這本書中的Javascript好的部件,CH 3的對象上打開的頁面上,它指出:當他說undefined不能成爲房產價值時,crockford是什麼意思?
對象是屬性,其中一個屬性有一個名字和一個值的容器。屬性名稱可以是任何字符串,包括空字符串。屬性值可以是除undefined之外的任何Javascript值。
注:未定義在書中強調錶示這是是文字。
然而,在實踐中,我能夠做到這一點。
var a = { "name": undefined };
我的理解有什麼問題?
我相信答案是,他錯了。你可以設置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['___']
的語法糖。
也許這:
var a = {"name": x}; //x is undefined, so it will cause an error.
只是我的理解。
我想他想說的是,物業的價值不能爲undefined
,因爲undefined
正是JavaScript如何表示不存在的屬性。換句話說,如果你有下列對象
var a = { "name": undefined };
然後a.name
是undefined
,但這樣是a.someFakeProperty
。然而,正如Ben Lee在他的評論中指出的那樣,當您使用for
循環迭代a
的屬性時,name
仍然會顯示,而someFakeProperty
不會。因此,看起來克羅克福德在表達這個問題時有點不準確。
但有一種方法可以區分。如果你做'a = {「name」:undefined};'然後立即跟進'for(att in a){alert(att); }',你會看到'name'出現。所以在內部它被存儲爲對象的一個屬性,其值爲'undefined'。 – 2010-11-15 04:18:36
// @本:非常有趣!我剛剛在Firefox中測試過,看起來你是對的。嗯,我不知道Crockford想說什麼,然後... – bcat 2010-11-15 04:20:33
我不喜歡Crockford使用的術語,他似乎混合了undefined
和未聲明的概念。
聲明:
的屬性值可以是除了未定義任何JavaScript值。
是完全錯誤的IMO,因爲undefined
是語言的primitive value。
參見:
他對屬性名稱沒有錯,當使用括號表示法時,表達式將被轉換爲ToString,屬性名稱可以是*僅字符串*,例如:'var o = {toString:function(){return'foo'; }},a = {}; a [o] ='測試'; alert(a ['foo']);'在這個例子中,訪問'a [o]'會將'o'轉換爲字符串,產生''foo''作爲屬性名稱... – CMS 2010-11-15 04:40:45
是的。試試'[[[object DOMWindow]'] == 43'。 – 2010-11-15 04:45:26
啊,我明白了......串演並沒有出現在我身上。答案已更正。 – 2010-11-15 04:53:52