JavaScript引用类型(Array 类型)

一、Array 类型:
虽然ECMAScript数组与其他语言中数组都是数据的有序列表,但与其他语言不同的是,ECMAScript数组的每一项可以保存任何类型的数据,也就是说数组的第一个位置来保存字符串,第二个位置保存数值,第三个位置保存对象,以此类推,而且EMCAScript数组的大小是可以动态调整的,既可以随着数据的添加自动增长以容纳新增数据。

创建数组的基本方式有两种:

① 使用 Array 构造函数:

var colors = new Array();
var colors = new Array(20);  //length值为20的的数组
var colors = new Array("red","blue","green");  //包含3个字符串值的数组

另外,在使用 Array 构造函数时也可以省略 new 操作符。:

var colors = Array(3); //创建一个包含3项的数组
var colors = Array("Greg") //创建一个包含一项,即字符串"Greg"的数组

② 使用数组字面量表示法。数组字面量由一对包含数组项的方括号表示,多个数组项之间以逗号隔开,如下:

var colors = ["red","blue","green"]; //创建一个包含3个字符串的数组
var colord = []; //创建一个空数组

二、检测数组:
确定某个对象是不是数组,对于一个网页或者一个全局作用域而言,使用 instanceof 操作符 就可以,如下:

if (value instanceof Array) {
    //对数组执行某些操作
}

instanceof 操作符的问题在于,它假定只有一个全局执行环境。如果网页中包含多个框架,那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的 Array 构造函数。如果从一个框架向另一个框架传入一个数组,那么传入的数组与第二个框架中原生创建的数组分别具有各自不同的构造函数。
EMCASript 5 新增了 Array.isArray() 方法。这个方法最终目的是确定这个值到底是不是数组,而不管它是哪个全局执行环境中创建的,如下:

if(Array.isArray(value)) {
    //对数组执行某些操作
}

三、转换方法:
每个对象都具有 toLocaleString()、toString() 和 valueOf() 方法。
toString() 方法会返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串
value() 方法返回的还是数组。

var colors = ["red","blue"]
alert(colors.toString()); //red,blue
alert(colors.valueOf());  //red,blue
alert(colors);           //red,blue

最后一行代码枝江将数组传递给了alert() ,由于alert() 要接收字符串参数,所以它在后台会调用 toString() 方法。

四、栈方法:
ECMAScript 为数字专门提供了 push() 和 pop() 方法,以便实现类似栈的行为(可以限制插入和删除项的数据结构)。栈是一种LIFO的数据结构,也就是最新添加的项最早被移除,而栈中的插入(推入)和移除(弹出)只发生在一个位置——栈的顶部。

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(item.length);   // 2

可以将栈方法与其他数组方法连用。如下:

var colors = ["red","blue"];  // 创建一个数组
colors.push("brown");  // 添加一项
colors[3] = "black";   // 给位置3 添加另一项
alert(colors.length)  // 4

var item = colors.pop();  // 取得最后一项,并从数组中移除
alert(item);  //"black"
alert(item.length); // 3

五、队列方法:
栈数据结构的访问规则是LIFO(先进后出),队列数据结构的访问规则是FIFO(先进先出)。队列在列表的末端添加项,从列表的前端移除项。push() 是向数组末端添加项,shift() 移除数组中第一项,并返回该项,同时将数组长度减一。

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

count = colors.push("black");  //再推入一项
alert(count);   //3

var item = colors.shift();   //取得第一项,并从数组中移除
alert(item);   //"red"
alert(colors.length);  //2

数组还有一个unshift()方法,与 shift() 方法想反,它能在数组前端添加任意个项,并返回新数组的长度。

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

count = colors.unshift("black"); //再继续推入一项
alert(count);  //3

var item = colors.pop();  //取得数组中最后一项,并移除
alert(item);  //"black"
alert(colors.length);  //2

六、重排序方法:
reverse() 方法:反转数组项的顺序

var values = [1, 2, 3, 4, 5];
values.reverse();
alert(values);        //5,4,3,2,1

sort() 方法:按照升序排列数组(最小的在前边,最大的在后边),sort() 方法会调用每一个数组项的 string() 方法,然后比较得到的字符串。即使数组中每一项都是数值,sort() 也比较的是字符串。

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

因为 sort() 方法是根据字符串的结果改变原来的顺序,字符串比较时”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);

如果要通过比较函数产生降序的排序结果,只需交换比较函数的返回值即可。

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

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

因为比较函数通过返回一个小于零、等于零或大于零来影响排序结果,因此减法操作可以适当处理这些所有的情况。

七、操作方法:
concat() 方法:会先创建当前数组的一个副本,然后将其接收到的参数添加到这个副本的末尾,最后返回新构建的数组。

var colos1 = ["red", "blue"];
var colors2 = colors1.concat("yellow", ["black", "brown"]);

alert(colors1);  //red, blue
alert(colrs2);   //red,blue,yellow,black,brown

slice() 方法:基于当前数组中的一个或多个项创建一个新数组,接收两个参数,要返回项的起始位置和结束位置,只有一个参数的情况下,返回从该参数指定位置到数组末尾的所有项。如果有两个参数,该方法会返回起始和结束位置之间的项,但不包括结束位置的项。slice() 方法不会影响原数组。

var colors = ["red", "blue", "green", "brown"]
var colors1 = colors.slice(1);
var colors2 = colors.slice(1,3);

alert(colors1);  //blue
alert(colors2)   //blue,green

splice() 方法:
删除:可以删除任意数量的项,只需指定两个参数:要删除的第一项位置和要删除的项数。例如:splice(0, 2)会删除数组中的前两项。
插入:可以指定位置插入任意数量的项,需要三个参数:起始位置、0(要删除的项数)和要插入的项。例如:splice(2, 0, “red”)会从当前数组位置2开始插入字符串”red”。
替换:可以指定位置插入任意数量的项,同时删除任意数量的项,需要三个参数:起始位置、要删除的项数和要插入的任意数量的项。例如:solice(2, 1, “blue”,”red”)会删除当前数组位置2的项,然后再从位置2开始插入字符串”blue和”red”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值