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()