@aymax
2016-07-15T08:36:25.000000Z
字数 6790
阅读 630
高设笔记
[TOC]
对象是某个特定引用类型的实例,引用类型是一种数据结构,描述的是一类对象所具有的属性和方法
使用 new 操作符后跟一个构造函数来创建的
var person = new Object();
person.name = "Nicholas";
person.age = 29;
属性名中是可以包含非字母非数字的,但是必须用下面的方括号表示法访问
使用对象字面量表示法,最后一个对象不用加逗号,属性名会自动转换为字符串,
var person = {
name : "Nicholas",
'first name' : "Nicholas",
age : 29
};
如果留空其花括号,则可以定义只包含默认属性和方法的对象
var person = {}; //与 new Object()相同,但不是调用 Object()
person.name = "Nicholas";
person.age = 29;
一般更青睐字面量表示法
function displayInfo(args) {
var output = "";
if (typeof args.name == "string") {
output += "Name: " + args.name + "\n";
}
if (typeof args.age == "number") {
output += "Age: " + args.age + "\n";
}
alert(output);
}
displayInfo({
name: "Nicholas",
age: 29
});
displayInfo({
name: "Greg"
});
对那些必需值使用命名参数,而使用对象字面量来封装多个可选参数
alert(person["name"]); //"Nicholas"
alert(person.name); //"Nicholas"
var colors = new Array(3); // 创建一个包含 3 项的数组
var names = new Array("Greg"); // 创建一个包含 1 项,即字符串"Greg"的数组
var colors = Array(3); // 创建一个包含 3 项的数组
var names = Array("Greg"); // 创建一个包含 1 项,即字符串"Greg"的数组
var colors = ["red", "blue", "green"]; // 创建一个包含 3 个字符串的数组
var names = []; // 创建一个空数组
var values = [1,2,]; // 不要这样!这样会创建一个包含 2 或 3 项的数组
var options = [,,,,,]; // 不要这样!这样会创建一个包含 5 或 6 项的数组
与对象一样,在使用数组字面量表示法时,也不会调用 Array 构造函数
var arr = [0, 1];
console.log(arr.length); // 2
console.log(arr[2]); // undefined
console.log(arr.length); // 2
arr[3] = 3;
console.log(arr[2]); // undefined
console.log(arr.length); // 4
这个例子中如果初始化 a[3],跳过 a[2],数组长度会变成 4
var colors = ["red", "blue", "green"]; // 创建一个包含 3 个字符串的数组
colors.length = 2;
alert(colors[2]); //undefined
数组的 length 属性不是只读的,通过设置这个属性,可以从数组的末尾移除项或向数组中添加新项(新增的每一项都会取得 undefined 值)
检测数组
ECMAScript 5中新增的 Array.isArray()方法
if (Array.isArray(value)) {
//对数组执行某些操作
}
转换方法
var colors = ["red", "blue", "green"]; // 创建一个包含 3 个字符串的数组
alert(colors.toString()); // red,blue,green
alert(colors.valueOf()); // red,blue,green
alert(colors); // red,blue,green
alert(colors.join("||")); //red||green||blue
栈方法
push()
- 接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度pop()
- 则从数组末尾移除最后一项,减少数组的 length 值,然后返回移除的项队列方法
shift()
- 移除数组中的第一个项并返回该项,同时将数组长度减 1unshift()
- 数组前端添加任意个项并返回新数组的长度用 push + shift 或者 pop + unshift 可以模拟队列
重排序方法
reverse()
- 反转数组序列并返回sort()
- 把每一项转化为字符串再进行比较
var values = [0, 1, 5, 10, 15];
values.sort();
alert(values); //0,1,10,15,5
添加比较函数
function compare(value1, value2) {
if (value1 < value2) {
return -1;
} else if (value1 > value2) {
return 1;
} else {
return 0;
}
}
var values = [0, 1, 5, 10, 15];
values.sort(compare);
alert(values); //0,1,5,10,15
对于数值,用下面这种比较函数会提高效率
function compare(value1, value2) {
return value2 - value1;
}
操作方法
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
splice()
- 够基于当前数组中的一或多个项创建一个新数,不影响原数组
- 在只有一个参数的情况下,slice()方法返回从该参数指定位置开始到当前数组末尾的所有项
- 如果有两个参数,该方法返回起始和结束位置之间的项,但不包括结束位置的项
- 如果 slice()方法的参数中有一个负数,则用数组长度加上该数来确定相应的位置。例如,在一个包含 5项的数组上调用 slice(-2,-1) 与调用 slice(3,4)得到的结果相同。
- 如果结束位置小于起始位置,则返回空数组。
splice()
- 向数组的中部插入项
- 删除:可以删除任意数量的项,只需指定 2 个参数:要删除的第一项的位置和要删除的项数。 例如,splice(0,2)会删除数组中的前两项
- 插入:可以向指定位置插入任意数量的项,只需提供 3 个参数:起始位置、0(要删除的项数)和要插入的项。如果要插入多个项,可以再传入第四、第五,以至任意多个项。例如, splice(2,0,"red","green") 会从当前数组的位置 2 开始插入字符串 "red" 和 "green"
- 替换:可以向指定位置插入任意数量的项,且同时删除任意数量的项,只需指定 3 个参数:起 始位置、要删除的项数和要插入的任意数量的项。插入的项数不必与删除的项数相等。例如,splice (2,1,"red","green") 会删除当前数组位置 2 的项,然后再从位置 2 开始插入字符串 "red" 和 "green"
位置方法 indexOf()
和 lastIndexOf()
- 接收两个参数:要查找的项和(可选的)表示查找起点位置的索引
indexOf()
方法从数组的开头(位置 0)开始向后查找,lastIndexOf()
方法则从数组的末尾开始向前查找- 在没找到的情况下返回 -1
- 使用全等操作符比较
迭代方法
接收三个参数:数组项的值、该项在数组中的位置和数组对象本身。
every()
:对数组中的每一项运行给定函数,如果该函数对每一项都返回 true,则返回 truefilter()
:对数组中的每一项运行给定函数,返回该函数会返回 true 的项组成的数组forEach()
:对数组中的每一项运行给定函数。这个方法没有返回值map()
:对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组some()
:对数组中的每一项运行给定函数,如果该函数对任一项返回 true,则返回 true。
以上方法都不会修改数组中的包含的值
归并方法 :reduce()
和 reduceRight()
reduce()
函数数接收 4 个参数:前一个值、当前值、项的索引和数组对象。这 个函数返回的任何值都会作为第一个参数自动传给下一项。第一次迭代发生在数组的第二项上,因此第 一个参数是数组的第一项,第二个参数就是数组的第二项,reduceRight()
就是反过来
使用自 UTC(Coordinated Universal Time,国际协调时间)1970 年 1 月 1 日午夜(零时)开始经过 的毫秒数来保存日期
要创建一个日期对象,使用 new 操作符和 Date 构造函数即可,在不传递参数的情况下,新创建的对象自动获得当前日期和时间
parse()
接收一个表示日期的字符串参数,然后尝试根据这个字符串返回相应日期的毫秒数,日期格式因实现而已,如果字符串不但表示日期,则返回NaN
var someDate = new Date(Date.parse("May 25, 2004"));
var someDate = new Date("May 25, 2004");
像上面直接写在 Date()
里面,Date()
也会在后台调用 parse()
UTC()
Date.UTC() 的参数分别是年份、基于 0的月份(一月是 0,二月是 1,以此类推)、月中的哪一天 (1 到 31)、小时数(0 到 23)、分钟、秒以及毫秒数。在这些参数中,只有前两个参数(年和月)是必需的。如果没有提供月中的天数,则假设天数为 1;如果省略其他参数,则统统假设为 0。以下是两个使用 Date.UTC()方法的例子
// 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));
<div class="md-section-divider"></div>
如同模仿 Date.parse()一样,Date 构造函数也会模仿 Date.UTC(),但有一点明显不同:日期 和时间都基于本地时区而非 GMT来创建
// 本地时间 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);
<div class="md-section-divider"></div>
now()
//取得开始时间
var start = Date.now();
//调用函数
doSomething();
//取得停止时间
var stop = Date.now(),
result = stop – start;v
<div class="md-section-divider"></div>
在低版本浏览器,可以使用 + 操作符实现
//取得开始时间
var start = +new Date();
//调用函数
doSomething();
//取得停止时间
var stop = +new Date(),
result = stop - start;
<div class="md-section-divider"></div>
继承的方法
toString()
和 toLocalString()
- Internet Explorer 8
toLocaleString() — Thursday, February 01, 2007 12:00:00 AM
toString() — Thu Feb 1 00:00:00 PST 2007- Firefox 3.5
toLocaleString() — Thursday, February 01, 2007 12:00:00 AM
toString() — Thu Feb 01 2007 00:00:00 GMT-0800 (Pacific Standard Time)- Safari 4
toLocaleString() — Thursday, February 01, 2007 00:00:00
toString() — Thu Feb 01 2007 00:00:00 GMT-0800 (Pacific Standard Time)- Chrome 4
toLocaleString() — Thu Feb 01 2007 00:00:00 GMT-0800 (Pacific Standard Time)
toString() — Thu Feb 01 2007 00:00:00 GMT-0800 (Pacific Standard Time)- Opera 10
toLocaleString() — 2/1/2007 12:00:00 AM
toString() — Thu, 01 Feb 2007 00:00:00 GMT-0800
valueOf()
- 返回日期的毫秒表示,方便使用比较操作符(小于或大于)来比较日期值
日期的格式化方法
- toDateString()——以特定于实现的格式显示星期几、月、日和年;
- toTimeString()——以特定于实现的格式显示时、分、秒和时区;
- toLocaleDateString()——以特定于地区的格式显示星期几、月、日和年;
- toLocaleTimeString()——以特定于实现的格式显示时、分、秒;
- toUTCString()——以特定于实现的格式完整的 UTC 日期。
其他方法 - 详见高设 P102
var expression = / pattern / flags ;
<div class="md-section-divider"></div>
flag
- g:表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即 停止;
- i:表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写;
- m:表示多行(multiline)模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模 式匹配的项。
/* * 匹配字符串中所有"at"的实例 */
var pattern1 = /at/g;
/* * 匹配第一个"bat"或"cat",不区分大小写 */
var pattern2 = /[bc]at/i;
/* * 匹配所有以"at"结尾的 3 个字符的组合,不区分大小写 */
var pattern3 = /.at/gi;
<div class="md-section-divider"></div>
元字符必须转义
( [ { \ ^ $ | ) ? * + .]}
/*
* 匹配第一个"bat"或"cat",不区分大小写
*/
var pattern1 = /[bc]at/i;
/*
* 匹配第一个" [bc]at",不区分大小写
*/
var pattern2 = /\[bc\]at/i;
/*
* 匹配所有以"at"结尾的 3 个字符的组合,不区分大小写
*/
var pattern3 = /.at/gi;
/*
* 匹配所有".at",不区分大小写
*/
var pattern4 = /\.at/gi;
<div class="md-section-divider"></div>
也可以使用构造函数构造,它接收两个参数:一个是要匹配的字符串模式,另一个是可选的标志字符
/*
* 匹配第一个"bat"或"cat",不区分大小写
*/
var pattern1 = /[bc]at/i;
/*
* 与 pattern1 相同,只不过是使用构造函数创建的
*/
var pattern2 = new RegExp("[bc]at", "i");
用字符串表示正则表达式的时候要双重转义
RegExp 实例属性
- global:布尔值,表示是否设置了 g 标志。
- ignoreCase:布尔值,表示是否设置了 i 标志。
- lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从 0算起。
- multiline:布尔值,表示是否设置了 m 标志。
- source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回。 通过这些属性可以获知一个正则表达式的各方面信息,但却没有多大用处,因为这些信息全都包含 在模式声明中。
RegExp 实例方法