Object类型
创建Object实例的方式有两种:
var person=new Object();
person.name="JJ";
person.age=29;
- 对象字面量表示法;
var person={
name:"JJ";
age:29;
}
使用对象字面量法时,属性名也可以使用字符串;
也可以这样:
var person={};//与new Object()相同
person.name="JJ";
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:"JJ";
age:"29"
});
displayInfo({
name:"YY";
});
这种传递参数的模式最适合需要向函数传入大量可选参数的情况;
访问对象属性的方法:
alert(person["name"]); //"JJ" 要以字符串的形式
alert(person.name); //"JJ"
功能上看,这两种方法没有任何区别;
但方括号语法的优点:
- 可以通过变量来访问属性
var propertyName="name";
alert(person[propertyName]); //"JJ"
- 如果属性名中包含会导致语法错误的字符,或属性名使用的是关键字或保留字,也可以使用方括号表示法;
person["first name"]="JJ";
由于"first name"包含空格,不能使用点表示法来访问它;
一般除非必须使用变量来访问属性,否则建议使用点表示法;
Array类型
- 与其他语言不同,ECMAScript数组每一项可以保存任何类型的数据;
- ECMAScript数组的大小是可以动态调整的;
创建数组的基本方式:
var colors=new Array();
var colors=new Array(20);//创建length值为20的数组
var colors=new Array("red","green");
new操作符也可以省略;
- 数组字面量表示法
var colors=["red","green"];
var names=[];
数组的length属性不止是读的,可以通过设置这个属性从数组末尾移除项或向数组中添加新项;
var colors=["red","blue"];
colors.length=1;
alert(colors[1]);//undefined
var colors=["red","blue"];
colors.length=3;
alert(colors[2]);//undefined
利用length也可以方便在数组末尾添加新项;
var colors=["red","blue"];
colors[colors.length]="black";//在位置2添加颜色
colors[colors.length]="brown";//在位置3添加颜色
5.2.1检测数组
5.2.2转换方法
- 数组继承的toLocaleString(), toString()和valueOf()方法,在默认情况下都会以逗号分隔符的字符串形式返回数组项;
- 使用join()方法,则可以使用不同的分隔符来构建这个字符串。join()方法只接受一个参数,即用作分隔符的字符串;
var colors=["red","green","blue"];
alert(colors.join(",")); //red,green,blue 重现了toString()方法的输出;
alert(colors.join("|}")); //red||green||blue
5.2.3栈方法(后进先出)
- push()方法:可以接受任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度;
- pop()方法:从数组末尾移除最后一项,减少数组的length值,然后返回移除的项;
var colors=new Array();
var count=colors.push("red","green");
alert(count); //2
count=colors.push("black");
alert(count);//3
var item=colors.pop();
alert(item); //"black"
alert(colors.length); //2
5.2.4队列方法(先进先出)
- shift()方法:移除数组中的第一个项并返回该项;
- unshift()方法:能在数组前端添加任意个项并返回新数组的长度;
5.2.5重排序方法
- reverse()方法:反转数组项的顺序;
var values=[0,1,5,10,15];
values.reverse();
alert(values);//15,10,5,1,0
-
sort()方法:
sort()函数的排序条件是:参数大于0,arr的相邻两个元素交换位置;
参数小于0,arr的相邻两个元素不交换位置;
参数等于0,arr的相邻两个元素大小相等;所以compare自定义函数必须返回一个数值。
默认情况下,sort()方法按升序排列数组项,但是这个方法会调用toString()转型方法,然后比较得到的字符串,即使数组的每一项都是数值,如:
var values=[0,1,5,10,15];
values.sort();
alert(values);//0,1,10,15,5
这种排序方式不是最佳,因此sort()方法可以接收一个比较函数作为参数。
这个比较函数可以适用大多数数据类型;
升序:
function compare(value1,value2){
if(value1value2){
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){
if(value1value2){
return -1;
}
else{
return 0;
}
}
var values=[0,1,5,10,15];
values.sort(compare);
alert(values);//15,10,5,1,0
对于数值类型或者其valueOf()会返回数值类型的对象类型,可以使用一个更简单的比较函数。
function compare(value1,value2){
return value2-value1;
}
5.2.6操作方法
- concat(): 如果传递给concat()方法的是一或多个数组,则该方法会将这些数组中的每一项都添加到结果数据中。如果传递的不是数组这些值会被简单地添加到结果数组的末尾。如果没有给它传递参数,它只是复制当前数组并返回副本;
var colors=["red","green"];
var colors2=colors.concat("yellow",["black","brown"]);
alert(colors); //red,green
alert(colors2); //red,green,yellow,black,brown
- slice():它能够基于当前数组中的一或多个项创建一个新数组。 slice(a, b) 参数表示返回项的起始和结束位置,如果只有一个参数,则返回指定位置开始到当前数组末尾的所有项。
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方法的参数中有一个负数,则用数组长度加上该数来确定相应位置;
- splice(a, b, c) 始终返回一个数组,该数组中包含从原始数组中删除的项,如果没有删除,则返回空数组;
- 当有两个参数时:要删除第一项的位置,或删除的项数;
- 当有三个参数时:插入。三或以上参数:替换,插入的项不必与删除的项数相等;
var colors=["red","green","blue"];
var removed=colors.splice(0,1);//删除第一项
alert(colors);//green,blue
alert(removed);//red
removed=colors.splice(1,0,"yellow","orange");//从位置1开始插入两项
alert(colors);//green,yellow,orange,blue
alert(removed);//返回的是空数组
removed=colors.splice(1,1,"red","purple"); //插入两项,删除一项
alert(colors);//green,red,purple,orange,blue
alert(removed); //yellow
splice() 方法与 slice() 方法的作用是不同的,splice() 方法会直接对数组进行修改。
slice可用于字符串,splice则不可用于字符串
5.2.7位置方法
- indexOf()从数组开头
- lastindexOf()从数组末尾
都有两个参数,第一个要查找的项,第二个表示要查找的起点位置(可选);
这两个方法都返回要查找的项在数组中的位置,如果没有找到则返回-1;
var numbers=[1,2,3,4,5,4,3,2,1];
alert(numbers.indexOf(4)); //3
alert(numbers.lastIndexOf(4)); //5
alert(numbers.indexOf(4,4)); //5
alert(numbers.lastIndexOf(4,4)); //3
5.2.8迭代方法
ECMAScript5为数组定义了5个迭代方法。每个方法都接收两个参数:要在每一项上运行的函数和(可选)运行该函数的作用域对象--影响this的值;
传入这些方法中的函数会接收三个参数:数组项的值,该项在数组中的位置1和数组对象本身;
- every(),传入函数必须对每一项都返回true,这个方法才返回true;
- some(),只要传入的函数对数组中某一项返回true,就会返回true;
var numbers=[1,2,3,4,5,4,3,2,1];
var everyResult=numbers.every(function(item,index,array){
return(item>2);
});
alert(everyResult); //false
var someResult=numbers.some(function(item,index,array){
return(item>2);
});
alert(someResult); //true
- filter(),它利用指定函数确定是否在返回的数组中包含某一项。
var numbers=[1,2,3,4,5,4,3,2,1];
var filterResult=numbers.filter(function(item,index,array){
return(item>2);
});
alert(filterResult); //[3,4,5,4,3]
这个方法对查询符合某些条件的所有数组项非常有用;
- map(),也返回一个数组,这个数组每一项都是在原始数组中对应项上运行传入函数的结果;
var numbers=[1,2,3,4,5,4,3,2,1];
var mapResult=numbers.map(function(item,index,array){
return item*2;
});
alert(mapResult);//[2,4,,6,8,10,8,6,4,2]
- forEach(),没有返回值,本质上和使用for循环迭代数组一样;
var numbers=[1,2,3,4,5,4,3,2,1];
number.forEach(function(item,index,array){
//执行某些操作
};
5.2.9归并方法
- reduce(),从数组第一项开始
- reduceRight(),从数组的最后一项开始
这两个方法都会迭代1数组所有项,然后构建一个最终返回的值;
它们的函数接收四个值:前一个值,当前值,项的索引和数组对象;
这个函数返回的任何值都会作为第一个参数自动传给下一个项;
var values=[1,2,3,4,5];
var sum=values.reduce(function(pre,cur,index,array){
return pre+cur;
});
alert(sum); //15
Date类型
year:四位年份,如果写成两位数,则加上1900
month:表示月份,0表示一月,11表示12月
date:表示日期,1到31
hour:表示小时,0到23
minute:表示分钟,0到59
second:表示秒钟,0到59
ms:表示毫秒,0到999
日期的运算
类型转换时,Date对象的实例如果转为数值,则等于对应的毫秒数;如果转为字符串,则等于对应的日期字符串。所以,两个日期对象进行减法运算,返回的就是它们间隔的毫秒数;进行加法运算,返回的就是连接后的两个字符串。
var d1 = new Date(2000, 2, 1);
var d2 = new Date(2000, 3, 1);
d2 - d1
// 2678400000
d2 + d1
// "Sat Apr 01 2000 00:00:00 GMT+0800 (CST)Wed Mar 01 2000 00:00:00 GMT+0800 (CST)"
Date.now()
返回表示调用这个方法时的日期和时间的毫秒数;
//取得开始时间
var start=Date.now();
doSomething();
//取得停止时间
var stop=Date.now();
result=stop-start;