引用类型

一.Object类型

我们看到的大多数类型是object类型,虽然Object实例并不具备很多功能,但对于在应用程序中存储和传输数据来说,是非常理想的选择。
创建Object实例有两种方法:
第一种是使用new操作符后跟Object构造函数:

var person=new Object();
person.name="Nicholas";
person.age=29;

另一种方式是使用对象字面量表示法:

var person={
    name:"Nicholas",
    age:29
};

属性名也可以使用字符串来表示。
在定义对象时,对象字面量语法也是向函数传递大量参数的首选方法。

一般来说,访问对象属性使用的都是点表示法,不过在JavaScript中也可以使用方括号表示法来访问对象的属性。

alert(person["name"]);
alert(person.name);

这两种方法都可以来访问对象的属性,从功能上看,没有什么区别,但方括号语法的主要优点是可以通过变量来访问属性。

var propertyName="name";
alert(person[propertyName]);

如果属性名包含导致语法错误的字符,或者包含非字母非数字,或者属性名使用的是关键字和保留字,也可以使用方括号表示法。
通常,除非使用变量来访问属性,否则我们建议使用点表示法。

二.Array类型

1.javascript数组中每一项都可以保存任何类型的数据,数组的大小是可以动态调整的。创建数组的方法有两种:
第一种是使用Array构造函数,

var colors=new Array();
var colors=new Array(3);  //创建一个包含3项的数组
var colors=Array();        //省略了new
var colors=new Array("red","blue");  //创建了一个两项的数组

第二种方式是使用数组字面量表示法:

var colors=["red","blue","green"];//创建一个包含三个字符串的数组
var names=[];          //创建一个空数组
var values=[1,2,];     //创建2或3项的数组
var options=[,,,,,];   //创建5或6项的数组

数组字面量由一对包含数组项的方括号表示,多个数组项之间以逗号隔开。
2.读取和设置数组
首先看一个例子:

var colors=["red","blue","orange"];
alert(colors[0]);         //"red"
colors[2]="black";        //修改第三项
colors[3]="yellow";       //新增第四项
alert(colors.length);     //4

对于已经存在的项,会修改所在项,对于未存在的项,会新创建一个项。
数组的项数保存在length属性中。
3.检测数组
为了检测某个对象是不是数组的问题,可以使用instanceof操作符。

if(value instanceof Array)
{
    ''''''''
}

但这个操作符假定只有一个全局执行环境,如果网页中包含多个框架,那实际上就存在两个以上的执行环境,从而存在两个以上的不同版本的Array构造函数。
ECMAScript新增了Array.isArray()方法,这个方法的目的是确定某个值到底是不是数组,而不管他是在哪个执行环境中创建的。

if(Array.isArray(value))
{
    '''''
}

4.转换方法
所有对象都具有toLacalestring(),tostring(),valueof()方法,其中,调用valueof()返回还是数组本身,调用数组的toString()会返回由数组中每个值的字符串表示,拼接而成的一个以逗号分隔的字符串。当调用数组的tolocaleString()方法时,它也会创建一个数组值的以逗号分隔的字符串。如果使用join(),则可以使用不同分隔符来构建这个字符串,join()方法只接收一个参数,即用作分隔符的字符串,然后返回包含所有数组项的字符串。

var person1={
    tolocaleString:function(){
        return "locale1";
        },
    toString:function(){
        return "str1";
        }
};
var person2={
    tolocaleString:function(){
        return "locale2";
        },
    toString:function(){
        return "str2";
        }
};
var person=[person1,person2];
alert(people);                //str1,str2
alert(people.toString());     //str1,str2
alert(people.tolocaleString); //locale1,locale2
var colors=["red","blue","yellow"];
alert(colors.join("||"));     //red||blue||yellow

alert()函数,要接收字符串参数,所以它会在后台调用tostring()方法,由此会得到与直接调用tostring()方法相同的结果。
5.栈方法
ECMAScript数组也提供了一种让数组的行为类似于其他数据结构方法。栈是一种后进后出的数据结构,ECMAScript为数组专门提供了push()和pop()方法。pop()方法则从数组末尾移除最后一项,减少数组的length值,然后返回移除的项;push()方法可以接收任意数量的参数,把他们逐个添加到数组末尾,并返回修改后数组的长度。

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

另外,我们可以将栈方法与数组方法连用。
6.队列方法
队列数据结构的访问规则是先进先出,push()是向数组末端添加项的方法,shift()能够移除数组中的第一个项并返回该项,同时将数组长度减一。

var colors=new Array();         //创建一个数组
var count=colors.push("red","green"); //推入两项
alert(count);
count=colors.push("black");    //推入另一项
alert(count); 
var item=colors.shift();      //取得第一项
alert(item);                  //"red"
alert(colors.length);         //2

ECMAScript还为数组提供了一个unshift()方法,它能在数组前端任意个项并返回新数组的长度,

var colors=new Array();                 //创建一个数组
var count=colors.unshift("red","blue"); //推入两项
alert(count);        //2

7.重排序方法
ECMAScript数组存在两个可以用来重排序的方法:reverse()和sort()。reverse()方法会反转数组项的顺序,由大到小输出,这种方法不够灵活,因此有了sort()方法。
在默认情况下,sort()方法按升序排列数组项。为实现排序,sort()方法会调用数组项的toString()方法,然后比较得到的字符串,即使数组中的每一项都是数组,sort()方法比较的也是字符串。

var values=[0,1,5,10,15];
values.sort();
alert(values);      //0,1,5,10,15,5

在这个例子中,进行字符串比较时,“10”则位于“5”的前面,于是数组的顺序就被修改了,这种方法在很多情况下都不是最佳方案。
因此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];
values.sort(compare);
alert(values);       //0,1,5,10,15

将比较函数传递到sort()方法之后,数值仍然保持了正确的升序,也可以通过比较函数产生降序排列的结果,只要交换比较函数返回的值即可。

function compare(value1,value2){
    if(value1<value2){
    return 1;
    }else if(value1>value2){
    return -1;
    }else{
    return 0;
    }   
}

对于数值类型或者其valueof()方法会返回数值类型的对象类型,可以使用更简单的比较函数。这个函数只要用第二个值减去第一个值即可。

function compare(value1,value2)
{
    return value2-value1;
}

8.操作方法
ECMAScript为操作已经包含在数组中的项提供了很多方法,
(1)concat()
这个方法可以基于当前数组中的所有项创建一个新数组,具体说,这个方法会先创建当前数组的一个副本,然后将接收到参数添加到副本的末尾,最后返回新构建的数组。如果传递concat()方法是一个或多个方法,则该方法会将数组每一项添加到结果数组中,如果传递的值不是数组,这些值会被简单的添加到末尾中,

var colors=["red","yellow","blue"];
var colors2=colors.concat("green",["black","brown"]);
alert(colors);          //red,yellow,blue
alert(colors2);         //red,yellow,blue,black,brown

(2)slice()
slice()方法,能够基于当前数组中一个或多个项创建一个新数组。slice()方法接收一或两个参数,既要返回项的起始和结束位置,但不包括结束位置的值

var colors=["red","green","blue","yellow","purple"];
var colors2=colors.slice(1);
var colors3=colors.slice(1,4);
var colors4=colors.slice(-3,-1);
alert(colors2);         //green,blue,yellow,purple
alert(colors3);         //green,blue,yellow
alert(colors4);         //blue,yellow

如果结束位置小于起始位置,则返回空数组。
(3)splice()
splice()方法主要用途是向数组的中部插入项,使用这种方法的方式则有如下三种方式:
删除:指定的参数,要删除的第一个项的位置,要删除的项,
插入:可以向指定位置插入任意数量的项,只需提供3个参数:起始位置,0,要插入的项,
替换:可以向指定位置插入任意数量的项,且同时删除任意数量的项,需要指定三个参数:起始位置,要删除的项,要插入的任意数量的项。

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,返回的数组只包含一项

9.位置方法
ECMAScript为数组实例添加了两个位置方法,indexOf()和lastIndexOf(),这两个方法都接收两个参数:要查找的项和表示查找起点位置的索引。indexOf()方法从数组的开头(位置0)开始向后查找,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
var person={name:"Nicholas"};
var people=[{name:"Nicholas"}];
var morePeople=[person];
alert(people.indexOf(person));       //-1
alert(morePeople.indexOf(person));   //0

10.迭代方法
ECMAScript为数组定义了五个迭代方法,每个方法都接收两个参数,要在每一项上运行的函数,运行该函数的作用域对象-影响this的值,传入这些方法的函数会接收三个参数:数组项的值,该项在数组中的位置,和数组对象本身。
(1)every():对数组中的每一项给定函数,如果该函数每一项都返回true,则返回true.
(2)some():对数组中的每一项运行给定函数,如果该函数对任一项都返回true,则返回true.

var numbers=[1,2,3,4,5,4,3,2,1];
var everyResult=number.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

对于every(),他返回的是false,因为只有部分数组项符合条件,对于some(),结果是true,因为至少有一项是大于2的。
(3)filter():对数组中的每一项运行给定函数,返回该函数会返回true的项的组成的数组

var numbers=[1,2,3,4,5,4,3,2,1];
var filterResult=number.filter(function(item,index,array){
    return (item>2);
    });
alert(filterResult);           //[3,4,5,4,3]

(4)forEach():对数组中的每一项运行给定函数,这个方法没有返回值。

var numbers=[1,2,3,4,5,4,3,2,1];
numbers.forEach(function(item,index,array){
    //执行某些操作
    });

这个方法没有返回值,本质上与使用for循环迭代数组一样。

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

这个方法适合创建包含的项与与另一个数组一一对应的项。
11.归并方法
ECMAScript还新增了两个数组的方法,reduce()和reduceRight()方法。这两个都会迭代数组的项,然后构建一个最终返回的值,其中,reduce()方法从数组的第一项开始,逐个遍历到最后,而reduceRight()方法从数组的最后一项开始,向前遍历到第一项。
这两个方法都接收两个参数,一个是在每一项上调用的函数,另一个是作为可并基础的初始值。
传给这两个方法的函数接收4个参数:前一个值,当前值,项的索引和数组对象。这个函数返回的任何值都会作为第一个参数自动传递给下一项。
使用reduce()方法可以执行求数组中所有值之和的操作。


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
reduceRight()方法作用类似,只不过方向相反而已。

var values=[1,2,3,4,5];
var sum=values.reduceRight(function(prev,cur,index,array){
    return prev+cur;
});
alert(sum);        //15

第一次执行时,prev是5,cur是4。

猜你喜欢

转载自blog.csdn.net/pjcd10/article/details/78634534