每個對象都是基於引用類型建立的。工具
一個對象就是一個屬性集合,並擁有一個獨立的prototype(原型)對象。
這個prototype能夠是一個對象(所謂它的原型對象)或者null(原型鏈終點)。spa
栗子:foo,兩個明顯的自身屬性(x,y)和一個隱含的__proto__
屬性,這個屬性是對foo
原型對象的引用:prototype
JavaScript 的對象能夠做爲哈希表使用,主要用來保存命名的鍵與值的對應關係。
使用對象的字面語法{}
能夠建立一個簡單對象。這個新建立的對象從Object.prototype繼承下面,沒有任何自定義屬性。設計
var foo = {}; // 一個空對象 // 一個新對象,擁有一個值爲12的自定義屬性'test' var bar = {test: 12};
有兩種方式來訪問對象的屬性,點操做符或者中括號操做符。code
var foo = {name: 'kitten'} foo.name; // kitten foo['name']; // kitten var get = 'name'; foo[get]; // kitten foo.1234; // SyntaxError foo['1234']; // works
兩種語法是等價的,可是中括號操做符在下面兩種狀況下依然有效對象
動態設置屬性繼承
屬性名不是一個有效的變量名ip
在 JSLint 語法檢測工具中,點操做符是推薦作法。原型鏈
刪除屬性的惟一方法是使用 delete操做符;
設置屬性爲 undefined或者null並不能真正的刪除屬性,而僅僅是移除了屬性和值的關聯。字符串
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被真正的刪除了,因此從輸出結果中消失。
var test = { 'case': 'I am a keyword so I must be notated as a string', delete: 'I am a keyword too so me' // 出錯:SyntaxError};
對象的屬性名可使用字符串或者普通字符聲明。可是因爲 JavaScript 解析器的另外一個錯誤設計,上面的第二種聲明方式在ECMAScript5以前會拋出SyntaxError的錯誤。
這個錯誤的緣由是delete是JavaScript語言的一個關鍵詞;所以爲了在更低版本的 JavaScript 引擎下也能正常運行, 必須使用字符串字面值聲明方式。
JavaScript 中全部變量均可以看成對象使用,除了兩個例外null和undefined
提問!!! 數字能夠做文對象來使用嗎?
2.toString();
會輸出什麼???
特殊的栗子
一個常見的誤解是數字的字面值(literal)不能看成對象使用。
這是由於 JavaScript 解析器的一個錯誤, 它試圖將點操做符解析爲浮點數字面值的一部分。
2.toString(); // 出錯:SyntaxError
有不少變通方法可讓數字的字面值看起來像對象。
2..toString(); // 第二個點號能夠正常解析 2 .toString(); // 注意點號前面的空格 (2).toString(); // 2先被計算