03.第5章:引用類型

1.Object類型

1)創(chuàng)建Object實例的方式:

  • 使用字面量創(chuàng)建
let myinstance={name:'abc',age:20}
  • 使用Object創(chuàng)建
let myinstance2=new Object({name:'abc',age:21})
  • 使用構(gòu)造函數(shù)創(chuàng)建
function Person(name,age)
{
    this.name=name;
    this.age=age;
}
let p=new Person('abc','20');
  • 使用Object.create創(chuàng)建
let o={name:'abc',age:'20'};
let o2=Object.create(o);

2.Array類型

和其他語言相同點:都是有序列表
不同點:可以保存不同的類型
ES數(shù)組大小可以動態(tài)調(diào)整。

  • 創(chuàng)建數(shù)組
    var colors=new Array();
    //傳入數(shù)字但汞,會構(gòu)建大小為20的數(shù)組
    var colors=new Array(20);
    //直接傳遞要包含的項
    var colors=new Array(“red”,"blue","green");
    可以省略new
    var colors=Array();
    var colors=Array(20);
    var colors=Array(“red”,"blue","green");

使用數(shù)組字面量表示法:
var colors=["red","blue","green"];
//創(chuàng)建一個空數(shù)組
var name=[];


  • 讀取數(shù)組值
    alert(colors[0])毫蚓;
    colors[2] = "black";
  • 利用length屬性可以刪除元素和添加元素


length屬性設(shè)置為2,會移除最后一項

length值大于數(shù)組項的值檐涝,為定義的對應索引項為undefined


中間位置3到位置98都是不存在的帅刊,所以都是undefined

1)檢測數(shù)組

  • 方法一:
    if(value instanceof Array){
    }
    instanceof操作符的問題在于走芋,它假定單一的全局執(zhí)行環(huán)境。
    如果網(wǎng)頁中包含多個框架叉寂,就會存在兩個以上不同全局執(zhí)行環(huán)境萍启。
  • 方法二:
    if(Array.isArray(value)){
    }
    這個方法解決了上述問題,能夠確定某個值到底是不是數(shù)組,而不管它是在哪個全局執(zhí)行環(huán)境中創(chuàng)建的

2)轉(zhuǎn)換方法

toString(),toLocaleString(),valueOf()方法,join()方法

    let arr=[[1,2],[2,3],[3,4]];
    console.log(arr.toString());//轉(zhuǎn)換成1勘纯,2局服,2,3驳遵,3淫奔,4
    console.log(arr.valueOf()); //轉(zhuǎn)出來還是數(shù)組
    console.log(arr.join('||'));//1,2||2,3||3,4

3)push(),pop(),shift(),unshift()

/*棧方法*/
    let arr5=[1,2,3];
    arr5.push(4);
    console.log(arr5);//[1,2,3,4]
    arr5.pop();
    console.log(arr5);//[1,2,3]
    arr5.unshift(0);
    console.log(arr5);//[0,1,2,3]
    arr5.shift();
    console.log(arr5);//[1,2,3]

4)重排序方法

reverse()和sort()

  /*逆序*/
    let arr5=[1,2,3];
    arr5.reverse();
    console.log(arr5);//[3,2,1]

sort()方法會調(diào)用每個數(shù)組項的toString()方法,即使數(shù)組中每一項都是數(shù)值堤结,它比較的都是字符串唆迁。


sort

sort方法為了解決如上問題,它能夠接收一個比較函數(shù)作為參數(shù)竞穷。

/*sort排序*/
    let arr3=[1,3,2,5,4];
    let sortArr=arr3.sort((a,b)=>{
        //從小到大
        return a-b;
        //從大到小
        //return b-a;

    });
    console.log(sortArr);

5)操作方法

  • concat()方法
    沒有傳遞參數(shù)唐责,就會復制當前數(shù)組并返回給副本。
    如果傳遞給concat()方法的是一個或多個數(shù)組瘾带,則該方法會將這些數(shù)組中每一項添加到結(jié)果數(shù)組中鼠哥。
    如果傳遞的值不是數(shù)組,這些值會被簡單的添加到結(jié)果數(shù)組的末尾看政。
/*數(shù)組操作的方法*/
    let arr6=arr5.concat();//[3,2,1]
    console.log(arr6);
    arr6=arr5.concat([1,2,3]);//[3,2,1,1,2,3]
    console.log(arr6);
  • slice()方法
    能夠接收一個或兩個參數(shù)朴恳,截取數(shù)組。slice()方法不會影響原始數(shù)組帽衙。包括左邊不包括右邊
arr6=arr5.slice(0,1);//arr5=[3,2,1]
    console.log(arr6);//[3]
  • splice方法
    刪除:splice(0,2)指定兩個參數(shù)菜皂,起始位置和要刪除的項數(shù)。
    插入替換:splice(2厉萝,0恍飘,“red”,“green”)谴垫,指定3個參數(shù)章母,起始位置、要刪除的項數(shù)翩剪、要插入的項耸序。會從當前數(shù)組的位置2插入字符串。
    splice()方法始終都會返回一個數(shù)組毒坛,該數(shù)組中包含了從原始數(shù)組中刪除的項修肠。


7)位置方法

  • indexOf(),lastIndexOf()
    兩個參數(shù):要查找的項恕出,查找的起始索引位置(可選)
    indexOf()從位置0或者索引參數(shù)開始向后查找询枚。
    lastIndexOf()從數(shù)組的末尾開始向前查找。



8)迭代方法

  • foreach
/*數(shù)組遍歷*/
    let arr=['a','b','c'];
    arr.forEach((item,index)=>{
        console.log(index,item);
    })
  • every
/*判斷所有元素都符合條件*/
    let arr2=[1,2,3];
    let result=arr2.every((item,index)=>{
        if(item<4)
            return true;
    });
    console.log(result);
  • some
let arr2=[1,2,3];
/*只要有一個元素滿足條件*/
    let result2=arr2.some((item,index)=>{
        if(item<2)
            return true;
    });
    console.log(result2);
  • sort
 /*sort排序*/
    let arr3=[1,3,2,5,4];
    let sortArr=arr3.sort((a,b)=>{
        //從小到大
        return a-b;
        //從大到小
        //return b-a;

    });
    console.log(sortArr);
  • map
   let arr2=[1,2,3];  /*map對元素重新組合*/
    let maparr=arr2.map((item,index)=>{
        return "<b>"+item+"<b>"
    });
    console.log(maparr);
  • filter過濾
    let arr3=[1,3,2,5,4]; /*filter過濾*/
    let filarr=arr3.filter((item,index)=>{
        if(item>=3)
            return true;
    });
    console.log(filarr);

9)縮小方法

四個參數(shù):前一項值浙巫,當前值金蜀,索引刷后,數(shù)組

  • reduce()從數(shù)組的第一項開始,遍歷到最后



    第一次:prev=1渊抄,cur=2
    第二次:prev=3(1+2)尝胆,cur=3
    ...

  • reduceRight()從數(shù)組的最后一項開始,遍歷到第一項


3.Date類型

var now=new Date();//不傳參數(shù)會自動獲取當前時間
根據(jù)特定的時間獲取Date變量
var someDate=new Date(Date.parse("May 25,2004 "));
var someDate=new Date("May 25,2004 ");//傳遞字符串會默認調(diào)用Date.parse().
//2005年5月5日下午17點55分55秒
var someDate=new Date(Date.UTC(2005,4,5,17,55,55))
ES5添加了Date.now()方法


4.RegExp類型(來支持正則表達式)


flags包括3個標志:
g:全局模式
i:不區(qū)分大小寫
m:多行模式
//匹配字符串中所有bat或cat
var pattern1=/[bc]at/i;
var pattern1=new RegExp("[bc]at","i");

1)RegExp實例方法
  • exec();
    接收一個參數(shù)护桦,要應用模式的字符串含衔,然后返回包含第一個匹配信息的數(shù)組。還包含兩個額外的屬性:index嘶炭,input抱慌。



    對于exec()方法而言,每次只會返回一個匹配項眨猎。在沒有設(shè)置全局變量的情況下抑进,在同一個字符串上多次調(diào)用exec()將始終返回第一個匹配項。在設(shè)置全局變量的情況下睡陪,每次調(diào)用exec()方法則會在字符串中繼續(xù)查找新的匹配項寺渗。



  • test()方法
    接收一個字符串參數(shù),在模式與該參數(shù)匹配的情況下返回true兰迫;否則返回false信殊。


3)正則表達式
  • 【abc】:方括號表示查找任何在方括號內(nèi)的字符
返回符合a-h的數(shù)組

【0-9】查找任何從0至9的數(shù)字
【a-z】查找從小寫a到小寫z的字符
【A-Z】查找從大寫A到大寫Z的字符
【^abc】查找任何不在方括號內(nèi)的字符
|:表示或


.匹配代表任意字符 /h.t/


  • \w查找字符(字母、數(shù)字汁果、下劃線)



    \W查找非字符
    \d查找數(shù)字
    \D查找非數(shù)字字符
    \s查找空白字符
    \S查找非空白字符
    \b匹配單詞邊界
    \B匹配非單詞邊界


  • p* 模式p的0或多次出現(xiàn)
    p+ 模式p的1或多次出現(xiàn)
    p? 模式p的0或1次出現(xiàn)


  • p{n} 模式p正好n次出現(xiàn)
    p{n涡拘,}模式p至少n次出現(xiàn)
    p{n,m}模式p出現(xiàn)次數(shù)位于n和m間(不包括m)


    正則表達式網(wǎng)站:
    www.w3cfuns.com

5.Function類型

ES中每個函數(shù)都是Function類型的實例,而且與其他引用類型一樣具有屬性和方法据德。函數(shù)名實際上是一個指向函數(shù)對象的指針鳄乏。



函數(shù)名僅僅是指向函數(shù)的指針:


1)沒有重載

2)函數(shù)聲明與函數(shù)表達式

在代碼開始執(zhí)行之前,解釋器通過一個名為函數(shù)聲明提升的過程棘利,讀取并將函數(shù)聲明添加到執(zhí)行環(huán)境中橱野。
函數(shù)表達式,則必須等到解釋器執(zhí)行到它所在的代碼行才會被解釋執(zhí)行善玫。


函數(shù)聲明:能夠正確運行

函數(shù)表達式:執(zhí)行出錯

3)作為值的函數(shù)

因為函數(shù)名本身就是變量水援,所以函數(shù)也可以作為值來使用。也就是說可以像傳遞參數(shù)一樣把一個函數(shù)傳遞給另一個函數(shù)茅郎,也可以將一個函數(shù)作為另一個函數(shù)的返回值蜗元。


函數(shù)作為參數(shù)傳遞

函數(shù)作為返回值返回

4)函數(shù)的內(nèi)部屬性

在函數(shù)內(nèi)部有兩個特殊的對象:

  • arguments
    它是一個類數(shù)組對象,包含傳入函數(shù)中的所有參數(shù)系冗。
    雖然arguments的主要用途是保存函數(shù)參數(shù)奕扣,但這個對象還有一個名叫callee的屬性,該屬性是一個指針毕谴,指向擁有這個arguments對象的函數(shù)成畦。


    階乘

    階乘改寫后不存在函數(shù)名耦合

  • this,表示當前執(zhí)行的環(huán)境對象(當在全局作用域中調(diào)用函數(shù)時涝开,this對象的引用就是window)



  • caller



    以上函數(shù)回顯示調(diào)用inner函數(shù)(也就是outer()函數(shù))的源代碼


    改進耦合

    注意:當函數(shù)在嚴格模式下循帐,訪問arguments.callee會導致錯誤。
    也不能為函數(shù)的caller屬性賦值舀武。

5)函數(shù)的屬性和方法

每個函數(shù)包括兩個屬性:length和prototype
length:表示函數(shù)希望接收的命令參數(shù)的個數(shù)拄养。


  • prototype屬性:保存所有引用類型的實例方法(具體下一章介紹)
    重要

每個函數(shù)包含兩個非繼承方法apply()和call()。這兩個方法的用途都是在特定的作用域中調(diào)用函數(shù)银舱。

  • apply()方法接收兩個參數(shù):一個是運行函數(shù)的作用域瘪匿,一個是參數(shù)數(shù)組


  • call()方法與apply()方法作用相同,區(qū)別僅在于接收參數(shù)的方式不同


  • call()方法和apply()方法真正的用武之地是在擴充函數(shù)作用域



  • bind()方法



  • call寻馏、apply和bind的區(qū)別

bind返回的是對應的函數(shù)棋弥,用于稍后調(diào)用; call诚欠、apply是立即調(diào)用顽染。
call傳參時,第一個參數(shù)是運行函數(shù)的作用域轰绵,后面的參數(shù)依次列開粉寞。
apply傳參時,第一個參數(shù)是運行函數(shù)的作用域左腔,后面的參數(shù)是數(shù)組唧垦。

  • 使用call和apply實現(xiàn)bind
Function.prototype.bind=function(context){
     //這里的this其實是當調(diào)用bind方法時的函數(shù)實例
     var self=this;
      args=Array.prototype.slice.call(arguments);
      return function(){
       return self.apply(context,args.slice(1));
    }
}

6.基本的包裝類型

1)Boolean類型

Boolean類型是與布爾值對應的引用類型。創(chuàng)建Boolean對象:

  • 前三行代碼創(chuàng)建了一個Boolean對象falseObject液样,在布爾運算時振亮,所有的對象都會被轉(zhuǎn)換成true,這里是對falseObject而不是對它的值(false)進行求值蓄愁。所以結(jié)果為true

2)Number類型

Number是與數(shù)字值對應的引用類型双炕。

let num=10;
  • toString()方法 參數(shù)可以用來表示是幾進制
 <script>
        let num=100200030040505;

        console.log(num.toString());
        console.log(num.toString(2));
    </script>
  • toFixed()方法:將數(shù)值格式化為指定小數(shù)的字符串。
let num=100.005;
console.log(num.toFixed(2));//能夠自動四舍五入100.00
  • toExponential():指數(shù)表示法


3)String類型

let s='abc'撮抓;
let s='abc';
console.log(s.length);//3

方法

  • 字符方法:
    charAt():根據(jù)索引獲取字符串中的字符
    charCodeAt():根據(jù)索引獲取字符串的字符的編碼
    ES5中可以使用[ index]來訪問特定字符
let s='abc';
console.log(s.length);//3
console.log(s.charAt(1));//b
  • 字符串操作方法(并不會改變原字符串)
    concat()方法:拼接字符串
let s1=s.concat('bcd');
console.log(s1);//abcbcd

substr()妇斤、slice()、substring()
當傳入的參數(shù)是負數(shù)的時候丹拯,substr()站超、slice()會從最后往前數(shù),substring會返回0

console.log(s1.substr(-1));//s.length-1
console.log(s1.slice(-1));//s.length-1
console.log(s1.substring(-1));//0
  • splite方法(將字符串按照一定條件分割成數(shù)組)
/*字符串轉(zhuǎn)數(shù)組*/
       let s1='abcdbd'乖酬;
        let arr=s1.split('');
        console.log(arr);
  • trim()方法:
 /*去掉空格*/
        let s2=' 你好 ';
        console.log(s2.trim());
  • 字符串位置方法
    indexOf(),lastIndexOf(),返回字符串的索引


  • 字符串的模式匹配方法
    match()

 let matches=text.match(/.at/);
console.log(matches.index);//返回索引 0
console.log(matches[0]);//返回第一個元素 //cat

search():返回字符串中第一個匹配項的索引死相,沒找到就返回-1

 /*返回第一個匹配項的索引*/
        let pos=text.search(/at/);//1
        console.log(pos);
  • replace()方法
    如果第一個參數(shù)是字符串,那么只會替換第一個咬像。
    如果要替換所有的字符串算撮,需要提供一個正則表達式生宛,并指定全局標志。
 /*字符串替換*/
        let text='cat,bat,sat,fat';
        //只會替換第一個
        let result=text.replace('at','ond');
        console.log(result);


        //要替換所有字符肮柜,需要正則表達式
        result=text.replace(/at/g,'ond');
        console.log(result);

7.單體內(nèi)置對象

1)Global對象

2)Math對象

  • min()和max()


  • 舍入方法



  • random()方法
    返回介于0到1之間的一個隨機數(shù)陷舅,不包括0和1


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市审洞,隨后出現(xiàn)的幾起案子莱睁,更是在濱河造成了極大的恐慌,老刑警劉巖芒澜,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仰剿,死亡現(xiàn)場離奇詭異,居然都是意外死亡痴晦,警方通過查閱死者的電腦和手機南吮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來誊酌,“玉大人旨袒,你說我怎么就攤上這事∈醴” “怎么了砚尽?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辉词。 經(jīng)常有香客問我必孤,道長,這世上最難降的妖魔是什么瑞躺? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任敷搪,我火速辦了婚禮,結(jié)果婚禮上幢哨,老公的妹妹穿的比我還像新娘赡勘。我一直安慰自己,他們只是感情好捞镰,可當我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布闸与。 她就那樣靜靜地躺著,像睡著了一般岸售。 火紅的嫁衣襯著肌膚如雪践樱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天凸丸,我揣著相機與錄音拷邢,去河邊找鬼。 笑死屎慢,一個胖子當著我的面吹牛瞭稼,可吹牛的內(nèi)容都是我干的忽洛。 我是一名探鬼主播,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼环肘,長吁一口氣:“原來是場噩夢啊……” “哼脐瑰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起廷臼,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绝页,沒想到半個月后荠商,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡续誉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年莱没,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酷鸦。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡饰躲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出臼隔,到底是詐尸還是另有隱情嘹裂,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布摔握,位于F島的核電站寄狼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏氨淌。R本人自食惡果不足惜泊愧,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盛正。 院中可真熱鬧删咱,春花似錦、人聲如沸豪筝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽续崖。三九已至即寡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間袜刷,已是汗流浹背聪富。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留著蟹,地道東北人墩蔓。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓梢莽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親奸披。 傳聞我的和親對象是個殘疾皇子昏名,可洞房花燭夜當晚...
    茶點故事閱讀 43,666評論 2 350

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

  • 引用類型的值(對象)是引用類型的一個實例轻局,在ECMAScript中,引用類型是一種數(shù)據(jù)結(jié)構(gòu)样刷,用于將數(shù)據(jù)和功能組織在...
    Elevens_regret閱讀 338評論 0 0
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,219評論 0 4
  • Chapter 5 引用類型 Object類型 創(chuàng)建Object實例new Object()var person ...
    云之外閱讀 389評論 0 0
  • 光陰似箭置鼻,歲月如梭镇饮,不知不覺一年時光又在指縫間悄悄溜走。 2014年年終總結(jié)大概是在一周前完成的箕母,那天是20日储藐,一...
    應許時光閱讀 651評論 0 3
  • 真正的噴子 噴天噴地 噴自己 可惜現(xiàn)在的噴子 幾乎都是假噴子 他們噴誰也不會噴自己 真正的斗士 像魯迅 戰(zhàn)天斗地 ...
    一葉茶閱讀 201評論 2 3