第五章:引用類型

第五章:引用類型

5.1 Object 類型

5.1 .1 創(chuàng)建 Object 實例的方式有兩種

// 第一種
var person = new Object(); 
person.name = "Nicholas"; 
person.age = 29;
// 第二種 字面量方式
var person = {
    name : "Nicholas", 
    age : 29
};
// 在使用對象字面量語法時荷并,屬性名也可以使用字符串,如下面這個例子所示。
var person = {
    "name" : "Nicholas"妹沙,
    "age” : 29橱脸,
    5 : true    //這里的數(shù)值屬性名會自動轉換為字符串
};
//另外,使用對象字面量語法時,如果留空其花括號雹有,則可以定義只包含默認屬性和方法的對象地淀,如下所示:
var peraon = {}://與new object()相同
person.name = "Nicholas"失球;
person.age = 29;

5.2 Array 類型

5.2.1 創(chuàng)建數(shù)組的兩種方式

// 第一種 使用 Array 構造函數(shù)
var colors = new Array();
var colors = new Array(20);// 創(chuàng)建 length 為 20 的數(shù)組
var colors = new Array("red", "blue", "green");//創(chuàng)建了一個包含3個字符串值的數(shù)組:

// 另外帮毁,在使用Array構造函數(shù)時也可以省略new操作符实苞。如下面的例子所示,省略new操作符的結果相同:
var colors = Array(3)烈疚;//創(chuàng)建一個包含3項的數(shù)組var 
names = Array("Greg")黔牵;//創(chuàng)建一個包含1項,即字符率“Greg”的數(shù)組

//第二種 使用數(shù)組字面量表示法
var colors = ["red"爷肝,"blue"猾浦,"green"];//創(chuàng)建一個包含3個字符串的數(shù)組
var names = [];//創(chuàng)建一個空數(shù)組
var values = [1陆错,2,];//不要這樣跃巡!這樣會創(chuàng)建一個包含2或3項的數(shù)組var options=[危号,,素邪,彼水,氓皱,]住拭;//不要這樣摇零!這樣會創(chuàng)建一個包含5或6項的數(shù)組
  • 在讀取和設置數(shù)組的值時,要使用方括號并提供相應值的基于 0 的數(shù)字索引沽甥,如下所示:

    var colors = ["red"声邦,"blue","green"];//定義一個字符事數(shù)組
    alert(colors[0]);//顯示第一項
    colors[2] = "black";//修改第三項
    colors[31 = "brown";//新增第四項
    
  • 數(shù)組的 length 屬性很有特點——它不是只讀的摆舟。因此亥曹,通過設置這個屬性,可以從數(shù)組的末尾移除項或向數(shù)組中添加新項恨诱。請看下面的例子:

    var colors = ["red","blue","green"];//創(chuàng)建一個包含3個字符事的數(shù)組
    colora.length = 2;
    alert(colora[2]);//undefined
    
    var colors = ["red","blue","green"];//創(chuàng)建一個包含3個字符事的數(shù)組
    colora.length = 4;
    alert(colora[3]);//undefined
    
    // 利用1ength屬性也可以方便地在數(shù)組末尾添加新項媳瞪,如下所示:
    var colors = ["red","blue","green"];//創(chuàng)建一個包含3個字符事的數(shù)組
    colors[colors.length] = "black";//在位置3)添加一個顏色
    
    

5.2.2 檢測數(shù)組

if(value instanceof Array){
    //對數(shù)組執(zhí)行某些操作    
}//若網(wǎng)頁中存在多個框架,則會出現(xiàn)問題

// ES5 新增Array.isArray()
if(Array.isArray(value)){
    //對數(shù)組執(zhí)行某些操作
}

5.2.3 轉換方法

  • 如前所述照宝,所有對象都具有 toLocalestring()蛇受、tostring()和 valueof()方法。其中厕鹃,調用數(shù)組的 tostring()方法會返回由數(shù)組中每個值的字符串形式拼接而成的一個以逗號分隔的字符串兢仰。而調用valueof()返回的還是數(shù)組。實際上剂碴,為了創(chuàng)建這個字符串會調用數(shù)組每一項的 tostring()方法把将。來看下面這個例子。

    var colors=["red"忆矛,"blue"察蹲,"green"];//創(chuàng)建一個包含3個字符串的數(shù)組
    alert(colors.tostring());//red,blue,green 
    alert(colors.valueOf());//red,blue,green 
    alert(colors);//red,blue,green  會在后臺調用 toString 方法
    
    
  • join 方法

    var colors=["red","green","blue"]; 
    alert(colors. join(","));//red, green, blue 
    alert(colors. join("||"));//red||green||blue
    

5.2.4 棧方法

  • push 方法

    • 添加至數(shù)組末尾,并返回修改后的數(shù)組長度

      var colors=new Array()洪碳;//創(chuàng)建一個數(shù)組
      var count=colors.push("red"递览,"green")叼屠;//推入兩項
      alert(count)瞳腌;//2
      count=colors.push(“black");//推入另一項
      alert(count)镜雨;//3
      
  • pop 方法

    • 從數(shù)組末尾刪除最后一項嫂侍,減少數(shù)組的 長度,并返回移除的項

      var item=colors.pop();//取得最后一項
      alert(item)挑宠;//"black"
      alert(colors.length)菲盾;//2
      

5.2.5 隊列方法

  • shift 方法

    • 從數(shù)組前端刪除第一項,減少數(shù)組的 長度各淀,并返回移除的項

      var item=colors.shift()懒鉴;//取得第一項
      alert(item);//"red"
      alert(colors.length)碎浇;//2
      
  • unshift 方法

    • 添加至數(shù)組前端临谱,并返回修改后的數(shù)組長度

      var colors=new Array();/創(chuàng)建一個數(shù)組var count=colora.unshift("red"奴璃,"green")悉默;//推入兩項
      alert(count);//2
      

5.2.6 重排序方法

  • reverse (反轉)方法

    var values=[1,2,3,4,5];
    values. reverse(); 
    alert(values);//5,4,3,2,1
    
  • sort(排序苟穆,種類)方法

    • 即使數(shù)組中的每一項都是數(shù)值抄课,sort() 方法會調用 toString() 比較的是字符串

      var values=[0,1,5,10,15]; 
      values,sort(); 
      alert(values);//0,1,10,15,5
      
      //解決方法
      function compare (valuel, value2) {
          if (valuel< value2){
              return 1;
          } else if (value1>value2) {
                  return-1;
          } else{
              return 0;
          }
      }
      var values=[0,1,5,10,15]; 
      values. sort(compare); 
      alert(values);//15,10,5,1,0
      
      //對于數(shù)值類型或者其valueof()方法會返回數(shù)值類型的對象類型,可以使用一個更簡單的比較函數(shù)雳旅。這個函數(shù)只要用第二個值減第一個值即可跟磨。
      function compare(value1,value2){
          return value2-value1;
      }
      

5.2.7 操作方法

  • concat 方法

    var colors=["red","green","blue"];
    var colors2=colors.concat("yellow","black","brown"); alert(colors);//red, green, blue 
    alert(colors2);//red, green, blue, yellow, black, brown
    
  • slice 方法

    • 接收兩個參數(shù):返回項的起始位置和結束位置(不包括結束位置的項)
    var colors=["red","green","blue","yellow","purple"]; var colors2=colors. slice(1); 
    var colors3=colors. slice(1,4); 
    alert(colors2);//green, blue, yellow, purple 
    alert(colors3);//green, blue, yellow
    
  • splice 方法

    • 刪除:可以刪除任意數(shù)量的項,只需指定2個參數(shù):要刪除的第一項的位置和要刪除的項數(shù)岭辣。
      例如吱晒,splice(0,2)會刪除數(shù)組中的前兩項沦童。

    • 插入:可以向指定位置插入任意數(shù)量的項仑濒,只需提供3個參數(shù):起始位置、0(要刪除的項數(shù))和要插入的項偷遗。如果要插入多個項墩瞳,可以再傳入第四、第五氏豌,以至任意多個項喉酌。例如,splice(2泵喘,0泪电,"red","green")會從當前數(shù)組的位置2開始插入字符串“red”和“green"纪铺。

    • 替換:可以向指定位置插入任意數(shù)量的項相速,且同時刪除任意數(shù)量的項,只需指定3個參數(shù):起始位置鲜锚、要刪除的項數(shù)和要插入的任意數(shù)量的項突诬。插入的項數(shù)不必與刪除的項數(shù)相等苫拍。例如,splice(2旺隙,1绒极,"red",“green“)會刪除當前數(shù)組位置2的項蔬捷,然后再從位置2開始插入字符串“red“和“green"垄提。

    • splice()方法始終都會返回一個數(shù)組,該數(shù)組中包含從原始數(shù)組中刪除的項(如果沒有刪除任何項周拐,則返回一個空數(shù)組)塔淤。下面的代碼展示了上述3種使用splice()方法的方式。

      var colors=["red"速妖,"green"高蜂,"blue"];
      var removed=colors.splice(0罕容,1)备恤;//刪除第一項
      alert(colors)://green,blue 
      alert(removed)锦秒;//red露泊,返回的數(shù)組中只包含一項
      removed=colors.splice(1,0旅择,"yellow"惭笑,"orange");//從位置1開始括入兩項
      alert(colors)生真;//green沉噩,yellow,orange柱蟀,blue 
      alert(removed)川蒙;//返回的是一個空數(shù)組
      removed=colors.splice(1,1长已,"red"畜眨,“purple“);//插入兩項术瓮,測除一項
      alert(colors)康聂;//green,red胞四,purple恬汁,orange,blue 
      alert(removed)撬讽;//yellow蕊连,返回的數(shù)組中只包含一項
      

5.2.8 位置方法

  • 都接收兩個參數(shù),要查找的項和(可選的)表示查找起點的索引

  • 兩個方法都返回查找的項在數(shù)組中的位置游昼,沒有找到返回 -1

  • 要查找的向必須嚴格相等(===)

    • indexOf 方法
      • 從數(shù)組的開頭(位置0)開始向后找
    • lastIndexOf 方法
      • 從數(shù)組的末尾開始向前找
    var numbers=[1,2,3,4,5,4,3,2,1];
    
    alert(numbers. indexof(4));//3
    alert(numbers.1astIndexof(4));//5
    
    alert(numbers. indexOf(4,4));//5
    alert(numbers. lastIndexof(4,4));//3
    
    var person={ name:"Nicholas"}; 
    var people=[{ name:"Nicholas"}]; 
    
    var morePeople=[person]; 
    
    alert(people.indexOf(person));//-1
    alert(morePeople. indexof(person));//0
    

5.2.9 迭代方法

  • ES5 中定義了 5 個迭代方法甘苍,每個方法接收兩個參數(shù)

  • ECMAScript5為數(shù)組定義了5個迭代方法。每個方法都接收兩個參數(shù):要在每一項上運行的函數(shù)和
    (可選的)運行該函數(shù)的作用域對象——影響this的值烘豌。傳入這些方法中的函數(shù)會接收三個參數(shù):數(shù)組項的值载庭、該項在數(shù)組中的位置和數(shù)組對象本身。根據(jù)使用的方法不同廊佩,這個函數(shù)執(zhí)行后的返回值可能會也可能不會影響方法的返回值囚聚。以下是這5個迭代方法的作用。

    • every():對數(shù)組中的每一項運行給定函數(shù)标锄,如果該函數(shù)對每一項都返回 true顽铸,則返回 true。
    • filter()(過濾器):對數(shù)組中的每一項運行給定函數(shù)料皇,返回該函數(shù)會返回 true 的項組成的數(shù)組
    • forEach():對數(shù)組中的每一項運行給定函數(shù)谓松。這個方法沒有返回值。
    • map():對數(shù)組中的每一項運行給定函數(shù)践剂,返回每次函數(shù)調用的結果組成的數(shù)組鬼譬。
    • some():對數(shù)組中的每一項運行給定函數(shù),如果該函數(shù)對任一項返回 true逊脯,則返回 true
    // // every() 和 some()
    var numbers = [1,2,3,4,5,4,3,2,1]; 
    
    var everyResult = numbers.every(function(item, index, array){     return (item > 2);  }); 
    alert(everyResult);    //false 
    
    var someResult = numbers.some(function(item, index, array){     return (item > 2); }); 
    alert(someResult);     //true 
     
    // filter()
    var numbers = [1,2,3,4,5,4,3,2,1]; 
     
    var filterResult = numbers.filter(function(item, index, array){    
        return (item > 2); 
    }); 
    alert(filterResult);  //[3,4,5,4,3] 
    
    // map()
    var numbers = [1,2,3,4,5,4,3,2,1]; 
     
    var mapResult = numbers.map(function(item, index, array){     
        return item * 2; 
    });  
    alert(mapResult);  //[2,4,6,8,10,8,6,4,2] 
    
    // forEach()
    var numbers = [1,2,3,4,5,4,3,2,1]; 
     
    numbers.forEach(function(item, index, array){    
        //執(zhí)行某些操作  
    }); 
    

5.2.10 歸并方法

  • :reduce()和 reduceRight()优质。這兩個方法都會迭 代數(shù)組的所有項,然后構建一個終返回的值军洼。

  • 巩螃,reduce()方法從數(shù)組的第一項開始,逐個遍歷 到后匕争。而 reduceRight()則從數(shù)組的后一項開始牺六,向前遍歷到第一項。

  • 這兩個方法都接收兩個參數(shù):一個在每一項上調用的函數(shù)和(可選的)作為歸并基礎的初始值

  • 給 reduce()和 reduceRight()的函數(shù)接收 4 個參數(shù):前一個值汗捡、當前值淑际、項的索引和數(shù)組對象。這 個函數(shù)返回的任何值都會作為第一個參數(shù)自動傳給下一項扇住。第一次迭代發(fā)生在數(shù)組的第二項上春缕,因此第 一個參數(shù)是數(shù)組的第一項,第二個參數(shù)就是數(shù)組的第二項艘蹋。

    // reduce()
    var values = [1,2,3,4,5]; 
    
    var sum = values.reduce(function(prev, cur, index, array){    
        return prev + cur; 
    });
    alert(sum); //15 
     
    //reduceRight()的作用類似锄贼,只不過方向相反而已。來看下面這個例子女阀。 
    var values = [1,2,3,4,5];
    
    var sum = values.reduceRight(function(prev, cur, index, array){ 
        return prev + cur;
    }); 
    alert(sum); //15
    

5.3 Date 類型

  • 創(chuàng)建一個日期對象

    var now = new Date();//不傳參數(shù)默認獲取當前時間和日期
    //在調用 Date 構造函數(shù)而不傳遞參數(shù)的情況下宅荤,新創(chuàng)建的對象自動獲得當前日期和時間屑迂。如果想根 據(jù)特定的日期和時間創(chuàng)建日期對象,必須傳入表示該日期的毫秒數(shù)
    var dt = new Date("2019/9/26");
    
  • Date.parse() 方法

    • 接收一個表示日期的字符串參數(shù)冯键,然后根據(jù)字符串返回相應的毫秒數(shù)
    // 例如惹盼,要為 2004年 5月 25日創(chuàng)建一個日期對象,可以使用下面的代碼: 
     var someDate = new Date(Date.parse("May 25, 2004")); 
    
  • Date.UTC()方法

    • 同樣也返回表示日期的毫秒數(shù)惫确,但它與 Date.parse()在構建值時使用不同的信息
    • Date.UTC()的參數(shù)分別是年份手报、基于 0的月份(一月是 0,二月是 1改化,以此類推)掩蛤、月中的哪一天 (1 到 31)、小時數(shù)(0 到 23)陈肛、分鐘揍鸟、秒以及毫秒數(shù)
    // GMT 時間 2000 年 1 月 1 日午夜零時 
    var y2k = new Date(Date.UTC(2000, 0)); 
     
    // GMT 時間 2005 年 5 月 5 日下午 5:55:55
    var allFives = new Date(Date.UTC(2005, 4, 5, 17, 55, 55)); 
    
    // 如同模仿 Date.parse()一樣,Date 構造函數(shù)也會模仿 Date.UTC()句旱,但有一點明顯不同:日期 和時間都基于本地時區(qū)而非 GMT來創(chuàng)建蜈亩。不過,Date 構造函數(shù)接收的參數(shù)仍然與 Date.UTC()相同前翎。因此稚配,如果第一個參數(shù)是數(shù)值,Date 構造函數(shù)就會假設該值是日期中的年份港华,而第二個參數(shù)是月份道川, 以此類推。據(jù)此立宜,可以將前面的例子重寫如下冒萄。
    // 本地時間 2000 年 1 月 1 日午夜零時 
    var y2k = new Date(2000, 0); 
     
    // 本地時間 2005 年 5 月 5 日下午 5:55:55 
    var allFives = new Date(2005, 4, 5, 17, 55, 55); 
    
  • Date.now() 方法

    • 返回表示調用這個方法時的日期和時間的毫秒數(shù)
    //取得開始時間 
    var start = Date.now(); 
     
    //調用函數(shù) 
    doSomething(); 
     
    //取得停止時間 
    var stop = Date.now();     
    result = stop – start; 
    
    // 使用 + 操作符把 Date 對象轉成字符串也可以達到同樣的目的
    //取得開始時間 
    var start = +new Date(); 
     
    //調用函數(shù) 
    doSomething(); 
     
    //取得停止時間 
    var stop = +new Date();     
    result = stop – start; 
    

5.3.1 Date 比較大小

  • Date 類型的 valueOf()方法,則根本不返回字符串橙数,而是返回日期的毫秒表示尊流。因此,可以 方便使用比較操作符(小于或大于)來比較日期值灯帮。請看下面的例子崖技。
var date1 = new Date(2007, 0, 1);    //"January 1, 2007"
var date2 = new Date(2007, 1, 1);    //"February 1, 2007" 
 
alert(date1 < date2); //true
alert(date1 > date2); //false

5.3.2 日期格式化方法

  • toDateString()——以特定于實現(xiàn)的格式顯示星期幾、月钟哥、日和年迎献;(英文的日期)
  • toLocaleDateString()——以特定于地區(qū)的格式顯示星期幾、月腻贰、日和年吁恍; (數(shù)字格式)
  • toTimeString()——以特定于實現(xiàn)的格式顯示時、分、秒和時區(qū)冀瓦;
  • toLocaleTimeString()——以特定于實現(xiàn)的格式顯示時伴奥、分、秒翼闽;
  • toUTCString()——以特定于實現(xiàn)的格式完整的 UTC日期
  • 與 toLocaleString()和 toString()方法一樣拾徙,以上這些字符串格式方法的輸出也是因瀏覽器 而異的,因此沒有哪一個方法能夠用來在用戶界面中顯示一致的日期信息肄程。

5.3.3 日期/時間組件方法

方法 說明
getFullYear() 獲取年份
getMonth() 獲取月份(0-11)
getDate() 獲取日期
getHours() 小時
getMinutes() 分鐘
getSeconds()
getDay() 星期(0 = 星期天)
valueOf 毫秒值

5.4 RegExp 類型

  • 創(chuàng)建正則表達式

    var expression = / pattern / flags;
    
  • 3 個標志

    • g : 表示全局模式,选浑,即模式將被應用于所有字符串蓝厌,而非在發(fā)現(xiàn)第一個匹配項時立即 停止;

    • i :表示不區(qū)分大小寫(case-insensitive)模式古徒,即在確定匹配項時忽略模式與字符串的大小寫

    • m:表示多行(multiline)模式拓提,即在到達一行文本末尾時還會繼續(xù)查找下一行中是否存在與模 式匹配的項

    /* * 匹配字符串中所有"at"的實例 */
    var pattern1 = /at/g; 
     
    /* * 匹配第一個"bat"或"cat",不區(qū)分大小寫 */
    var pattern2 = /[bc]at/i; 
     
    /* * 匹配所有以"at"結尾的 3 個字符的組合隧膘,不區(qū)分大小寫 */ 
    var pattern3 = /.at/gi; 
    
  • 正則表達式中的元字符包括:( [ { \ ^ $ | ) ? * + .]}

    /* 
    * 匹配第一個"bat"或"cat"代态,不區(qū)分大小寫 
    */ 
    var pattern1 = /[bc]at/i; 
     
    /* 
    * 匹配第一個" [bc]at",不區(qū)分大小寫
    */ 
    var pattern2 = /\[bc\]at/i; 
     
    /* 
    * 匹配所有以"at"結尾的 3 個字符的組合疹吃,不區(qū)分大小寫 
    */ 
    var pattern3 = /.at/gi; 
     
    /*
    * 匹配所有".at"蹦疑,不區(qū)分大小寫 
    */ 
    var pattern4 = /\.at/gi; 
     
    

5.4.1RegExp 實例屬性

  • global:布爾值,表示是否設置了 g 標志萨驶。

  • ignoreCase:布爾值歉摧,表示是否設置了 i 標志。

  • lastIndex:整數(shù)腔呜,表示開始搜索下一個匹配項的字符位置叁温,從 0算起。

  • multiline:布爾值核畴,表示是否設置了 m 標志膝但。

  • source:正則表達式的字符串表示,按照字面量形式而非傳入構造函數(shù)中的字符串模式返回

    var pattern1 = /\[bc\]at/i; 
     
    alert(pattern1.global);         //false 
    alert(pattern1.ignoreCase);     //true 
    alert(pattern1.multiline);      //false 
    alert(pattern1.lastIndex);      //0 
    alert(pattern1.source);         //"\[bc\]at" 
     
    var pattern2 = new RegExp("\\[bc\\]at", "i"); 
     
    alert(pattern2.global);         //false 
    alert(pattern2.ignoreCase);     //true 
    alert(pattern2.multiline);      //false 
    alert(pattern2.lastIndex);      //0 
    alert(pattern2.source);         //"\[bc\]at" 
     
    

5.4.2 RegExp 實例方法

  • exec() 方法

    • exec()接受一個參數(shù)谤草,即 要應用模式的字符串跟束,然后返回包含第一個匹配項信息的數(shù)組;或者在沒有匹配項的情況下返回 null
    • 返回的數(shù)組雖然是 Array 的實例丑孩,但包含兩個額外的屬性:index 和 input泳炉。其中,index 表示匹配 項在字符串中的位置嚎杨,而 input 表示應用正則表達式的字符串花鹅。
    var text = "mom and dad and baby"; 
    var pattern = /mom( and dad( and baby)?)?/gi; 
     
    var matches = pattern.exec(text); 
    alert(matches.index);     // 0 
    alert(matches.input);     // "mom and dad and baby" 
    alert(matches[0]);        // "mom and dad and baby"
    alert(matches[1]);        // " and dad and baby" 
    alert(matches[2]);        // " and baby" 
     
    

    ...待續(xù)

5.5 Function 類型

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

    
     function sum(num1, num2){     
         return num1 + num2; 
     }
    alert(sum(10,10));        //20 
     
    var anotherSum = sum; 
    alert(anotherSum(10,10)); //20 
     
    sum = null; 
    alert(anotherSum(10,10)); //20 
    

5.5.1 沒有重載

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

  • 解析器會先讀取函數(shù)聲明,至于函數(shù)表達式枫浙,則必須等到解析器執(zhí)行到它所在的代碼行刨肃,才會真 正被解釋執(zhí)行

    alert(sum(10,10));
    function sum(num1, num2){    
      return num1 + num2; 
    } // 正常執(zhí)行
    
    alert(sum(10,10)); 
    var sum = function(num1, num2){   
      return num1 + num2;
    }; // 會導致“unexpected identifier”(意外標識符)錯誤
     
    

5.5.3 作為值的函數(shù)

  • 因為 ECMAScript中的函數(shù)名本身就是變量古拴,所以函數(shù)也可以作為值來使用。

    function callSomeFunction(someFunction, someArgument){    
        return someFunction(someArgument); 
    } 
    
    // 這個函數(shù)接受兩個參數(shù)真友。第一個參數(shù)應該是一個函數(shù)黄痪,第二個參數(shù)應該是要傳遞給該函數(shù)的一個值。 然后盔然,就可以像下面的例子一樣傳遞函數(shù)了桅打。 
    function add10(num){     
        return num + 10;
    } 
     
    var result1 = callSomeFunction(add10, 10); 
    alert(result1);   //20 
     
    function getGreeting(name){     
        return "Hello, " + name; 
    } 
     
    var result2 = callSomeFunction(getGreeting, "Nicholas"); 
    alert(result2);   //"Hello, Nicholas"
    

5.5.4 函數(shù)內部屬性

  • arguments

    • 它是一個類數(shù)組對象,包含著傳入函數(shù)中的所有參數(shù)

    • 主要作用是保存函數(shù)參數(shù)

    • 這個對象還有一個名叫 callee 的屬性愈案,該屬性是一個指針挺尾,指向擁有這個 arguments 對象的函數(shù)。

      // 階乘函數(shù)
      function factorial(num){    
          if (num <=1) {       
              return 1;     
          } else {        
              return num * factorial(num-1);
          }
      } 
      
      function factorial(num){  
          if (num <=1) {       
              return 1;    
          } else {       
              return num * arguments.callee(num-1); 
          } 
      }  
      
      
      
      var trueFactorial = factorial; 
       
      factorial = function(){     
          return 0; 
      }; 
       
      alert(trueFactorial(5));     //120 
      alert(factorial(5));         //0 
       
      
      
  • this

    • this 引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對象

      window.color = "red"; var o = { color: "blue" }; 
       
      function sayColor(){     
          alert(this.color); 
      } 
       
      sayColor();     //"red" 
       
      o.sayColor = sayColor; 
      o.sayColor();   //"blue" 
      
  • ECMAScript 5也規(guī)范化了另一個函數(shù)對象的屬性:caller

    • 這個屬性中保存著調用當前函數(shù)的函數(shù)的引用站绪, 如果是在全局作用域中調用當前函數(shù)遭铺,它的值為 null。

      function outer(){     
          inner();
      } 
       
      function inner(){    
          alert(arguments.callee.caller);
      } 
       
      outer(); //[Function: outer]
      

5.5.5 函數(shù)屬性和方法

  • 每個函數(shù)都包含兩個 屬性:length 和 prototype恢准。其中魂挂,length 屬性表示函數(shù)希望接收的命名參數(shù)的個數(shù)

    
     function sayName(name){     
         alert(name); 
     }       
     
    function sum(num1, num2){  
        return num1 + num2; 
    } 
     
    function sayHi(){     
        alert("hi"); 
    } 
     
    alert(sayName.length);      //1 
    alert(sum.length);          //2 
    alert(sayHi.length);        //0 
    
  • 每個函數(shù)都包含兩個非繼承而來的方法:apply()和 call()。

    • 這兩個方法的用途都是在特定的作 用域中調用函數(shù)

    • apply()方法接收兩個參數(shù):一個 是在其中運行函數(shù)的作用域馁筐,另一個是參數(shù)數(shù)組涂召。其中,第二個參數(shù)可以是 Array 的實例敏沉,也可以是 arguments 對象芹扭。

      
       function sum(num1, num2){   
           return num1 + num2;
       } 
       
      function callSum1(num1, num2){  
          return sum.apply(this, arguments);        // 傳入 arguments 對象
      } 
       
      function callSum2(num1, num2){   
          return sum.apply(this, [num1, num2]);    // 傳入數(shù)組
      } 
       
      alert(callSum1(10,10));   //20 
      alert(callSum2(10,10));   //20
      
    • call()方法與 apply()方法的作用相同,它們的區(qū)別僅在于接收參數(shù)的方式不同赦抖。

      function sum(num1, num2){    
          return num1 + num2;
      } 
       
      function callSum(num1, num2){   
          return sum.call(this, num1, num2);
      } 
       
      alert(callSum(10,10));   //20 
      
    • 它們真正強大的地方是能夠擴充函數(shù) 賴以運行的作用域

      window.color = "red"; 
      var o = { color: "blue" }; 
       
      function sayColor(){    
          alert(this.color);
      } 
       
      sayColor();                //red 
       
      sayColor.call(this);       //red 
      sayColor.call(window);     //red
      sayColor.call(o);          //blue 
      

5.6 基本包裝類型

  • Boolean舱卡、Number 和 String

  • 實際上,每當讀取一個基本類型值的時候队萤,后臺就會創(chuàng)建一個對應的基本包裝類型的對象轮锥,從而讓我們 能夠調用一些方法來操作這些數(shù)據(jù)

    var s1 = "some text";
    var s2 = s1.substring(2); 
    // 當?shù)诙写a訪問 s1 時,訪問過程處于一種讀取模式要尔,也就是要 從內存中讀取這個字符串的值舍杜。而在讀取模式中訪問字符串時,后臺都會自動完成下列處理赵辕。 
    // (1) 創(chuàng)建 String 類型的一個實例既绩;
    // (2) 在實例上調用指定的方法;
    // (3) 銷毀這個實例还惠。 可以將以上三個步驟想象成是執(zhí)行了下列 ECMAScript代碼饲握。 
    var s1 = new String("some text"); 
    var s2 = s1.substring(2);
    s1 = null;
    
  • 引用類型與基本包裝類型的主要區(qū)別就是對象的生存期。使用 new 操作符創(chuàng)建的引用類型的實例, 在執(zhí)行流離開當前作用域之前都一直保存在內存中救欧。而自動創(chuàng)建的基本包裝類型的對象衰粹,則只存在于一 行代碼的執(zhí)行瞬間,然后立即被銷毀笆怠。這意味著我們不能在運行時為基本類型值添加屬性和方法

    var s1 = "some text";
    s1.color = "red"; 
    alert(s1.color);  //undefined 
    

5.6.1 Boolean 類型

  • 要創(chuàng)建 Boolean 對象铝耻,可以像下面這樣調用 Boolean 構造函數(shù)并傳入 true 或 false 值。

    var booleanObject = new Boolean(true); 
    
  • 建議不要使用 Boolean 對象

5.6.2 Number 類型

  • 要創(chuàng)建 Number 對象蹬刷,可以在調用 Number 構造函數(shù)時向其 中傳遞相應的數(shù)值

    var numberObject = new Number(10); 
    
  • toFixed()方法

    // 會按照指定的小數(shù)位返回數(shù)值的字符串表示瓢捉,例如:  
    var num = 10;
    alert(num.toFixed(2));     //"10.00" 
    
    // 如果數(shù)值本身包含的小數(shù)位比指定的還多,那么接近指定的大小數(shù)位的值 就會舍入
    var num = 10.005; 
    alert(num.toFixed(2));     //"10.01" 
    
  • toExponential()方法

// 該方法返回以指數(shù)表示法(也稱 e表示法)
// toExponential()也接收一個參數(shù)办成,而且該參數(shù)同樣 也是指定輸出結果中的小數(shù)位數(shù)
var num = 10; 
alert(num.toExponential(1));  //"1.0e+1" 
  • toPrecision()方法可能會返回固定大信萏(fixed)格式,也可能返回指數(shù) (exponential)格式诈火;具體規(guī)則是看哪種格式合適兽赁。這個方法接收一個參數(shù)状答,即表示數(shù)值的所有數(shù)字的 位數(shù)(不包括指數(shù)部分)

    var num = 99; 
    alert(num.toPrecision(1));  //"1e+2" 
    alert(num.toPrecision(2));  //"99"
    alert(num.toPrecision(3));  //"99.0" 
     
    

5.6.3 String 類型

  • 創(chuàng)建

    var str = new String("hello world");
    
  • 字符方法

    • charAt() 和 charCodeAt()

    • 這兩個方法都接收一個參數(shù)冷守,即基于 0 的字符位置

    • charAt() 方法以單字節(jié)字符串形式返回給定位置的那個字符

      var stringValue = "hello world";
      alert(stringValue.charAt(1));   //"e" 
      
    • charCodeAt() 方法獲取到的是字符編碼

      var stringValue = "hello world"; 
      alert(stringValue.charCodeAt(1));   //輸出"101" 
      
    • 在支持的瀏覽器中,可以使用方括號加數(shù) 字索引來訪問字符串中的特定字符

      var stringValue = "hello world"; 
      alert(stringValue[1]);   //"e" 
      
    • 三個基于子字符串創(chuàng)建新字符串的方法:slice()惊科、substr()和substring()拍摇。

      // 都會返回被操作字符串的一個子字符串,而且也都接受一或兩個參數(shù)馆截。第一個參數(shù)指定子字 符串的開始位置充活,第二個參數(shù)(在指定的情況下)表示子字符串到哪里結束。
      //蜡娶,slice()和 substring()的第二個參數(shù)指定的是子字符串后一個字符后面的位置混卵。而 substr()的第二個參數(shù)指定的則是返回的字符個數(shù)
      var stringValue = "hello world"; 
      alert(stringValue.slice(3));         //"lo world" 
      alert(stringValue.substring(3));     //"lo world" 
      alert(stringValue.substr(3));        //"lo world"
      alert(stringValue.slice(3, 7));      //"lo w" 
      alert(stringValue.substring(3,7));   //"lo w"
      alert(stringValue.substr(3, 7));     //"lo worl" 
      
      
      // 傳入負值
      // slice()方法會將傳 入的負值與字符串的長度相加,substr()方法將負的第一個參數(shù)加上字符串的長度窖张,而將負的第二個 參數(shù)轉換為 0幕随。后,substring()方法會把所有負值參數(shù)都轉換為 0宿接。
      var stringValue = "hello world";
      alert(stringValue.slice(-3));          //"rld" 
      alert(stringValue.substring(-3));     //"hello world" 
      alert(stringValue.substr(-3));        //"rld" 
      alert(stringValue.slice(3, -4));       //"lo w"
      alert(stringValue.substring(3, -4));   //"hel" 
      alert(stringValue.substr(3, -4));      //""(空字符串) 
      
  • 字符串位置方法

    • indexOf() 和 lastIndexOf()

    • 從 一個字符串中搜索給定的子字符串赘淮,然后返子字符串的位置(如果沒有找到該子字符串,則返回-1)睦霎。

      var stringValue = "hello world"; 
      alert(stringValue.indexOf("o"));             //4 
      alert(stringValue.lastIndexOf("o"));         //7 
       
      
      // 找出所有匹配字符串
      var stringValue = "Lorem ipsum dolor sit amet, consectetur adipisicing elit";
      var positions = new Array(); 
      var pos = stringValue.indexOf("e"); 
       
      while(pos > -1){     
          positions.push(pos);     
          pos = stringValue.indexOf("e", pos + 1); 
      }     
      alert(positions);    //"3,24,32,35,52" 
      
  • trim() 方法

    • 該方法會創(chuàng)建一個字符串副本梢卸,刪除開頭和末尾的所有空格,然后返回結果

      var stringValue = "   hello world   "; 
      var trimmedStringValue = stringValue.trim(); 
      alert(stringValue);            //"   hello world   " 
      alert(trimmedStringValue);     //"hello world"
      
  • 字符串大小寫轉換方法

    • toLowerCase()副女、toLocaleLowerCase()

    • toUpperCase()和 toLocaleUpperCase()

      var stringValue = "hello world"; 
      alert(stringValue.toLocaleUpperCase());  //"HELLO WORLD" 
      alert(stringValue.toUpperCase());        //"HELLO WORLD" 
      alert(stringValue.toLocaleLowerCase());  //"hello world" 
      alert(stringValue.toLowerCase());        //"hello world" 
      
  • 字符串模式匹配方法

    • match() 方法蛤高,只接受一個參數(shù),要莫是一個正則表達式,要莫是一個 RegExp 對象

      var text = "cat, bat, sat, fat"; 
      var pattern = /.at/; 
       
      //與 pattern.exec(text)相同 
      var matches = text.match(pattern);       
      alert(matches.index);            //0
      alert(matches[0]);                //"cat"
      alert(pattern.lastIndex);         //0 
      
    • search() 方法 襟齿,參數(shù)同上

      //search()方法返回字符串中第一個匹配項的索引姻锁;如果沒 有找到匹配項,則返回-1猜欺。而且位隶,search()方法始終是從字符串開頭向后查找模式。
      var text = "cat, bat, sat, fat";  
      var pos = text.search(/at/); 
      alert(pos);   //1 
       
      
    • replace() 方法

    • 接受兩個參數(shù):第 一個參數(shù)可以是一個 RegExp 對象或者一個字符串(這個字符串不會被轉換成正則表達式)开皿,第二個參 數(shù)可以是一個字符串或者一個函數(shù)涧黄。如果第一個參數(shù)是字符串,那么只會替換第一個子字符串赋荆。要想替 換所有子字符串笋妥,唯一的辦法就是提供一個正則表達式,而且要指定全局(g)標志窄潭,如下所示春宣。
    var text = "cat, bat, sat, fat";  
    var result = text.replace("at", "ond"); 
    alert(result);    //"cond, bat, sat, fat" 
     
    result = text.replace(/at/g, "ond");
    alert(result);    //"cond, bond, sond, fond" 
    
    • split()
    // 基于指定的分隔符將一個字符串分割成 多個子字符串,并將結果放在一個數(shù)組中嫉你。分隔符可以是字符串月帝,也可以是一個 RegExp 對象(這個方 法不會將字符串看成正則表達式)。split()方法可以接受可選的第二個參數(shù)幽污,用于指定數(shù)組的大小嚷辅, 以便確保返回的數(shù)組不會超過既定大小
    var colorText = "red,blue,green,yellow"; 
    var colors1 = colorText.split(",");          //["red", "blue", "green", "yellow"]
    var colors2 = colorText.split(",", 2);       //["red", "blue"] 
    var colors3 = colorText.split(/[^\,]+/);     //["", ",", ",", ",", ""] 
     
    
  • localeCompare() 方法

    • 用來比較兩個字符串,并返回下列值中的一個

      • 如果字符串在字母表中應該排在字符串參數(shù)之前距误,則返回一個負數(shù)(大多數(shù)情況下是-1簸搞,具體 的值要視實現(xiàn)而定);
      • 如果字符串等于字符串參數(shù)准潭,則返回 0趁俊;
      • 如果字符串在字母表中應該排在字符串參數(shù)之后,則返回一個正數(shù)(大多數(shù)情況下是 1刑然,具體的 值同樣要視實現(xiàn)而定)寺擂。
      var stringValue = "yellow";      
      alert(stringValue.localeCompare("brick"));      //1 
      alert(stringValue.localeCompare("yellow"));      //0 
      alert(stringValue.localeCompare("zoo"));         //-1 
      
  • fromCharCode() 方法

    • 接收一或 多個字符編碼,然后將它們轉換成一個字符串闰集。

      alert(String.fromCharCode(104, 101, 108, 108, 111)); //"hello" 
      

5.7 單體內置對象

5.7.1 Global 對象

  • 沽讹;所有在全局作用域中定義的屬性和函數(shù),都是 Global 對象的屬性武鲁。
    • 諸如 isNaN()爽雄、isFinite()、parseInt()以及 parseFloat()沐鼠,實際上全都是 Global 對象的方法
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末挚瘟,一起剝皮案震驚了整個濱河市叹谁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乘盖,老刑警劉巖焰檩,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異订框,居然都是意外死亡析苫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門穿扳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衩侥,“玉大人,你說我怎么就攤上這事矛物∶K溃” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵履羞,是天一觀的道長峦萎。 經(jīng)常有香客問我,道長忆首,這世上最難降的妖魔是什么爱榔? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮雄卷,結果婚禮上搓蚪,老公的妹妹穿的比我還像新娘蛤售。我一直安慰自己丁鹉,他們只是感情好,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布悴能。 她就那樣靜靜地躺著揣钦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漠酿。 梳的紋絲不亂的頭發(fā)上冯凹,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音炒嘲,去河邊找鬼宇姚。 笑死,一個胖子當著我的面吹牛夫凸,可吹牛的內容都是我干的浑劳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼夭拌,長吁一口氣:“原來是場噩夢啊……” “哼魔熏!你這毒婦竟也來了衷咽?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤蒜绽,失蹤者是張志新(化名)和其女友劉穎镶骗,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體躲雅,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡鼎姊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了相赁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片此蜈。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖噪生,靈堂內的尸體忽然破棺而出裆赵,到底是詐尸還是另有隱情,我是刑警寧澤跺嗽,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布战授,位于F島的核電站,受9級特大地震影響桨嫁,放射性物質發(fā)生泄漏植兰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一璃吧、第九天 我趴在偏房一處隱蔽的房頂上張望楣导。 院中可真熱鬧,春花似錦畜挨、人聲如沸筒繁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毡咏。三九已至,卻和暖如春逮刨,著一層夾襖步出監(jiān)牢的瞬間徊都,已是汗流浹背纽甘。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人粤攒。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓杠愧,卻偏偏與公主長得像淆九,于是被迫代替她去往敵國和親劲蜻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內容

  • 引用類型的值時引用類型的一個實例戴涝。在ECMAScript中滋戳,引用類型是一種數(shù)據(jù)結構钻蔑,用于將數(shù)據(jù)和功能組織在一起。有...
    cooore閱讀 285評論 0 1
  • Chapter 5 引用類型 Object類型 創(chuàng)建Object實例new Object()var person ...
    云之外閱讀 391評論 0 0
  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,233評論 0 4
  • 1.Object類型: 兩種創(chuàng)建實例的方式:1.new操作符創(chuàng)建——var person = new Object...
    會有貓惹閱讀 210評論 0 0
  • 第一章: JS簡介 從當初簡單的語言奸鸯,變成了現(xiàn)在能夠處理復雜計算和交互咪笑,擁有閉包、匿名函數(shù)娄涩, 甚至元編程等...
    LaBaby_閱讀 1,667評論 0 6