JavaScript標(biāo)準(zhǔn)庫系列——Object對象和Array對象(一)

目錄

導(dǎo)語

1. Object對象

2. Array對象

3. 小結(jié)


導(dǎo)語

本系列文章將重點講解JavaScript提供的原生庫——標(biāo)準(zhǔn)庫,只要在支持JavaScript語言的平臺讼油,標(biāo)準(zhǔn)庫中的提供的對象的屬性和方法都能使用蚤告;


1. Object對象

1.1 Object對象的理解

講JavaScript的標(biāo)準(zhǔn)庫奕枝,首先要從Object對象談起鸠珠,因為之后的所有對象都可以看做是Object對象構(gòu)造出來的讼积;


因此,Object對象可以看做是一個構(gòu)造函數(shù)担平,可以創(chuàng)造新對象李剖;
同時Object對象本身可以當(dāng)作工具方法使用;

1.2 Object對象作為工具方法
  • Object對象自身的方法
    Object對象本身作為工具方法可以根據(jù)參數(shù)的數(shù)據(jù)類型不同返回對應(yīng)的包裝對象實例囤耳;

    不過篙顺,實際操作中使用Object對象生成對應(yīng)包裝對象的實例并不直觀,所以建議不要采用Object方法生成包裝對象的實例充择;
  • Object對象的靜態(tài)方法
    所謂“靜態(tài)方法”德玫,指部署在Object對象上的方法,更為直觀的理解是靜態(tài)方法等同于一直呆在Object對象這個“靜態(tài)”的對象上椎麦,非靜態(tài)方法是部署在原型對象prototype上的方法宰僧,要在實例被構(gòu)造函數(shù)動態(tài)創(chuàng)建才能使用;
    Object.keys()和Object.getOwnPropertyNames()
    兩個方法都能遍歷對象的屬性(自身的屬性而不是繼承的)观挎,不同之處在于Object.keys()只能遍歷可枚舉(enumberable)屬性琴儿;

    Object.defineProperty()和Object.defineProperties()
    前面我們已經(jīng)通過delete命令對象Object.defineProperty方法有了一定的了解;

    這個方法還有一個比較有意思的應(yīng)用嘁捷,就是實現(xiàn)數(shù)據(jù)的綁定造成;
//html
<div id="name"></div>
//js
var obj = Object.defineProperty({},"name",{
  set:function(name){
    document.getElementById('name').innerHTML=name
  },
  get:function(){
   console.log( document.getElementById('name').innerHTML
     ) 
   },
})
obj.name = "hello world"
obj.name

【demo】
Object.defineProperties可以一次性配置對象的多個屬性;


Object.create()可以創(chuàng)建一個實例對象雄嚣,但通常用于從原型對象生成新的實例對象以實現(xiàn)繼承機制晒屎;

var  Person = {
    race: 'monkey'
}
var Asian = Object.create(Person)
//等價于
var Person = function(){
    this.race='monkey'
}
var Asian = new Person()

Object.getPrototypeOf()和Object.setPrototypeOf()
如果還沒了解JavaScript的原型和繼承的知識點的,這部分可以先跳過缓升;
Object.getPrototypeOf()返回一個對象的原型鼓鲁,這是獲取原型對象的標(biāo)準(zhǔn)方法
Object.setPrototypeOf方法可以為現(xiàn)有對象設(shè)置原型港谊,返回一個新對象骇吭,該方法接受兩個參數(shù),第一個是現(xiàn)有對象歧寺,第二個是原型對象绵跷;


關(guān)于原型和繼承的知識點膘螟,詳見【JavaScript的創(chuàng)世神話——一切源于對象】

1.3 Object對象的實例方法
  • Object作為構(gòu)造函數(shù)
    Object作為構(gòu)造函數(shù)可以創(chuàng)建實例對象;
var person = new Object();
var pesoon = new Object(new);
//創(chuàng)建對象方法還有碾局;
var person = {};
var person = Object.create(null);

構(gòu)造函數(shù)內(nèi)可以傳參荆残;

var person = new Object();
person.name = "teren";
person.age = 18;
//等價于
var person = new Object({name:"teren",age:18});
  • Object構(gòu)造函數(shù)的實例的屬性個方法
    由Object構(gòu)造函數(shù)構(gòu)造的實例的屬性和方法,即部署在Object.prototype對象的屬性和方法净当,屬于所有實例的“公共屬性和方法”内斯,關(guān)于prototype原型對象小羊?qū)?strong>《面向?qū)ο缶幊趟枷搿?/strong>一章詳細(xì)闡述;
    部署在Object.prototype對象的常見方法包括:

    constructor屬性
    constructor屬性返回實例的構(gòu)造函數(shù)像啼,即哪個構(gòu)造函數(shù)創(chuàng)造了實例俘闯;
    上述person實例的構(gòu)造函數(shù)就是Object這一構(gòu)造函數(shù);
    hasOwnProperty()方法
    hasOwnProperty()方法判斷傳入的參數(shù)是否是實例自身的屬性忽冻;

    上圖顯示name是實例自身的屬性真朗,toString是繼承自Object.prototype對象的屬性;
    isPrototypeOf()方法
    isPrototypeOf()方法用于判斷實例是否是作為參數(shù)傳入的另一個對象的原型對象僧诚;

    上圖teren_sonteren創(chuàng)造遮婶,所以terenteren_son的原型對象,故teren.isPrototypeOf(teren_son)為true湖笨;
    valueOf()方法和toString()方法
    這兩個方法很重要旗扑,在《JavaScript數(shù)據(jù)類型(四)》中,小羊提到了數(shù)據(jù)類型轉(zhuǎn)換的方法慈省,其中其他類型數(shù)據(jù)在轉(zhuǎn)換為數(shù)值和字符串過程中js引擎就調(diào)用這兩個方法臀防;
    valueOf()方法
    很好理解的是valueOf()方法就是返回實例的值,實例是什么數(shù)據(jù)類型值就返回什么類型边败;

    具體通過調(diào)用valueOf()方法進行數(shù)據(jù)轉(zhuǎn)換的規(guī)則袱衷,在后面講完包裝對象Number()String()才進行闡述,因為要運用到這兩個對象的知識點笑窜;
    toString()方法
    toString()方法返回實例對象的字符串祟昭;
    實例對象直接調(diào)用toString()方法返回對應(yīng)字符串,注意對象類型和數(shù)組類型數(shù)據(jù)比較特殊怖侦;

    使用Object.prototype.toString.call()方法調(diào)用將返回數(shù)據(jù)類型數(shù)組篡悟;

    這個方法也是經(jīng)常用來判斷數(shù)據(jù)類型,可參見小羊之前的文章《JavaScript數(shù)據(jù)類型(四)》的通用庫的初步創(chuàng)建與對象的深淺拷貝章節(jié)匾寝;

2.Array對象

如果真的要給標(biāo)準(zhǔn)庫的各個對象排個名單的話搬葬,那么Array對象肯定能進前兩名,因為JavaScript的網(wǎng)頁應(yīng)用的數(shù)據(jù)一定是離不開Array對象的方法的艳悔;
關(guān)于Array對象急凰,小羊的經(jīng)驗是只要重點掌握Array對象的實例方法;
雖然Array對象可以用來創(chuàng)建數(shù)組,但是直接使用字面量的形式例如[1,2,3]更簡便抡锈;

2.1 Array對象的實例方法
  • Array對象的實例的方法
    添加數(shù)組元素方法

push:從數(shù)組最后一位添加元素疾忍,返回新的數(shù)組長度,改變原數(shù)組床三;
unshift:從數(shù)組第一位添加元素一罩,返回新的數(shù)組長度,改變原數(shù)組撇簿;


刪除數(shù)組元素方法

pop:刪除數(shù)組最后一個元素聂渊,返回該元素,改變原數(shù)組四瘫;
shift:刪除數(shù)組第一個元素汉嗽,返回該元素,改變原數(shù)組找蜜;

增刪一體方法

splice:具有刪除和增加數(shù)組元素一體的功能饼暑,第一個參數(shù)是刪除元素的起始位,第二個是刪除的個數(shù)洗做,第三個之后是需要增加的元素弓叛,最終返回刪除的數(shù)組元素,改變原數(shù)組竭望;
傳遞3個參數(shù),第二個參數(shù)為0裕菠,即不刪除只添加元素咬清,可是實現(xiàn)任意位置的增加操作;
傳遞2個參數(shù)實現(xiàn)任意位置的刪除操作奴潘;
傳遞1個參數(shù)實現(xiàn)數(shù)組在該參數(shù)位置分段旧烧;


可利用splice()方法實現(xiàn)在任意位置上的增刪元素,因此可以作為push画髓、pop掘剪、shiftunshift的替代方法;
格式化數(shù)組方法

join:傳遞一個參數(shù)作為分隔符奈虾,將所有數(shù)組元素按字符串形式返回夺谁,元素間包含分隔符,默認(rèn)以逗號作為分隔符肉微,不改變原數(shù)組匾鸥;


合并數(shù)組方法

concat:實現(xiàn)多個數(shù)組合并,返回新數(shù)組碉纳,不改變原數(shù)組勿负;


反轉(zhuǎn)數(shù)組方法

reverse:反轉(zhuǎn)數(shù)組,返回反轉(zhuǎn)數(shù)組劳曹,改變原數(shù)組奴愉;


提取數(shù)組元素方法

slice:提取原數(shù)組一部分琅摩,可傳2個參數(shù),第一個為起始位锭硼,第二個是結(jié)束位(不包含該位的元素)房资,返回新數(shù)組,不改變原數(shù)組账忘;
只傳1個參數(shù)提取以該參數(shù)為起始位后的所有元素志膀;
不傳參數(shù)提取所有元素;

[注]
對于類數(shù)組對象鳖擒,如果要將其變?yōu)閿?shù)組溉浙,可以使用Array.prototype.slice.call()方法

var obj = {0:1,1:2,2:3,length:3}
var arr2 = [].slice.call(obj)
arr2//[1,2,3]

遍歷方法

map:對所有數(shù)組元素依次調(diào)用一個函數(shù),接受一個函數(shù)作為參數(shù)蒋荚,arr.map(function(elem,index,arr){})戳稽,一般具有返回值(新數(shù)組);

forEach:和map方法類似期升,但一般不具有返回值惊奇,只用于數(shù)據(jù)操作;

filter:用于篩選數(shù)組元素播赁,接受一個函數(shù)作為參數(shù)颂郎,返回結(jié)果為true的成員組成一個新數(shù)組返回;


以上遍歷的3個方法都不改變原數(shù)組容为;
[JavaScript Tricks]
類數(shù)組對象如string要遍歷乓序,無相關(guān)方法;
調(diào)用數(shù)組對象的實例方法坎背;

Array.prototype.forEach.call(likeArray,function(){});
[].forEach.call(likeArray,function(){});

排序方法

sort:對數(shù)組元素進行排序替劈,默認(rèn)是按照字符編碼的序號對每一位進行排序;

實現(xiàn)自定義排序的方法可以傳入一個函數(shù)給sort方法得滤,函數(shù)又可插入兩個用作比較的數(shù)組元素的形參陨献;


第一個由小到大的排序意思是當(dāng)前一位減后一位大于0時,才移位懂更,因此最終實現(xiàn)較小的在前眨业,較大的在后;


3. 小結(jié)

通過全文沮协,我們了解到:

  • Object對象是所有對象的鼻祖坛猪,標(biāo)準(zhǔn)庫提供的Object對象既可以當(dāng)做工具方法使用,又可以當(dāng)做構(gòu)造函數(shù)使用皂股;
  • Object對象作為工具方法時墅茉,Object()方法去包裝數(shù)據(jù),Object.keys()、Object.getOwnPropertyNames去遍歷對象屬性就斤,Object.defineProperty()和Object.definePropertyies()去配置屬性悍募,Object.create()傳入一個原型對象去創(chuàng)建子對象,Object.getPrototypeOf()和Object.setPrototypeOf()分別是獲取和設(shè)置一個對象的原型對象洋机;
  • Object對象作為構(gòu)造函數(shù)可以創(chuàng)建一個對象實例坠宴,可通過點操作和方括號操作去讀寫對象的屬性和方法;實例對象的方法有hasOwnProperty()绷旗、isPrototypeOf()喜鼓、valueOf()和toString()
  • Array對象部分主要講解Array實例的方法衔肢;
  • 添加數(shù)組元素的方法有push()和unshift()庄岖,返回數(shù)組長度,改變原數(shù)組角骤;
  • 刪除數(shù)組元素的方法有pop()和shift()隅忿,返回刪除元素,改變原數(shù)組邦尊;
  • 增刪一體方法spllice()背桐,傳3個參數(shù)時,第1個為起始位蝉揍,第2個為刪除個數(shù)链峭,第3個之后為增加的元素;第2個為0時又沾,只增不刪弊仪;傳2個參數(shù)只刪不增;傳1個參數(shù)實現(xiàn)位置分段捍掺;
  • 數(shù)據(jù)格式化方法join()撼短,根據(jù)傳入?yún)?shù)的分隔符返回字符串再膳;
  • 合并數(shù)組的方法concat(),實現(xiàn)多個數(shù)組合并挺勿;
  • 反轉(zhuǎn)數(shù)組方法reverse(),將數(shù)組元素逆序排列喂柒;
  • 提取元素方法slice()不瓶,傳2個參數(shù),第1個為起始位灾杰,第2個為結(jié)束位(不包括結(jié)束位)蚊丐;傳1個參數(shù)即只有起始位;不傳參數(shù)艳吠,獲取所有數(shù)組元素麦备;
  • 遍歷方法有3個map、forEach和filter,map返回值凛篙,forEach只處理數(shù)據(jù)黍匾,filter通常用于篩選;
  • 排序方法sort:對數(shù)組元素排序呛梆,默認(rèn)按照字符編碼的序號對每一位進行排序锐涯,可傳遞函數(shù)作為參數(shù)實現(xiàn)自定義排序;

參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末填物,一起剝皮案震驚了整個濱河市纹腌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌滞磺,老刑警劉巖升薯,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異雁刷,居然都是意外死亡覆劈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門沛励,熙熙樓的掌柜王于貴愁眉苦臉地迎上來责语,“玉大人,你說我怎么就攤上這事目派±ず颍” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵企蹭,是天一觀的道長白筹。 經(jīng)常有香客問我,道長谅摄,這世上最難降的妖魔是什么徒河? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮送漠,結(jié)果婚禮上顽照,老公的妹妹穿的比我還像新娘。我一直安慰自己闽寡,他們只是感情好代兵,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著爷狈,像睡著了一般植影。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涎永,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天思币,我揣著相機與錄音鹿响,去河邊找鬼。 笑死谷饿,一個胖子當(dāng)著我的面吹牛抢野,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播各墨,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼指孤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了贬堵?” 一聲冷哼從身側(cè)響起恃轩,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎黎做,沒想到半個月后叉跛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蒸殿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年筷厘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宏所。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡酥艳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出爬骤,到底是詐尸還是另有隱情充石,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布霞玄,位于F島的核電站骤铃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏坷剧。R本人自食惡果不足惜惰爬,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惫企。 院中可真熱鬧撕瞧,春花似錦、人聲如沸雅任。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沪么。三九已至,卻和暖如春锌半,著一層夾襖步出監(jiān)牢的瞬間禽车,已是汗流浹背寇漫。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留殉摔,地道東北人州胳。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像逸月,于是被迫代替她去往敵國和親栓撞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,212評論 0 4
  • 以前有一個人總是悶悶不樂碗硬,覺得世上的其他人其他事和自己沒有絲毫關(guān)系瓤湘,直到有一天他在夢里遇見了上帝。他還沒有開口...
    暢游之靈閱讀 527評論 0 0
  • 清廉之士恩尾,國之大器弛说;清廉之道,天地圭臬翰意。清廉之詞木人,《韓非》初解,《辭杭脚迹》注詳醒第。自微趨大,察古觀今进鸠,廉存貪亡淘讥。 亙古...
    紅城客閱讀 1,369評論 3 5
  • parco naturale puez odle森林與草甸的結(jié)合
    簡_開閱讀 292評論 0 0
  • 2017 11 25 星期六 晴 今天是周六,起的有點晚堤如,等兒子起來了蒲列,我就做飯去了,吃完飯搀罢,兒子就去做剩...
    99d29bce557c閱讀 192評論 0 0