摘要:屬性值可以從包括另一個(gè)對(duì)象字面量在內(nèi)的任意表達(dá)式中獲得,而對(duì)象是可嵌套的。所有通過字面量創(chuàng)建的對(duì)象,都連接到這個(gè)中的標(biāo)準(zhǔn)的對(duì)象。
這篇文章算是我職業(yè)生涯中的第一篇技術(shù)博文吧,有些地方可能表達(dá)得不是很好,還望大家多多包涵哈^_^!
正文JavaScript的簡(jiǎn)單類型有數(shù)字、字符串、布爾值(true、false)、null值和underfind值,其他所有的值都是對(duì)象。
數(shù)字、字符串和布爾值“貌似”是對(duì)象,因?yàn)樗鼈兌紦碛蟹椒?,但是它們是不可變的。而JavaScript中的對(duì)象是可控的鍵控集合
在JavaScript中,數(shù)組是對(duì)象,函數(shù)是對(duì)象,正則表達(dá)式是對(duì)象,當(dāng)然,對(duì)象自然也是對(duì)象。
對(duì)象是屬性的容器,其中每個(gè)屬性都擁有名字和值(name-value)。屬性名可以是包括字符串在內(nèi)的任意字符串,屬性值可以是除undefined值之外的任意值。
JavaScript中的對(duì)象是無類別(class-free)的,它對(duì)新屬性的名字和值沒有約束。對(duì)象適合用于收集和管理數(shù)據(jù)。對(duì)象可以包含其他對(duì)象,所以它們可以容易的表示成樹形或圖形結(jié)構(gòu)。
JavaScript包括一個(gè)原型鏈特性(這是JS對(duì)象中很重要的一個(gè)特性,具體用法以后我會(huì)發(fā)一篇針對(duì)原型鏈及其用法的文章進(jìn)行專門說明),允許對(duì)象繼承另一個(gè)對(duì)象的屬性,正確地使用它能減少對(duì)象初始化的時(shí)間和內(nèi)存耗損。
1. 對(duì)象字面量對(duì)象字面量,提供了一種非常方便的創(chuàng)建新對(duì)象值得表示法,即包圍在一對(duì)花括號(hào)中的零個(gè)或多個(gè)“名/值”對(duì)(也稱為鍵值對(duì)),它可以出現(xiàn)在任何允許表達(dá)式出現(xiàn)的地方。
javascriptvar empty_object = {}; var batman = { "first-name": "Bruce", "last-name": "Wayne" };
屬性名可以是包括空字符串在內(nèi)的任何字符串,不過,一個(gè)合法的變量標(biāo)識(shí)符,不能是保留字,雖然不強(qiáng)調(diào)用引號(hào)括住,但是,像“first-name”、“first name”這類含有“-”或是空格的屬性名,是必須加上引號(hào)括住的。逗號(hào)用來分隔多個(gè)“名/值”對(duì)。
屬性值可以從包括另一個(gè)對(duì)象字面量在內(nèi)的任意表達(dá)式中獲得,而對(duì)象是可嵌套的。
javascriptvar flight = { airline: "Domestic", number: 1024, departure: { IATA: "SZ", time: "2015-08-03 15:00:00", city: "shenzhen" }, arrival: { IATA: "BJ", time: "2015-08-04 00:00:00", city: "beijing" } };2. 檢索
要檢索對(duì)象中包含的值(或?qū)傩灾祷蚍椒ɑ蚱渌?,可以采用?[] 后綴中括住一個(gè)字符串表達(dá)式的方式,如果字符串表達(dá)式是一個(gè)合法js標(biāo)識(shí)符且不為保留字的常數(shù),那么優(yōu)先考慮用 . 表示法,因?yàn)樗o湊且可讀性更好。
javascriptbatman["first-name"] // "Bruce" flight.departure.city // "shenzhen"
如果你嘗試檢索一個(gè)并不存在的成員元素的值(這里的屬性表達(dá)式是嚴(yán)格區(qū)分大小寫的),將返回一個(gè)undefined值。
javascriptbatman["middle-name"] // undefined flight.status // undefined batman["FIRST-NAME"] // undefined
|| 運(yùn)算符可以用來填充默認(rèn)值:
javascriptvar middle = batman["middle-name"] || "(none)"; var status = flight.status || "unknown";
嘗試檢索一個(gè)undefined值將會(huì)導(dǎo)致TypeError異常,這可以通過 && 運(yùn)算符來避免錯(cuò)誤。
javascriptflight.equipment // undefined flight.equipment.model // throw "TypeError" flight.equipment && flight.equipment.model // undefined3. 更新
對(duì)象中的值可以通過賦值語句來更新。
如果屬性名已經(jīng)存在于對(duì)象中,那么這個(gè)屬性值將被替換。
javascriptbatman["first-name"] = "Damian";
如果對(duì)象之前并沒有這個(gè)屬性名,那么該屬性將會(huì)被擴(kuò)充到該對(duì)象中。
javascriptbatman["middle-name"] = "AI"; batman["nickname"] = "Robin"; flight.equipment = { model: "Boeing 777" }; flight.status = "overdue";4. 引用
對(duì)象通過引用來傳遞,它們永遠(yuǎn)不會(huì)被拷貝。
javascriptvar x = batman; x.nickname = "Joker"; var nick = batman.nickname; // 因?yàn)閤和batman是指向同一個(gè)對(duì)象的引用,所以nick為"Joker" var a = {},b = {},c = {}; // a、b、c 每個(gè)都分別引用一個(gè)不同的空對(duì)象 a = b = c = {}; // a、b、c 都引用一個(gè)相同的空對(duì)象5. 原型
每個(gè)對(duì)象都會(huì)連接到一個(gè)原型對(duì)象,并且它可以從中繼承屬性。所有通過字面量創(chuàng)建的對(duì)象,都連接到 Object.prototype 這個(gè)JS中的標(biāo)準(zhǔn)的對(duì)象。
當(dāng)創(chuàng)建一個(gè)新對(duì)象時(shí),可以選擇某個(gè)對(duì)象作為它的原型,給Object增加一個(gè)beget方法,這個(gè)beget方法創(chuàng)建一個(gè)使用原對(duì)象作為其原型的新對(duì)象,這個(gè)我們以后會(huì)在專門的博文做詳細(xì)了解。
javascriptif(typeof Object.beget !== "function"){ Object.beget = function(o){ var F = function(){}; F.prototype = o; return new F(); }; }; var next_batman = Object.beget(batman);
原型連接在更新時(shí)是不起作用的,當(dāng)我們對(duì)某個(gè)對(duì)象做出改變時(shí),不會(huì)觸及到該對(duì)象的原型:
javascriptnext_batman["first-name"] = "Damian55"; next_batman["middle-name"] = "Ai22"; next_batman.nickname = "Robin5";
原型連接只有在檢索值的時(shí)候才會(huì)被用到。如果我們嘗試去獲取對(duì)象的某個(gè)屬性值,且該對(duì)象沒有該屬性名,那么,JS會(huì)試著從原型對(duì)象中獲取屬性值,如果那個(gè)原型對(duì)象也沒有該屬性,則再?gòu)乃脑椭袑ふ?,以此類推,直到最后到達(dá)終點(diǎn)Object.prototype,若想要的屬性完全不存在于原型鏈中,則返回undefined值,這個(gè)過程稱為委托。
原型關(guān)系是一種動(dòng)態(tài)的關(guān)系,如果我們?cè)谠椭刑砑右粋€(gè)新的屬性,該屬性會(huì)立即對(duì)所有基于該原型創(chuàng)建的對(duì)象可見。
javascriptbatman.profession = "JSL"; next_batman.profession; // "JSL"6. 反射
檢查對(duì)象并確認(rèn)對(duì)象有什么屬性,可以去檢索該屬性并驗(yàn)證取得的值。而確定屬性的類型,可以使用typeof操作符。
javascripttypeof flight.number // "number" typeof flight.status // "string" typeof flight.arrival // "object" typeof flight.manifast // "undefined"
請(qǐng)務(wù)必注意原型鏈中的任何屬性也會(huì)產(chǎn)生一個(gè)值:
javascripttypeof flight.toString // "function" typeof flight.constructor // "function"
有兩種方法去處理這些不需要的屬性:
讓你的程序檢查并剔除函數(shù)值,一般來說,做反射的目標(biāo)是數(shù)據(jù),因此其中一些值可能會(huì)是函數(shù)。
使用hasOwnProperty方法,如果對(duì)象擁有獨(dú)立屬性,它將返回true。
另外,hasOwnProperty方法不會(huì)檢查原型鏈。
javascriptflight.hasOwnProperty("number"); // true flight.hasOwnProperty("constructor"); // false7. 枚舉
for in 語句可用來遍歷一個(gè)對(duì)象中的所有屬性名,當(dāng)然,也包括函數(shù)和我們可能不關(guān)心的原型中的屬性,所以我們有必要過濾掉不必要的值。
最常用的過濾器(即過濾原型中的屬性)是hasOwnProperty方法,以及使用typeof來排除函數(shù):
javascriptvar name; for(name in next_batman){ if(typeof next_batman[name] !== "function"){ document.writeln(name + ": " + next_batman[name]); } }
以上,屬性名出現(xiàn)的順序是不確定的,因此要想確保屬性以特定的順序出現(xiàn),最好是完全避免使用 for in 語句,而是創(chuàng)建一個(gè)數(shù)組,在其中以正確的順序包含屬性名:
javascriptvar i; var properties = ["first-name","middle-name","last-name","profession"]; for(i = 0;i < properties.length;i ++){ document.writeln(properties[i] + ": " + next_batman[properties[i]]); }
通過使用普通for而不是for in ,可以得到我們想要的屬性,而不用擔(dān)心可能發(fā)掘出原型鏈中的屬性,并按正確的順序取得它們的值。
8. 刪除delete運(yùn)算符可以用來刪除對(duì)象的屬性,它將會(huì)移除該對(duì)象的確定包含的屬性,它不會(huì)觸及原型鏈中的任何對(duì)象。
刪除對(duì)象的屬性可能會(huì)讓來自原型鏈中的屬性浮現(xiàn)出來。
javascriptnext_batman.nickname // "Robin5" // 刪除next_batman的nickname屬性,從而暴露出原型的nickname的屬性值 delete next_batman.nickname; next_batman.nickname; // "Robin"9. 減少全局變量污染
JS可以隨意定義可保存所有應(yīng)用資源的全局變量,不幸的是,全局變量會(huì)削弱程序的靈活性,所以應(yīng)該避免。
最小化使用全局變量的一個(gè)方法是在你的應(yīng)用中只創(chuàng)建唯一一個(gè)全局變量:
javascriptvar MyApp = {};
該變量此時(shí)變成了你的應(yīng)用容器:
javascriptMyApp.batman = { "first-name": "Bruce", "last-name": "Wayne" }; MyApp.flight = { airline: "Domestic", number: 1024, departure: { IATA: "SZ", time: "2015-08-03 15:00:00", city: "shenzhen" }, arrival: { IATA: "BJ", time: "2015-08-04 00:00:00", city: "beijing" } };
只要把多個(gè)全局變量都整理在同一個(gè)命名空間下,你將顯著降低與其他應(yīng)用程序、組件或類庫之間產(chǎn)生糟糕的相互影響(即耦合度高)的可能性,也使其變得更容易閱讀,因?yàn)镸yApp.batman指向的時(shí)頂層結(jié)構(gòu)。當(dāng)然,也可以使用閉包來進(jìn)行信息隱藏,它是另一種有效減少全局污染的方法。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85843.html
摘要:但采用構(gòu)造器調(diào)用模式,即是使用了前綴去調(diào)用一個(gè)函數(shù)時(shí),函數(shù)執(zhí)行的方式會(huì)改變。對(duì)象包含構(gòu)造器需要構(gòu)造一個(gè)新的實(shí)例的所有信息。構(gòu)造器的變量和內(nèi)部函數(shù)變成了該實(shí)例的私有成員。 JavaScript 是一門弱類型語言,從不需要類型轉(zhuǎn)換。對(duì)象繼承關(guān)系變得無關(guān)緊要。對(duì)于一個(gè)對(duì)象來說重要的時(shí)它能夠做什么,而不是它從哪里來。 閱讀《javascript語言精粹》筆記! 偽類 js的原型存...
摘要:對(duì)之前看高級(jí)程序設(shè)計(jì)時(shí)沒有注意到的一些知識(shí)點(diǎn),結(jié)合本書做以補(bǔ)充語法注釋源于的型既可以出現(xiàn)在字符串字面量中,也可能出現(xiàn)在正則表達(dá)式字面量中,如故一般建議使用型注釋保留字語句變量參數(shù)屬性名運(yùn)算符和標(biāo)記等標(biāo)識(shí)符不允許使用保留字,此外在對(duì)象字面量中 對(duì)之前看《JavaScript高級(jí)程序設(shè)計(jì)》時(shí)沒有注意到的一些知識(shí)點(diǎn),結(jié)合本書做以補(bǔ)充 語法 注釋 源于PL/I的/* */型既可以出現(xiàn)在字符串字...
摘要:前言由于最近的項(xiàng)目用到了一些的代碼,所以我?guī)е闷嫘?,認(rèn)真閱讀了這本書,粗略地了解語言的基本結(jié)構(gòu)和特性,對(duì)于一些不熟悉的新概念,以記錄的形式加強(qiáng)印象,也是對(duì)學(xué)習(xí)的反思總結(jié)。 前言 由于最近的項(xiàng)目用到了一些js的代碼,所以我?guī)е闷嫘模J(rèn)真閱讀了這本書,粗略地了解js語言的基本結(jié)構(gòu)和特性,對(duì)于一些不熟悉的新概念,以記錄的形式加強(qiáng)印象,也是對(duì)學(xué)習(xí)的反思總結(jié)。 一、字面量(literals...
摘要:對(duì)象適用于匯集和管理數(shù)據(jù)。一個(gè)對(duì)象字面量就是包圍在一對(duì)花括號(hào)的多個(gè)名值對(duì)。嘗試從對(duì)象里取值將會(huì)導(dǎo)致異常。亦不會(huì)觸及原型鏈中的任何對(duì)象。嚴(yán)格模式下,不能用刪除顯式聲明的標(biāo)識(shí)符,名稱或具名函數(shù)。 Javascirpt里的對(duì)象是無類型的。它對(duì)新屬性的名字和屬性的值沒有任何的限制。對(duì)象適用于匯集和管理數(shù)據(jù)。對(duì)象可以包括其他對(duì)象,所以它們可以容易地表示成樹狀或者圖形結(jié)構(gòu)。 對(duì)象字面量 ...
摘要:調(diào)用函數(shù)時(shí),被綁定到全局對(duì)象。如果使用構(gòu)造器調(diào)用有前綴,且返回不是一個(gè)對(duì)象,則返回該新對(duì)象。閉包會(huì)導(dǎo)致原有作用域鏈不釋放,造成內(nèi)存泄漏。當(dāng)采用構(gòu)造器調(diào)用模式,函數(shù)執(zhí)行的方式會(huì)被修改。 內(nèi)容 ECMAScript核心語法結(jié)構(gòu):1.語法2.對(duì)象3.函數(shù)4.繼承5.數(shù)組6.正則表達(dá)式7.方法8.附錄A-毒瘤9.附錄B-糟粕 一、語法 1.類型、值和變量 1) 類型:區(qū)分?jǐn)?shù)據(jù)類型 在JS中使...
摘要:調(diào)用函數(shù)時(shí),被綁定到全局對(duì)象。如果使用構(gòu)造器調(diào)用有前綴,且返回不是一個(gè)對(duì)象,則返回該新對(duì)象。閉包會(huì)導(dǎo)致原有作用域鏈不釋放,造成內(nèi)存泄漏。當(dāng)采用構(gòu)造器調(diào)用模式,函數(shù)執(zhí)行的方式會(huì)被修改。 內(nèi)容 ECMAScript核心語法結(jié)構(gòu):1.語法2.對(duì)象3.函數(shù)4.繼承5.數(shù)組6.正則表達(dá)式7.方法8.附錄A-毒瘤9.附錄B-糟粕 一、語法 1.類型、值和變量 1) 類型:區(qū)分?jǐn)?shù)據(jù)類型 在JS中使...
閱讀 4728·2021-11-18 13:23
閱讀 906·2021-09-22 15:24
閱讀 1929·2021-09-06 15:00
閱讀 2635·2021-09-03 10:30
閱讀 1289·2021-09-02 15:15
閱讀 2079·2019-08-30 15:54
閱讀 3038·2019-08-30 15:44
閱讀 1462·2019-08-29 15:12