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