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

posted on 2022-04-08 19:39  cookie的笔记簿  阅读(32)  评论(0编辑  收藏  举报