1. 程式人生 > 其它 >JavaScript高階程式設計——第五章 引用型別

JavaScript高階程式設計——第五章 引用型別

JavaScript高階程式設計(紅寶書)

第五章 引用型別

  • 物件
  • 陣列
  • 基本的JavaScript型別
  • 基本型別和基本包裝型別

引用型別的值/物件是引用型別的一個例項。

object型別

建立例項:兩種方式;

var person = new Object();
person.name = "nana";
person.age = 29;

物件字面量表示法。物件字面量也是向函式傳遞大量可選引數的首選方式。

var person = {
    name : "nana",
    age : 29
};
person
{name: 'nana', age: 29}

使用物件字面量來指定不同的資料。

function dispalyInfo(args){
    var output = "";
    if (typeof args.name == "string"){
        output += "Name: " + args.name + "\n";
    }
    if (typeof args.age == "number"){
        output += "Age: " + args.age + "\n";
    }
    console.log(output);
}
dispalyInfo({
    name: "jing",
    age: 21
});

Name: jing
Age: 21

dispalyInfo({
    name: "gaga"
});

Name: gaga

訪問物件屬性時的兩種方法:點表示法;方括號法

Array型別

建立陣列的兩種基本方式。

!ECMAScript陣列的每一項可以儲存任何型別的資料。

檢測陣列

if (colors instanceof Array){
    console.log(true)
}
VM5223:2 true

轉換方法

toLocalestring()、tostring()和valueof()方法

棧方法

棧是一種LIFO(Last-In-First-Out,後進先出)的資料結構,也就是最新新增的項最早被移除。只發生在一個位置—棧的頂部。

佇列方法

佇列資料結構的訪問規則是FIFO(First-ln-First-Out,先進先出)。佇列在列表的末端新增項,從列表的前端移除項。

重排序方法

比較函式

function compare(value1, value2){
    if (value1 < value2){
        return -1;
    } else if (value1 > value2){
        return 1;
    } else {
        return 0;
    }
}

操作方法

concat()方法可以基於當前陣列中的所有項建立一個新陣列。

位置方法

要查詢的項和(可選的)表示查詢起點位置的索引。

迭代方法

every每一項都返回true,則返回true。

var everyResult = number.every(function(item, index, array){
    return(item > 2);
});
console.log(everyResult);

VM7937:1 false

任一項返回true,則返回true。

var someResult = number.some(function(item, index, array){
    return(item > 2);
});
console.log(someResult);

VM8011:1 true

返回true的項組成的陣列。

var filterResult = number.filter(function(item,index,array){
    return (item > 2);
});
onsole.log(filterResult);

(5) [3, 4, 5, 4, 3]

返回每次函式呼叫的結果組成的陣列。

var mapResult = number.map(function(item, index, array){
    return item*2;
});
console.log(mapResult)

(9) [2, 4, 6, 8, 10, 8, 6, 4, 2]

縮小方法

這兩個方法都接收兩個引數:一個在每一項上呼叫的函式和(可選的)作為縮小基礎的初始值。傳給reduce()和reduceRight()的函式接收4個引數:前一個值、當前值、項的索引和陣列物件。

var values = [1,2,3,4,5];

var sum = values.reduce(function(prev, cur, index, array){
    return prev + cur;
});

console.log(sum)

15

var sum = values.reduceRight(function(prev, cur, index, array){
    return prev + cur;
});

console.log(sum)

15

Date

毫秒數來儲存日期。

Date.parse()接收一個表示日期的字串引數,根據這個字串返回相應日期的毫秒數。

Date.UTC()

日期/時間元件方法

RegExp型別

正則表示式

for (i=0; i<10;i++){
    re = new RegExp("cat", "g");
    re.test("catastrophe");
}
true

RegExp例項屬性

RegExp例項方法

接收一個引數,引數是要應用模式的字串,返回包含第一個匹配項資訊的陣列;返回的陣列是Array例項,包含兩個屬性:index,input

var text = "mom and dad and baby";
var pattern = /mom( and dad( and baby)?)?/gi;
var matches = pattern.exec(text);
console.log(matches.index);

0

整個字串與模式匹配

console.log(matches.input);

mom and dad and baby

console.log(matches[0]);

mom and dad and baby

第一項 匹配的整個字串

console.log(matches[1]);

and dad and baby

第二項 包含與第一個捕獲組匹配的內容

包含它的捕獲組

console.log(matches[2]);

and baby

第三項 包含與第二個捕獲組匹配的內容

最內部的捕獲組

對於exec()方法而言,即使在模式中設定了全域性標誌(g),它每次也只會返回一個匹配項。

在不設定全域性標誌的情況下,在同一個字串上多次呼叫exec()將始終返回第一個匹配項的資訊。

在設定全域性標誌的情況下,每次呼叫exec()則都會在字串中繼續查詢新匹配項

var text = "000-00-0000";
var pattern = /\d{3}-\d{2}-\d{4}/;

if (pattern.test(text)){
    console.log("This patter was matched.");
}

This patter was matched.

RegExp建構函式屬性

input屬性返回了原始字串;

leftContext屬性返回了單詞short之前的字串,而rightContext屬性則返回了short之後的字串;

lastMatch屬性返回最近一次與整個正則表示式匹配的字串,即short;

lastParen屬性返回最近一次匹配的捕獲組,即例子中的s。

建立了一個包含兩個輔獲組的模式,並用該模式測試了一個字串。

模式的侷限性

Function型別

沒有過載(深入理解)

函式宣告與函式表示式

解析器會率先讀取函式宣告,並使其在執行任何程式碼之前可用(可以訪問);至於函式表示式,則必須等到解析器執行到它所在的程式碼行,才會真正被解釋執行。請看下面的例子。

以上程式碼之所以會在執行期間產生錯誤,原因在於函式位於一個初始化語句中。在執行到函式所在的語句之前,變數sum中不會儲存有對函式的引用。

作為值的函式

function callSomeFunction(someFunction, someArgument){
    return someFunction(someArgument);
}

這個函式接受兩個引數。第一個引數應該是一個函式,第二個引數應該是要傳遞給該函式的一個值。

要訪問函式的指標而不執行函式的話,必須去掉函式名後面的那對圓括號。

從一個函式中返回另一個函式。根據某個物件屬性對陣列進行排序。

var data = [{name:"zz", age:20}, {name:"kk", age:21}];

根據年齡大小排序sort

function createComparisonFunction(propertyName){
    return function(object1, object2){
        var value1 = object1[propertyName]; // 物件1的值
        var value2 = object2[propertyName]; // 物件2的值
		
		// 兩值進行比較
        if (value1 < value2){
            return -1;
        }else if (value1 > value2){
            return 1;
        }else {
            return 0;
        }
    };
}
data.sort(createComparisonFunction("name"));

sort()方法會呼叫每個物件的toString()方法以確定它們的次序;但是!新建立了一個比較函式,按照每個物件的屬性值進行排序。

函式內部屬性

在函式內部,有兩個特殊的物件:arguments和this。arguments是一個類陣列物件,包含著傳入函式的所有引數。這個物件有一個叫callee的屬性,是一個指標,指向擁有這個arguments物件的函式。

另一個特殊物件是this,this引用的是函資料以執行的環境物件。當在網頁的全域性作用域中呼叫函式時,this物件引用的就是window)。

ECMAScript5也規範化了另一個函式物件的屬性:callero。

函式屬性和方法

對於ECMAScript中的引用型別而言,prototype是儲存它們所有例項方法的真正所在。tostring()和valueOf()等方法實際上都儲存在prototype名下,只不過是通過各自物件的例項訪問罷了。在建立自定義引用型別以及實現繼承時,prototype屬性的作用是極為重要的。

每個函式都包含兩個非繼承而來的方法:apply()和call()。這兩個方法的用途都是在特定的作用域中呼叫函式,實際上等於設定函式體內this物件的值。

callSum1()在執行sum()函式時傳入了this作為this值,因為是在全域性作用域中呼叫的,所以傳入的就是windows物件和arguments物件。

callSum2同樣也呼叫了sum()函式,但它傳入的則是this和一個引數陣列。這兩個函式都會正常執行並返回正確的結果。

apply(),call()擴充函式的作用域。

基本包裝型別

Boolean型別

Number型別

String型別

  • 字元方法
  • 字串操作方法
  • 字串位置方法
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);
}

console.log(positions)

(5) [3, 24, 32, 35, 52]

  • trim()