Javascript
中的一切均可以視爲對象,除了兩個特例:null
和 undefined
。git
false.toString(); // 'false' [1, 2, 3].toString(); // '1,2,3' function Foo(){} Foo.bar = 1; Foo.bar; // 1
一個常常容易被誤解的就是數字常量不能視爲對象,實際上數字常量仍然能夠視爲對象。這是由於 Javascript
解析器在解析點操做符時而將其視爲浮點數特徵而犯下的錯誤。github
2.toString(); // raises SyntaxError
實際上,咱們有不少方法可使得數字常量表現爲一個對象。segmentfault
2..toString(); // the second point is correctly recognized 2 .toString(); // note the space left to the dot (2).toString(); // 2 is evaluated first
Javascript
中的對象能夠當作哈希表使用,它們主要包含鍵與值的對應關係。
使用 {}
符號來建立一個簡單的對象,這個新建的對象將從 Object.prototype
繼承而來,而且不包含本身定義的屬性。ide
var foo = {}; // a new empty object // a new object with a 'test' property with value 12 var bar = {test: 12};
咱們可使用兩種方式來訪問 Javascript
的對象,分別是點操做符 .
和中括號操做符 []
。lua
var foo = {name: 'kitten'} foo.name; // kitten foo['name']; // kitten var get = 'name'; foo[get]; // kitten foo.1234; // SyntaxError foo['1234']; // works
兩種操做符的效果幾乎同樣,惟一的不一樣是中括號操做符容許動態設置屬性並且屬性名能夠有語法錯誤。(上例中的第三個情形已說明)spa
刪除屬性的惟一方法是使用 delete
,將屬性值設置爲 undefined
或 null
只是移除了與屬性相關的值,並無真正刪除屬性自己。prototype
var obj = { bar: 1, foo: 2, baz: 3 }; obj.bar = undefined; obj.foo = null; delete obj.baz; for(var i in obj) { if (obj.hasOwnProperty(i)) { console.log(i, '' + obj[i]); } }
上面的輸出 bar undefined
和 foo null
,只有 baz
真正被刪除。
這裏要說明一點,delete
只能刪除屬性,並不能刪除變量。因此咱們在定義變量時必定要養成寫 var
的好習慣,任什麼時候候,變量必定要使用 var
關鍵字才能聲明。由於若是不寫 var
,變量會被誤認給全局對象建立了一個新屬性。設計
這個例子至關清楚給出了答案,a
爲變量,而 b
只是一個全局對象的屬性而已。code
var test = { 'case': 'I am a keyword, so I must be notated as a string', delete: 'I am a keyword, so me too' // raises SyntaxError };
對象的屬性能夠用普通字符或字符串來命名。一樣也是因爲 Javascript
解析器的一個錯誤設計,上例中的第二種表示方法在 ECMAScript 5
中將會拋出一個錯誤。
錯誤的緣由是由於 delete
是一個關鍵詞,因此必須使用一個字符串常量來命名來適應老版的 Javascript
解析器。對象
http://bonsaiden.github.io/JavaScript-Garden/#object.general