摘要:中的一切都可以視為對(duì)象,除了兩個(gè)特例和。上例中的第三個(gè)情形已說明刪除對(duì)象的屬性刪除屬性的唯一方法是使用,將屬性值設(shè)置為或只是移除了與屬性相關(guān)的值,并沒有真正刪除屬性本身。命名對(duì)象的屬性對(duì)象的屬性可以用普通字符或字符串來命名。
Javascript 中的一切都可以視為對(duì)象,除了兩個(gè)特例:null 和 undefined。
false.toString(); // "false" [1, 2, 3].toString(); // "1,2,3" function Foo(){} Foo.bar = 1; Foo.bar; // 1
一個(gè)經(jīng)常容易被誤解的就是數(shù)字常量不能視為對(duì)象,實(shí)際上數(shù)字常量仍然可以視為對(duì)象。這是因?yàn)?Javascript 解析器在解析點(diǎn)操作符時(shí)而將其視為浮點(diǎn)數(shù)特征而犯下的錯(cuò)誤。
2.toString(); // raises SyntaxError
實(shí)際上,我們有很多方法可以使得數(shù)字常量表現(xiàn)為一個(gè)對(duì)象。
2..toString(); // the second point is correctly recognized 2 .toString(); // note the space left to the dot (2).toString(); // 2 is evaluated first對(duì)象作為數(shù)據(jù)類型
Javascript 中的對(duì)象可以當(dāng)做哈希表使用,它們主要包含鍵與值的對(duì)應(yīng)關(guān)系。
使用 {} 符號(hào)來創(chuàng)建一個(gè)簡單的對(duì)象,這個(gè)新建的對(duì)象將從 Object.prototype 繼承而來,并且不包含自己定義的屬性。
var foo = {}; // a new empty object // a new object with a "test" property with value 12 var bar = {test: 12};訪問對(duì)象的屬性
我們可以使用兩種方式來訪問 Javascript 的對(duì)象,分別是點(diǎn)操作符 . 和中括號(hào)操作符 [] 。
var foo = {name: "kitten"} foo.name; // kitten foo["name"]; // kitten var get = "name"; foo[get]; // kitten foo.1234; // SyntaxError foo["1234"]; // works
兩種操作符的效果幾乎一樣,唯一的不同是中括號(hào)操作符允許動(dòng)態(tài)設(shè)置屬性而且屬性名可以有語法錯(cuò)誤。(上例中的第三個(gè)情形已說明)
刪除對(duì)象的屬性刪除屬性的唯一方法是使用 delete,將屬性值設(shè)置為 undefined 或 null 只是移除了與屬性相關(guā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]); } }
上面的輸出 bar undefined 和 foo null,只有 baz 真正被刪除。
這里要說明一點(diǎn),delete 只能刪除屬性,并不能刪除變量。所以我們在定義變量時(shí)一定要養(yǎng)成寫 var 的好習(xí)慣,任何時(shí)候,變量一定要使用 var 關(guān)鍵字才能聲明。因?yàn)槿绻粚?var,變量會(huì)被誤認(rèn)給全局對(duì)象創(chuàng)建了一個(gè)新屬性。
這個(gè)例子相當(dāng)清楚給出了答案,a 為變量,而 b 只是一個(gè)全局對(duì)象的屬性而已。
命名對(duì)象的屬性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 };
對(duì)象的屬性可以用普通字符或字符串來命名。同樣也是由于 Javascript 解析器的一個(gè)錯(cuò)誤設(shè)計(jì),上例中的第二種表示方法在 ECMAScript 5 中將會(huì)拋出一個(gè)錯(cuò)誤。
錯(cuò)誤的原因是因?yàn)?delete 是一個(gè)關(guān)鍵詞,所以必須使用一個(gè)字符串常量來命名來適應(yīng)老版的 Javascript 解析器。
http://bonsaiden.github.io/JavaScript-Garden/#object.general
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/78055.html
因?yàn)樽罱胁┯逊答佄业牟┪氖侵苯臃g的參考鏈接內(nèi)的內(nèi)容,所以我在這里要說明一下,以免引起不必要的誤會(huì)。 首先,我很喜歡 segmentfault 的交流和學(xué)習(xí)的氛圍,所以我很愿意在這里跟各位 SFer 交流學(xué)習(xí)心得,相互學(xué)習(xí),共同進(jìn)步。 第二,我做技術(shù)方面的工作不久,所以學(xué)習(xí)經(jīng)歷也不是很長,但是我發(fā)現(xiàn)寫博客,總結(jié)自己的學(xué)習(xí)心得是個(gè)很好的學(xué)習(xí)習(xí)慣,至少對(duì)于我個(gè)人而言,我于此收益頗豐,所以我決定堅(jiān)持一...
摘要:與其他編程語言相比,對(duì)的使用是一套完全不同的機(jī)制。在五種情況下的值是各有不同的。調(diào)用一個(gè)函數(shù)時(shí)在這里,同樣指向全局對(duì)象。此時(shí)在函數(shù)內(nèi),指向新建的對(duì)象。盡管,晚綁定初看上去是個(gè)不好的決定,但實(shí)際上這是原型式繼承工作的基礎(chǔ)。 與其他編程語言相比,Javascript 對(duì) this 的使用是一套完全不同的機(jī)制。this 在五種情況下的值是各有不同的。 全局作用域下 this; 當(dāng)在全...
摘要:并沒有類繼承模型,而是使用原型對(duì)象進(jìn)行原型式繼承。我們舉例說明原型鏈查找機(jī)制當(dāng)訪問一個(gè)對(duì)象的屬性時(shí),會(huì)從對(duì)象本身開始往上遍歷整個(gè)原型鏈,直到找到對(duì)應(yīng)屬性為止。原始類型有以下五種型。此外,試圖查找一個(gè)不存在屬性時(shí)將會(huì)遍歷整個(gè)原型鏈。 Javascript 并沒有類繼承模型,而是使用原型對(duì)象 prototype 進(jìn)行原型式繼承。 盡管人們經(jīng)常將此看做是 Javascript 的一個(gè)缺點(diǎn),然...
摘要:第二是,由于會(huì)遍歷整個(gè)原型鏈,所以當(dāng)原型鏈過長時(shí),會(huì)對(duì)性能造成影響??偨Y(jié)建議養(yǎng)成過濾屬性的好習(xí)慣,不要對(duì)運(yùn)行環(huán)境做任何假設(shè),也無論原生的原型對(duì)象是否被擴(kuò)展。 如同 in 運(yùn)算符一樣,使用 for in 循環(huán)遍歷對(duì)象屬性時(shí),也將往上遍歷整個(gè)原型鏈。 // Poisoning Object.prototype Object.prototype.bar = 1; var foo = {m...
摘要:方法是中唯一一個(gè)處理對(duì)象屬性而不會(huì)往上遍歷原型鏈的。在這里,只有能給出正確答案,這在遍歷一個(gè)對(duì)象的屬性時(shí)是非常必要的。這里還要提醒下,當(dāng)我們使用來遍歷對(duì)象時(shí),使用將會(huì)很好地避免來自原型對(duì)象擴(kuò)展所帶來的困擾。 判斷一個(gè)屬性是定義在對(duì)象本身而不是繼承自原型鏈,我們需要使用從 Object.prototype 繼承而來的 hasOwnProperty 方法。hasOwnProperty 方法...
閱讀 2539·2021-10-13 09:39
閱讀 3543·2021-09-30 09:52
閱讀 851·2021-09-26 09:55
閱讀 2829·2019-08-30 13:19
閱讀 1937·2019-08-26 10:42
閱讀 3231·2019-08-26 10:17
閱讀 593·2019-08-23 14:52
閱讀 3689·2019-08-23 14:39