我的文章会在我的Blog同步更新,Blog刚搭了几天,用于记录我的学习过程:Million
<h1>第五章 引用类型</h1>
引用类型的值(对象)是引用类型的一个实例。
如前所述,对象是某个特定引用类型的实例。新对象是使用new操作符后跟一个构造函数来创建的。构造函数本身也是一个函数,只不过该函数是出于创建新对象的目的而定义的。例子:
var person = new Object();
这行代码创建了一个Object这个引用类型的新实例,然后把该实例保存在了变量person中。(这句话特别有意思,如果我用自己的话说,会说“创建了一个叫person的Object的新实例,而不会说先创建了实例再把实例保存在person中”)使用的构造函数就是Object( )。它为新对象(person定义了默认的属性和方法)。ECMAScript提供了很多原生引用类型(例如Object( ),Date( ),RegExp( ))。以便开发人员完成常见的计算任务。
<h2>5.1Object类型</h2>
创建Object类型的方法有两种。
第一种,使用new操作符后跟Object构造函数。例子:
var person = new Object();
person.name = "Nicholas";
person.age = 29;
第二种,用对象字面量表示法。这种方法更被开发人员所接受,最推荐使用。代码量少,且给人封装数据的感觉。实际上,对象字面量也是向函数传递大量可选参数的首选方式。例子:
var person = {
name : "Nicholas", //属性名也可以用字符串如:"name" : "Nicholas"
age : 29 // "age" : 29
}
在对象字面量中使用逗号来分隔不同的属性,因此“Nicholas”后面记得加逗号,最后一个属性后面不能加逗号。否则IE7及更早版本和opera会出现错误。
✎注意:使用对象字面量定义对象时,并没有调用到Object函数(即内在原理不是Object函数,Firefox 2以及更早版本的Firefox会调用Object函数,但Firefox3之后就不会了。)
✎关于表达式上下文(expression context)和语句上下文(statement context)
在用对象字面量定义新对象的例子中,左边的花括号“{”表示对象字面量的开始,因为它出现在了表达式上下文(expression context)中("person=",等号的后面)。ECMAScript中的表达式上下文指的是该上下文期待一个值(表达式)。赋值操作符(“=”)表示后面是一个值(这里的值是一个对象,不要直觉觉得值就是一个数字),所以左花括号在这里表示一个表达式的开始。
同样的花括号如果出现在一个语句上下文(statement context)中,例如跟在 if 语句条件的后面,则表示一个语句块的开始。
对象字面量除了可以用来定义新对象,当函数需要大量可选参数时,使用对象字面量也是不错的选择。例子:
function displayInfo(args){
var output = "";
if(typeof args.name == "string"){
output += "Name:" + args.name + "\n";
console.log(output);
}
if(typeof args.age == "number"){
output="";
output += "Age" +args.age + "\n";
console.log(output);
}
}
//用对象字面量传递参数,这时候args就是对象,name,age就是args的属性
displayInfo({
name:"Nicholas",
age:29
})
displayInfo({
name:"Greg"
})
这个例子中,函数displayInfo()接受一个名为args的参数,这个参数可能带有一个名为name或age的属性,有可能同时有也可能都没有。在函数内部用typeof操作符检测每个属性是否存在,再根据相应属性来构建显示信息。
对象字面量传递参数法特别适合在需要向函数传递大量可选参数的情形。最好的做法是:对那些必需值使用命名参数(直接写在括号内),用对象字面量来封装多个可选参数。
✎访问对象属性时用点表示法或者是方括号“[ ]”的取舍
仍然以上面的person对象为例子。
使用方括号访问对象属性的时候,千万千万记得要给对象属性加双引号(亲测单引号也可以)才能真正访问到那个对象属性,这是个很容易出现错误但找不到原因的地方。例子:
alert(person["name"]); // Nicholas
alert(person[name]); // undefined
使用方括号的优点一是,可以使用变量间接地访问对象属性。例子:
var propertyName = "name"; // 必须加双引号,否则是undefined
alert(person[propertyName]); // Nicholas
alert(person.name); // undefined
方括号的优点二:如果对象属性名中包含会导致语法错误的字符(比如空格),或者属性名使用的是关键字或保留字,也可以使用方括号表示法。例子:
person["first name"] = "Nicholas";
person["last-name"] = "Tom";
alert(person["first name"]);
有空格,“ - ”等会导致错误的属性名,只能通过方括号语法赋值(对象字面量也不行)和访问。(亲测)
当然,除非是使用变量来访问属性,或者属性中带有特殊字符,否则还是建议用点表示法访问。
<h2>5.2Array类型</h2>
avaScript的数组类型与其他语言的数组类型的最大不同,就是JavaScript数组的每一项可以保存任何类型的数据,比如第一项保存数字,第二项保存字符串,第三项保存对象。而且可以随着数据的添加自动增长以容纳新增数据。
创建数组的两种方法。方法一是使用Array构造函数,例子:
var colors = new Array();
如果预先知道了数组是多少位,也可以给Array构造函数直接传递数量,该数字就会成为该数组的length属性的值
var colors = new Array(20); // colors.length = 20
也可以直接向Array构造函数直接传递数组包含的值
var colors = new Array("red", "blue", "orange");
在使用Array构造函数的时候,可以省略“new”操作符。省略“new"操作符的效果与添加“new”的效果相同。
第二种创建数组的方法:数组字面量表示法。(与对象一样,使用数组字面量表示法时也不会调用Array( )构造函数(Firefox3及更早的版本除外))
var colors = [ "red", "blue", "orange" ];
var names = [];
var values = [1,2,] //不要这样做,IE8及之前的版本会出BUG
var options = [, , , , ,] //不要这样做,IE8及之前的版本会出BUG
第三种情况在IE8及之前的版本中,数组values会有1,2,undefined三个值,其他浏览器则只有1和2.第四种的情况与第三种类似,IE会创建6个值,其他浏览器会创建5个,因为有浏览器差异,所以强烈建议不这么做。不过正常人谁这么做。
把玩Array引用类型的属性length
数据的length属性有一个特点——可写可读。如果设置这个属性的值比现有数组长度短,则设置的长度后面的数组的值就会被删除。如果设置length的值比现有的length大(比如设置array.length=100),则数组的长度变为100,空位置为undefined。利用length也可以很方便地在数组末尾添加新的值。例子:
var colors = ["red", "blue", "orange"]; // colors.length = 3;
colors[colors.length] = "black" // clolors[3] = "black";
当把一个值放在超出当前数组大小的位置,数组就会重新计算长度,长度值变成最后一项的索引(索引就是从0开始的)加一。例子:
var colors = ["red", "blue", "orange"];
var colors[99] = "black";
alert(colors.length) //100
中间colors[3]到colors[99]的值都是undefined。
数组的最大长度可以到4294967295(算冷知识吧)如果超过这个数就会出现异常。如果一个数组的大小接近这个上限值,会导致运行时间超长的脚本错误。
<h3>5.2.1检测数组</h3>
对于一个网页或一个全局作用域而言,使用instanceof操作符就能得到满意的结果。
而instanceof操作符的问题在于,它假定只有一个全局执行环境。如果网页红包含多个框架,那实际上就会出现两个及以上的执行环境,从而存在两个以上不同版本的Array构造函数,如果从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数。
为了解决这个问题,ECMAScript5新增了 Array.isArray( ) 方法,这个方法的目的是最终确定这个值到底是不是数组,而不管它是在哪个全局执行环境中创建的(我也不知道为什么多个执行环境下有多个不同的构造函数就使instanceof操作符无法检测数组。)该方法用法如下:
if(Array.isArray(value)){
//对数组执行操作
}
<h3>5.2.2转换方法</h3>
前面章节提过,所有对象都自带 toLocalString( )、toString( ) 和 valueOf( )方法。其中,调用数组的toString( )方法会返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串。而调用valueOf( )返回的还是数组。实际上,toString( )方法为了创建这个字符串会调用数组每一项的toString()方法(原理)。例子:
var colors = ["red", "blue", "orange"];
alert(colors.toString()); //red,blue,orange
alert(colors.valueOf()); //red,blue,orange
alert(colors); //red,blue,orange
第一个alert显式地调用了toString方法(相对第三个alert),每个值的字符串表示拼接成了一个字符串,中间用逗号分隔。第二个alert调用valueOf方法,最后一行代码直接将数组传递给alert。由于alert( ) 要接收字符串参数,所以它会在后台自动调用toString方法(相对第一个alert的显示调用),由此得到与第一个alert相同的结果。(用typeof 和 valueOf亲测 colors.valueOf( )的类型是Array,colors.toString( )的类型是String)
✎toString()和toLocalString()的不同
toLocaleString 方法返回一个 String 对象,这个对象中包含了用当前区域设置的默认格式表示的日期。
toLocaleString 只是用来显示结果给用户;最好不要在脚本中用来做基本计算,因为返回的结果是随机器不同而不同的。
示 例:
下面这个例子说明了 toLocaleString 方法的用法。
var d, s; // 声明变量。
d = new Date(); // 创建 Date 对象。
s = "Current setting is ";
s += d.toLocaleString(); // 转换为当前区域。根据所在地区(中国,欧洲)的不同,返回的日期格式不同
return(s); // 返回转换的日期。
数组继承的前面三个方法,在默认情况一都会以逗号分隔的字符串的形式返回数组项(有点争议,valueOf( )返回的类型应该是Array类型,或对象型)而如果使用join( ) 方法,则可以使用不同的分隔符来构建这个字符串。join()方法只接受一个参数,即用作分隔符的字符串,然后返回包含所有数组项的字符串。例子:
var colors = ["red", "blue", "orange"];
alert(colors.join("-")); //red-blue-orange
alert(colors.join("||")); //red||blue||orange
<h3>5.2.3栈方法</h3>
就是数据结构中的栈。栈是一种LIFO(Last-In-First-Out,后进先出)的数据结构(碟子模型)。栈中项的推入和弹出都发生在一个位置——栈的顶部(数组的尾部)。ECMAScript为数组提供了push( )和pop()方法,以便实现类似栈的行为。
push( )(push: v. 推入)方法可以接收任意数量的参数(!),把他们逐个添加到数组的末尾,并返回修改后数组的长度。
pop()(pop: n. 啪的一声,数据弹出的声音),把数组末尾的最后一项移除,减少length的值,然后返回那个被移出的项。
<h3>5.2.4队列方法</h3>
队列数据结构的访问规则是FIFO(Firest-In-First-Out,先进先出,派对模型),队列在列表的末端添加项,从列表的前端移除项。实现这两个操作的数组方法是shift(),它能移出数组的第一项,并返回该项。同时将数组长度减1。结合使用shift()和 push()方法,可以像使用队列一样使用数组。
<h3>5.2.5重排序方法</h3>
数组中已经存在两个可以直接用来重排序的方法:reverse()和sort()。 reverse()故名思义会翻转数组项的顺序。数组是被直接覆盖,不是翻转它的副本。
在默认情况下,sort()方法按升序排列数组项——即最小的值位于前面,最大的值排在最后面。但sort()的大小即使数组是数字也不是按照数字大小排序的,而是都会先在内部通过toString( )转换为字符串,通过比较字符串按大到小排序。例子:
var values = [0,1,5,10,15];
values.sort( );
alert(values); //0,1,10,15,5
可见,即使例子中值的顺序没有问题,但sort( ) 方法也会根据测试字符串的结果改变原来的顺序。(其实JS中的sort()方法是按比较值的Unicode顺序进行排序的)
这种排序方式很明显不是最佳方案,因此sort()方法可以接收一个比较函数作为参数,以便我们指定哪个值位于哪个值前面。
比较函数接受两个参数,如果第一个参数应该位于第二个之前则返回一个负数,如果两个参数相等,则返回0,如果第一个参数应该位于第二个参数之后,则返回一个正数。以下就是一个简单的比较函数:
function compare(value1,value2){
if(value1<value2){
return -1;
}else if(value1>value2){
return 1;
}else{
return 0;
}
}
只要将其作为参数传递给sort()方法即可。例子:
var values = [0,1,5,10,15];
varlues.sort(compare);
alert(values); //0,1,5,10,15
如果想要产生降序的结果,只要交换比较函数返回的值即可。(把return 1 和return -1交换位置)
✎注意:reverse()和sort()方法的返回值是经过排序之后的数组(不会变成字符串)。
对于数值类型或者其valueOf( ) 方法会返回数值类型的对象类型,可以使用一个更简单的比较函数。对于这个函数只要用第二个值减第一个值即可。
//用两行代码实现数值类型数组的升降排序
function compare(value1,value2){
return value2-value1; //return value1-value2就是降序
}
由于比较函数通过返回一个小于零,等于零,或大于零的值来影响排序结果,因此减法操作就可以适当地处理所有这些情况。
<h3>5.2.6操作方法</h3>
操作方法就是讲操作数组的各种方法。
第一个方法是concat()。可以基于当前数组中的所有项创建一个新数组。具体来说,这个方法会先创建当前数组一个副本,然后将接收到的参数添加到这个副本的末尾,最后返回新构建的数组。如果没有给concat()传递参数,它就只会复制当前数组并返回副本。如果传递给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
下一个方法是slice()。它能够基于当前数组中的一或多个项创建一个新数组。slice()方法可以接受一或两个参数。即要返回项的起始位置和结束位置(位置从0开始算)。
只有一个参数:slice()返回从该参数指定位置开始到当前数组末尾的所有项。
两个参数:返回起始和结束位置之间的项——但不包括结束位置的项。且slice()方法不会影响原始数组。例子:
var colors = ["red", "green", "blue", "yellow", "purple"];
var colors2 = colors.slice(1);
var colors3 = colors.slice(1,4);
alert(colors2); //green,blue,yellow,purple
alert(colors3); //green,blue,yellow
✎注意:如果slice方法的参数中有一个负数,则用数组长度加上该数来确定相应的位置。例如,在一个包含5项的数组上调用slice(-2,-1)与调用slice(3,4)得到的结果相同。如果结束位置小于起始位置,则返回空数组。
第三个是splice()方法。最强大的数组方法,其有很多种用法。splice()的主要用途是向数组的中部插入项,但使用这种方法的方式有如下3种。
- 删除:可以删除任意数量的项,只需指定2个参数:要删除的第一项的位置和要删除的项数。例如:splice(0,2)会从位置0开始,删除数组中的前两项。
- 插入:可以向指定位置插入任意数量的项。只需3个参数:起始位置,0(要删除的项数,不删就是0)和要插入的项,如果要插入多个项,可以再传入第四,第五等任意多个项。例如,splice(2,0,"red","green")会从当前数组的位置2开始插入字符串“red”和“green”(“red”会成为在位置2的值,“green”在位置3)
- 替换:可以向指定位置插入任意数量的项,同时删除一定数量的项,插入的项数不必与删除的项数相等。例如:splice(2,1,“red”,"green")会删除当前数组位置2的项,然后从位置2开始插入字符串“red”和“green”。“red”在位置2。
splice()方法始终都会返回一个数组,该数组中包含从原始数组中删除的项(如果没有删除任何项就返回一个空数组)。下面是三种用法的例子:
var colors = ["red", "green", "blue"];
var removed = colors.splice(0,1);
alert(colors); //green,blue
alert(colors); //red,返回被删除的那一项
<h2>5.2.7位置方法</h2>
ECMAScript5为数组添加的两个位置方法:indexOf( ) 和lastIndexOf( ) 都接收两个参数:要查找到项,表示查找起点的索引(可选,起点也可以被搜索到)。indexOf()是从前向后查找,lastIndexOf()是从后向前查找。两个方法返回的都是查找的项在数组中的位置。查找不到则返回-1。lastIndexOf()返回的位置也是从头开始计的,虽然是从最后开始找。
在用第一个参数与数组中的项比较时,使用的是全等操作符(“===”),非常严格。例子:
var numbers = [1,2,3,4,5,4,3,2,1];
alert(numbers.indexOf(4)) // 3
alert(numbers.lastIndexOf(4)) // 5
alert(number.indexOf(4,4)); //5
alert(number.lastIndexOf(4,4)) //3 第二个参数是4,则相当于数组只有前面五项[1,2,3,4,5]以5为最后一项开始找。
var person = {name : "Nicholas"};
var people = {name : "Nicholas"};
var morePlople = [person];
alert(people.indexOf(person)); //-1
alert(morePeople.indexOf(person))//0
比较难懂的是lastIndexOf()加第二个参数,测试了一下终于自己测出来。lastIndexOf()的第二个参数查找起点的索引也是从头开始计算的,比如第二个参数是2,则相当于整个数组只剩前面的0,1,2.后面的项相当于“不见了”,然后以第2为最后一个位置开始查找数组。
支持indexOf( ) 和lastIndexOf( )的浏览器有 IE9+(IE9+的意思用IE9也能成功),Safari 3,Opera 5和Chrome.
<h3>5.2.8迭代方法</h3>
ECMAScript5为数组定义了5个迭代方法。每个方法都接收两个参数:要在每一项上运行的函数和运行该函数的作用域对象(可选)——影响this的值。传入这些方法中的函数(函数由我们自己编写)会接收三个参数(要写在函数的参数栏里):数组的项的值(不能说“数组的项”,因为数组的项包括数组的项的值和位置),项的位置,数组对象(迭代方法是数组对象的方法,对象才有方法,是数组,对象)本身。 以下是这5个迭代方法:
- every():让数组中的每一项都过一遍every()里的那个函数,全部返回true了,every()方法才返回true。
- some():让数组中的每一项都过一遍some()里的那个函数,只要有一个返回true,some()方法就返回true。
- filter():筛选器。数组的每一项都过一遍filter()里的函数,只返回一个通过了“考验”的数组。
- forEach():对数组运行给定的函数,这个方法没有返回值。
- map():对数组每一项过一遍map()里的函数,返回经过这个函数“加工”过的结果组成的数组。
下面是every()和some() 的例子,返回true,false
var numbers = [1,2,3,4,5,6];
var result = numbers.every(function(item,index,array){
return item>2;
})
console.log(result); //false
var result = numbers.some(function(item,index,array){
return item>2;
})
console.log(result); //true
两个例子的ES6写法:
let result = numbers.every((item,index,array) => item>2);
console.log(result); //false
let result = numbers.some((item,index,array) => item>2);
console.log(result);
使用的是ES6的箭头函数,适合简短的函数,不需要命名,箭头后面默认是return,具体看阮一峰的文档。
下面是filter()的例子,返回一个由通过函数筛选条件的数组
var numbers = [1,2,3,4,5,6];
var result = numbers.filter(function(item,index,array){
return item>2;
})
console.log(result); // [3,4,5,6]
下面是运行map()的例子,返回一个经过map()内函数加工的数组
var numbers = [1,2,3,4,5,6];
var result = numbers.map(function(item,index,array){
return item*2;
})
console.log(result); // [2,4,6,8,10,12]
下面是forEach()的例子,这个方法(请严谨地说——方法,不是函数,它是数组对象的,方法)没有返回值。本质上相当于对封装了一个for循环给数组。
var numbers = [1,2,3,4,5,6];
numbers.forEach(function(item,index,array){
console.log(item); //会像使用了for循环打印7次
})
亲测在forEach()里对数组的项进行赋值、计算得到的结果不会影响本来的那个数组,甚至在函数内打印出对每项经过计算后的数组,得到的数组也是没有改变的原来的数组。因为函数的参数是按值传递的。例子:
var numbers = [1,2,3,4,5,6];
numbers.forEach(function(i,u,a){
i=i+1;
console.log(i); //每一项都打印出来,都被+1
console.log(a); //打印七次数组,每次都是原来那个数组[1,2,3,4,5,6]
})
console.log(numbers); //外面的数组没有改变,仍是[1,2,3,4,5,6]
以上every(),filter() ,some() ,map() ,forEach()只在IE9+,Firefox2+,Safari 3+,Opera 9.5+和Chrome有效。
打完上面那句因为函数的参数是按值传递的后发现一个有意思的事情,函数参数是按值传递没错,但数组是对象,函数的参数也是原来那个函数的指针,在函数里改变数组内的值,原来的那个数组也会被改变才对。经过亲自测试,当把数组当作参数传入函数,在函数内对数组内的值+1,在外部打印的数组也是经过+1的了!所以上面好像也不是因为函数的参数是按值传递的这个原因。大概forEach()方法不会返回任何值所以也不会改变任何值吧,而console.log(a)打印出来的就是参数里的那个a,所以是原来那个参数。例子:
var numbers = [1,2,3,4,5,6];
function add(array){
for (var i = array.length - 1; i >= 0; i--) {
array[i]+=1;
}
console.log(array);
}
add(numbers); //把数组作为参数传入函数,对每个值+1
console.log(numbers); //外部的numbers也被改变[2,3,4,5,6,7]
//于此同时用基本类型值number做同样的实验,全局的num在函数内经过计算后在全局打印出来的num还是等于6
var num=6;
function addOne(num){
num+=1;
console.log(num);
}
addOne(num);
console.log(num); //6
<h3>5.2.9归并方法</h3>
ECMAScript5还新增了两个归并数组的方法:reduce()和reduceRight()这两个数组会迭代所有项,然后构建一个最终返回的值。两个方法只有一个区别:一个从头开始归并,一个从后向前归并。两个方法都接收两个参数:一个在每项上调用的函数和作为归并基础的初始值。传进这两个方法的函数接收4个参数:前一个值,当前值,项的索引和数组的对象。这个函数返回的任何值都会作为第一个参数(“前一个值”)自动传给下一项。第一次迭代发生在数组的第二项上(在这句话体会“迭代这个词的意思”),前一个值在第一次迭代时是数组的第一项,第二个参数是数组的第二项。第二次迭代的第一个参数就是第一项和第二项迭代(迭代有可能是加减乘除或其他计算方式)后的值。
下面是用reduce()方法求数组uoyou值之和的操作:
var values = [1,2,3,4,5];
var sum = values.reduce(function(prev,cur,index,array){
return prev+cur;
});
alert(sum); //15
第一次执行回调函数,prev是1,cur是2.第二次,prev是3(1加2的结果),cur是3(数组第三项)。这个过程持续到把数组最后一项访问到。最后返回结果。
reduceRight( )方法不讲了区别只是开始的顺序是从后面开始罢了。
支持这两个归并函数的浏览器有: IE9+,Firefox3+,Safari 4+,Opera 10.5+和Chrome。(可以看出这两个方法比上面5个迭代方法要更难兼容。所有浏览器的版本都上了一个数,IE仍是9+才可以访问)。
<h3>5.3Date类型</h3>
要创建一个日期对象,同样使用new操作符和Date构造函数即可。
var now = new Date();
不向Date构造函数传递函数的情况下,新创建的对象默认自动获得当前日期和时间。如果想根据特定的日期和时间(日期:年月日;时间:时分秒),理论上应该传入表示该日期的毫秒数(即从UTC时间1970年1月1日午夜起至该日期经过的毫秒数)。当然JavaScript不可能这么不人道,ECMAScript提供了两个方法:Date.parse( ) 和Date.UTC( )这两种方法可以让你直接写入正常人类的日期即可使日期对象具备特定的日期和时间。两种方法表示日期的格式不同。而且也不用傻傻地写
//不用这么做!
var someDate = new Date(Date.parse("May 25,2004"));
var allFives = new Date(Date.UTC(2005,4,5,17,55,55));
Date构造函数已经自带了这两个方法,如果直接写入“May 25,2004”,函数会自动调用Date.parse( )。如果写入的是2005,4,5,17,55,55,构造函数也会自动调用Date.UTC( )。所以不用像上面那样写。正确的写法:
var someDate = new Date("May 25,2004");
var allFives = new Date(2005,4,5,17,55,55);
✎注意:第二个日期表示的是2005年5月5日,因为月份是从0开始计算的,0-11。
ECMAScript5添加了Date.now( )方法,返回程序运行到这个方法时的日期和时间的毫秒数,可以用来当计时器用,简化了使用Date对象分析代码的工作(不用专门构建Date对象就可以调用的方法)。例子:
var start = Date.now( );
doSomething();
var stop = Date.now();
result = stop - start; //通过start-stop可以得出运行doSomething()具体用了多少时间
又是ECMAScript5才发布的方法,所以能用的浏览器包括: IE9+,Firefox3+,Safari 3+,Opera 10.5+和Chrome。不支持这个方法的浏览器中,可以使用+操作符获取Date对象的时间戳,也可以达到同样的目的。
var start = +new Date();
doSomething();
var stop = +new Date();
result = stop - start;
<h3>5.3.1继承的方法</h3>
与其他引用类型一样,Date类型也重写了toLocaleString()、toString()和valueOf()方法。
总而言之这一段就是告诉我们用toLocaleString()和toString()写出来的日期格式在同一个浏览器中是不一样的。恐怖的是根据浏览器的不同,每个浏览器用toString()输出的结果也是不一样的。toLocalString()同理。书里还有一句话:事实上,toLocaleString()和toString()在浏览器上显示格式的差别仅在调试代码时比较有用,在显示日期和时间上没有什么价值。
至于Date类型中的valueOf()方法则根本不会返回字符串,而是返回日期的毫秒表示(ZZ)。
还有一点是:日期是可以比较大小的,下面例子:
var date = new Date(2007,0,1);
var date = new Date(2007,1,1);
alert(date1<date2); //true
alert(date1>date2); //false
比较早的日期小于比较晚的日期。
<h3>5.3.2日期格式化方法</h3>
介绍了toDateString(),toTimeString() ,toLocalDateString() ,toLocaleDateString() ,toLocaleTimeString() ,toUTCString() ,这几个根据特定实现的格式或特定地区的格式显示的日期格式。与toLocaleString()和toString()相同,以上几个方法的显示格式也会因浏览器的不同有差异。没有哪一个方法能够用来在用户界面中显示一致的日期信息。
<h3>5.3.3日期/时间组件方法</h3>
介绍了一大堆getFullYear()、getMonth()等方法,有用到自然会去百度,不写。
<h3>5.4RegExp类型</h3>
正则网上有很多现成的正则案例,本人真的看到正则头大,所以这部分是跳过的,有兴趣的可以先看看JavaScript正则表达式视频教程-慕课网学习。