国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JS語言精粹--對象

20171112 / 1526人閱讀

摘要:屬性值可以從包括另一個對象字面量在內(nèi)的任意表達(dá)式中獲得,而對象是可嵌套的。所有通過字面量創(chuàng)建的對象,都連接到這個中的標(biāo)準(zhǔn)的對象。

這篇文章算是我職業(yè)生涯中的第一篇技術(shù)博文吧,有些地方可能表達(dá)得不是很好,還望大家多多包涵哈^_^!

正文

JavaScript的簡單類型有數(shù)字、字符串、布爾值(true、false)、null值和underfind值,其他所有的值都是對象。

數(shù)字、字符串和布爾值“貌似”是對象,因為它們都擁有方法,但是它們是不可變的。而JavaScript中的對象是可控的鍵控集合

在JavaScript中,數(shù)組是對象,函數(shù)是對象,正則表達(dá)式是對象,當(dāng)然,對象自然也是對象。

對象是屬性的容器,其中每個屬性都擁有名字和值(name-value)。屬性名可以是包括字符串在內(nèi)的任意字符串,屬性值可以是除undefined值之外的任意值。

JavaScript中的對象是無類別(class-free)的,它對新屬性的名字和值沒有約束。對象適合用于收集和管理數(shù)據(jù)。對象可以包含其他對象,所以它們可以容易的表示成樹形或圖形結(jié)構(gòu)。

JavaScript包括一個原型鏈特性(這是JS對象中很重要的一個特性,具體用法以后我會發(fā)一篇針對原型鏈及其用法的文章進行專門說明),允許對象繼承另一個對象的屬性,正確地使用它能減少對象初始化的時間和內(nèi)存耗損。

1. 對象字面量

對象字面量,提供了一種非常方便的創(chuàng)建新對象值得表示法,即包圍在一對花括號中的零個或多個“名/值”對(也稱為鍵值對),它可以出現(xiàn)在任何允許表達(dá)式出現(xiàn)的地方。

javascriptvar empty_object = {};
var batman = {
    "first-name": "Bruce",
    "last-name": "Wayne"
};

屬性名可以是包括空字符串在內(nèi)的任何字符串,不過,一個合法的變量標(biāo)識符,不能是保留字,雖然不強調(diào)用引號括住,但是,像“first-name”、“first name”這類含有“-”或是空格的屬性名,是必須加上引號括住的。逗號用來分隔多個“名/值”對。

屬性值可以從包括另一個對象字面量在內(nèi)的任意表達(dá)式中獲得,而對象是可嵌套的。

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. 檢索

要檢索對象中包含的值(或?qū)傩灾祷蚍椒ɑ蚱渌梢圆捎迷?[] 后綴中括住一個字符串表達(dá)式的方式,如果字符串表達(dá)式是一個合法js標(biāo)識符且不為保留字的常數(shù),那么優(yōu)先考慮用 . 表示法,因為它更緊湊且可讀性更好。

javascriptbatman["first-name"]    // "Bruce"
flight.departure.city   // "shenzhen"

如果你嘗試檢索一個并不存在的成員元素的值(這里的屬性表達(dá)式是嚴(yán)格區(qū)分大小寫的),將返回一個undefined值。

javascriptbatman["middle-name"]   // undefined
flight.status           // undefined
batman["FIRST-NAME"]    // undefined

|| 運算符可以用來填充默認(rèn)值:

javascriptvar middle = batman["middle-name"] || "(none)";
var status = flight.status || "unknown";

嘗試檢索一個undefined值將會導(dǎo)致TypeError異常,這可以通過 && 運算符來避免錯誤。

javascriptflight.equipment                             // undefined
flight.equipment.model                       // throw "TypeError"
flight.equipment && flight.equipment.model   // undefined
3. 更新

對象中的值可以通過賦值語句來更新。

如果屬性名已經(jīng)存在于對象中,那么這個屬性值將被替換。

javascriptbatman["first-name"] = "Damian";

如果對象之前并沒有這個屬性名,那么該屬性將會被擴充到該對象中。

javascriptbatman["middle-name"] = "AI";
batman["nickname"] = "Robin";
flight.equipment = {
    model: "Boeing 777"
};
flight.status = "overdue";
4. 引用

對象通過引用來傳遞,它們永遠(yuǎn)不會被拷貝。

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. 原型

每個對象都會連接到一個原型對象,并且它可以從中繼承屬性。所有通過字面量創(chuàng)建的對象,都連接到 Object.prototype 這個JS中的標(biāo)準(zhǔn)的對象。

當(dāng)創(chuàng)建一個新對象時,可以選擇某個對象作為它的原型,給Object增加一個beget方法,這個beget方法創(chuàng)建一個使用原對象作為其原型的新對象,這個我們以后會在專門的博文做詳細(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);

原型連接在更新時是不起作用的,當(dāng)我們對某個對象做出改變時,不會觸及到該對象的原型:

javascriptnext_batman["first-name"] = "Damian55";
next_batman["middle-name"] = "Ai22";
next_batman.nickname = "Robin5";

原型連接只有在檢索值的時候才會被用到。如果我們嘗試去獲取對象的某個屬性值,且該對象沒有該屬性名,那么,JS會試著從原型對象中獲取屬性值,如果那個原型對象也沒有該屬性,則再從它的原型中尋找,以此類推,直到最后到達(dá)終點Object.prototype,若想要的屬性完全不存在于原型鏈中,則返回undefined值,這個過程稱為委托

原型關(guān)系是一種動態(tài)的關(guān)系,如果我們在原型中添加一個新的屬性,該屬性會立即對所有基于該原型創(chuàng)建的對象可見。

javascriptbatman.profession = "JSL";
next_batman.profession;      // "JSL"
6. 反射

檢查對象并確認(rèn)對象有什么屬性,可以去檢索該屬性并驗證取得的值。而確定屬性的類型,可以使用typeof操作符。

javascripttypeof flight.number        // "number"
typeof flight.status        // "string"
typeof flight.arrival       // "object"
typeof flight.manifast      // "undefined"

請務(wù)必注意原型鏈中的任何屬性也會產(chǎn)生一個值:

javascripttypeof flight.toString      // "function"
typeof flight.constructor   // "function"

有兩種方法去處理這些不需要的屬性:

讓你的程序檢查并剔除函數(shù)值,一般來說,做反射的目標(biāo)是數(shù)據(jù),因此其中一些值可能會是函數(shù)。

使用hasOwnProperty方法,如果對象擁有獨立屬性,它將返回true。

另外,hasOwnProperty方法不會檢查原型鏈。

javascriptflight.hasOwnProperty("number");        // true
flight.hasOwnProperty("constructor");   // false
7. 枚舉

for in 語句可用來遍歷一個對象中的所有屬性名,當(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)建一個數(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運算符可以用來刪除對象的屬性,它將會移除該對象的確定包含的屬性,它不會觸及原型鏈中的任何對象。

刪除對象的屬性可能會讓來自原型鏈中的屬性浮現(xiàn)出來。

javascriptnext_batman.nickname        // "Robin5"
// 刪除next_batman的nickname屬性,從而暴露出原型的nickname的屬性值
delete next_batman.nickname; 
next_batman.nickname;       // "Robin"
9. 減少全局變量污染

JS可以隨意定義可保存所有應(yīng)用資源的全局變量,不幸的是,全局變量會削弱程序的靈活性,所以應(yīng)該避免。

最小化使用全局變量的一個方法是在你的應(yīng)用中只創(chuàng)建唯一一個全局變量:

javascriptvar MyApp = {};

該變量此時變成了你的應(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"
    }
};

只要把多個全局變量都整理在同一個命名空間下,你將顯著降低與其他應(yīng)用程序、組件或類庫之間產(chǎn)生糟糕的相互影響(即耦合度高)的可能性,也使其變得更容易閱讀,因為MyApp.batman指向的時頂層結(jié)構(gòu)。當(dāng)然,也可以使用閉包來進行信息隱藏,它是另一種有效減少全局污染的方法。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/85843.html

相關(guān)文章

  • 《javascript語言精粹》學(xué)習(xí)筆記 - 繼承

    摘要:但采用構(gòu)造器調(diào)用模式,即是使用了前綴去調(diào)用一個函數(shù)時,函數(shù)執(zhí)行的方式會改變。對象包含構(gòu)造器需要構(gòu)造一個新的實例的所有信息。構(gòu)造器的變量和內(nèi)部函數(shù)變成了該實例的私有成員。 JavaScript 是一門弱類型語言,從不需要類型轉(zhuǎn)換。對象繼承關(guān)系變得無關(guān)緊要。對于一個對象來說重要的時它能夠做什么,而不是它從哪里來。 閱讀《javascript語言精粹》筆記! 偽類 js的原型存...

    harriszh 評論0 收藏0
  • 【閱讀筆記】JavaScript語言精粹

    摘要:對之前看高級程序設(shè)計時沒有注意到的一些知識點,結(jié)合本書做以補充語法注釋源于的型既可以出現(xiàn)在字符串字面量中,也可能出現(xiàn)在正則表達(dá)式字面量中,如故一般建議使用型注釋保留字語句變量參數(shù)屬性名運算符和標(biāo)記等標(biāo)識符不允許使用保留字,此外在對象字面量中 對之前看《JavaScript高級程序設(shè)計》時沒有注意到的一些知識點,結(jié)合本書做以補充 語法 注釋 源于PL/I的/* */型既可以出現(xiàn)在字符串字...

    cucumber 評論0 收藏0
  • 【閱讀筆記】javascript 語言精粹

    摘要:前言由于最近的項目用到了一些的代碼,所以我?guī)е闷嫘模J(rèn)真閱讀了這本書,粗略地了解語言的基本結(jié)構(gòu)和特性,對于一些不熟悉的新概念,以記錄的形式加強印象,也是對學(xué)習(xí)的反思總結(jié)。 前言 由于最近的項目用到了一些js的代碼,所以我?guī)е闷嫘模J(rèn)真閱讀了這本書,粗略地了解js語言的基本結(jié)構(gòu)和特性,對于一些不熟悉的新概念,以記錄的形式加強印象,也是對學(xué)習(xí)的反思總結(jié)。 一、字面量(literals...

    tangr206 評論0 收藏0
  • 《javascript語言精粹》學(xué)習(xí)筆記 - 對象

    摘要:對象適用于匯集和管理數(shù)據(jù)。一個對象字面量就是包圍在一對花括號的多個名值對。嘗試從對象里取值將會導(dǎo)致異常。亦不會觸及原型鏈中的任何對象。嚴(yán)格模式下,不能用刪除顯式聲明的標(biāo)識符,名稱或具名函數(shù)。 Javascirpt里的對象是無類型的。它對新屬性的名字和屬性的值沒有任何的限制。對象適用于匯集和管理數(shù)據(jù)。對象可以包括其他對象,所以它們可以容易地表示成樹狀或者圖形結(jié)構(gòu)。 對象字面量 ...

    LoftySoul 評論0 收藏0
  • 前端—初級階段4(13-15)—JavaScript語言精粹

    摘要:調(diào)用函數(shù)時,被綁定到全局對象。如果使用構(gòu)造器調(diào)用有前綴,且返回不是一個對象,則返回該新對象。閉包會導(dǎo)致原有作用域鏈不釋放,造成內(nèi)存泄漏。當(dāng)采用構(gòu)造器調(diào)用模式,函數(shù)執(zhí)行的方式會被修改。 內(nèi)容 ECMAScript核心語法結(jié)構(gòu):1.語法2.對象3.函數(shù)4.繼承5.數(shù)組6.正則表達(dá)式7.方法8.附錄A-毒瘤9.附錄B-糟粕 一、語法 1.類型、值和變量 1) 類型:區(qū)分?jǐn)?shù)據(jù)類型 在JS中使...

    iflove 評論0 收藏0
  • 前端—初級階段4(13-15)—JavaScript語言精粹

    摘要:調(diào)用函數(shù)時,被綁定到全局對象。如果使用構(gòu)造器調(diào)用有前綴,且返回不是一個對象,則返回該新對象。閉包會導(dǎo)致原有作用域鏈不釋放,造成內(nèi)存泄漏。當(dāng)采用構(gòu)造器調(diào)用模式,函數(shù)執(zhí)行的方式會被修改。 內(nèi)容 ECMAScript核心語法結(jié)構(gòu):1.語法2.對象3.函數(shù)4.繼承5.數(shù)組6.正則表達(dá)式7.方法8.附錄A-毒瘤9.附錄B-糟粕 一、語法 1.類型、值和變量 1) 類型:區(qū)分?jǐn)?shù)據(jù)類型 在JS中使...

    Wuv1Up 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<