目錄
導(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_son
由teren
創(chuàng)造遮婶,所以teren
是teren_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
掘剪、shift
和unshift
的替代方法;格式化數(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)自定義排序;
參考資料
- 《JavaScript高級程序設(shè)計(第3版)》
- 《JavaScript標(biāo)準(zhǔn)參考教程》——阮一峰