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