JavaScript 中所有變量都是對象,除了兩個例外 null
和 undefined
。
false.toString(); // 'false'
[1, 2, 3].toString(); // '1,2,3'
function Foo(){}
Foo.bar = 1;
Foo.bar; // 1
一個常見的誤解是數(shù)字的字面值(literal)不是對象。這是因?yàn)?JavaScript 解析器的一個錯誤, 它試圖將點(diǎn)操作符解析為浮點(diǎn)數(shù)字面值的一部分。
2.toString(); // 出錯:SyntaxError
有很多變通方法可以讓數(shù)字的字面值看起來像對象。
2..toString(); // 第二個點(diǎn)號可以正常解析
2 .toString(); // 注意點(diǎn)號前面的空格
(2).toString(); // 2先被計(jì)算
JavaScript 的對象可以作為哈希表使用,主要用來保存命名的鍵與值的對應(yīng)關(guān)系。
使用對象的字面語法 - {}
- 可以創(chuàng)建一個簡單對象。這個新創(chuàng)建的對象從 Object.prototype
繼承下面,沒有任何自定義屬性。
var foo = {}; // 一個空對象
// 一個新對象,擁有一個值為12的自定義屬性'test'
var bar = {test: 12};
有兩種方式來訪問對象的屬性,點(diǎn)操作符或者中括號操作符。
var foo = {name: 'kitten'}
foo.name; // kitten
foo['name']; // kitten
var get = 'name';
foo[get]; // kitten
foo.1234; // SyntaxError
foo['1234']; // works
兩種語法是等價的,但是中括號操作符在下面兩種情況下依然有效
刪除屬性的唯一方法是使用 delete
操作符;設(shè)置屬性為 undefined
或者 null
并不能真正的刪除屬性,
而僅僅是移除了屬性和值的關(guān)聯(lián)。
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]);
}
}
上面的輸出結(jié)果有 bar undefined
和 foo null
- 只有 baz
被真正的刪除了,所以從輸出結(jié)果中消失。
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 解析器的另一個錯誤設(shè)計(jì),
上面的第二種聲明方式在 ECMAScript 5 之前會拋出 SyntaxError
的錯誤。
這個錯誤的原因是 delete
是 JavaScript 語言的一個關(guān)鍵詞;因此為了在更低版本的 JavaScript 引擎下也能正常運(yùn)行,
必須使用*
字符串字面值*聲明方式。