引用类型(一)

来源:互联网 发布:下载cctalk软件 编辑:程序博客网 时间:2024/06/04 18:53

引用类型的值(对象)是引用类型的一个实例。
在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起。
引用类型描述的是一类对象所具有的属性和方法,有时也被称为对象定义。

(一)object类型

是一个基础类型,其他所有类型都从Object继承了基本的行为。

1、创建Object实例的方式

  • 使用new操作符后跟Object构造函数。
  • 使用对象字面量表示法。

2、访问对象属性的方法

  • 点表示法
  • 方括号表示法(优点:可以通过变量来访问属性)
var person = {    name : "John",    age : 20};alert(person.name);  //点表示法alert(person["name"]);  //方括号表示法var propertyName = "name";alert(person[propertyName]);  // 通过变量来访问

(二)Array类型

是一组值得有序列表,同时还提供了操作和转换这些值的功能。

1、创建数组的基本方式

  • 使用Array构造函数,new操作符可以省略。
  • 使用数组字面量表示法
var 数组名 = new Array();  //创建了一个空数组var 数组名 = new Array(n);  //创建了一个指定有n个元素的数组var 数组名 = ["元素1","元素2","元素3"...];  //创建数组时,直接初始化数据var 数组名 = [];  //创建了一个空数组

2、索引和length属性

1)索引表示要访问的值。
如果索引小于数组中的项数,则返回对应项的值。
如果设置某个值得索引超过了数组现有项数,数组会自动增加到该索引值加1的长度。

var colors = ["red", "blue", "green"];alert(colors[0);  //显示第一项colors[2] = "black";  //修改第三项colors[3] = "black";  //新增第四项

2)数组的项数保存在其length属性中,这个属性始终返回0或更大的值。
这个属性不是只读的。通过设置这个属性,可以从数组的末尾移除项或向数组中添加新项。

var colors = ["red", "blue", "green"];  //此字符串长度为3colors.length = 2;  //会移除最后一项alert(colors[2]);  // undefinedcolors.length = 4;  //会新增一项alert(colors[3]);  // undefinedcolors[colors.length] = "brown";  // 在数组末尾添加新项

3、检测数组

1)instanceof操作符

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

特别注意的是,instanceof操作符只能使用在假定一个全局作用域的情况下,否则就无法判断。

2)Array.isArray()方法(ECMAScript5新增)

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

这个方法不受限于一个全局作用域,其目的是最终确定某个值到底是不是数组,而不管它是在哪个全局执行环境中创建的。

4、转换方法

  • toString():返回由数组中每个值的字符串形式拼接而成的一个逗号分隔的字符串。
  • valueOf():返回的是数组。
  • toLocaleString():经常返回与toString()和valueOf()相同的值,也会创建一个数组值的以逗号分隔的字符串。

5、栈方法

栈在栈的顶部插入(推入)和移除(弹出)项。

  • push():接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后的数组长度。
  • pop():从数组末尾移除最后一项,减少数组的length值,然后返回移除的项。
var colors = new Array();var count = colors.push("red", "green");alert(count);  // 2count = colors.push("black");alert(count);  // 3var item = colors.pop();alert(item);  // "black"alert(colors.length);  // 2

6、队列方法

队列在列表的末端添加项,从列表的前端移除项。

  • shift():移除数组中的第一个项并返回该项。
  • unshift():在数组前端添加任意个项并返回新数组的长度。
var colors = ["red", "green"];var item = colors.shift();alert(item);  // "red"var count = color.unshift("black");  //添加在数组的前端

7、重排序方法

1)reverse():反转数组项的顺序。

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

2)sort():按一定的排列数组项。
- 当不带参数调用时,数组元素以字母表顺序排序(有必要时转化为字符串比较).
- 如果想要按照其他方式排序,就必须在方法中传递一个比较函数。

var nums = [0, 1, 5, 10, 15];nums.sort();//不带参数调用alert(nums);  //0,1,10,15,5//通过比较函数实现升序排序function compareUp(num1, num2){    if (num1 < num2){        return -1;    } else if(num1 > num2){        return 1;    } else{        return 0;    }}nums.sort(compareUp);  //传参数alert(nums);  // 0,1,5,10,15//通过比较函数实现降序排序function compareDown(num1, num2){    if (num1 < num2){        return 1;    } else if(num1 > num2){        return -1;    } else{        return 0;    }}nums.sort(compareDown);  //传参数alert(nums);  // 15,10,5,1,0

可以将上面的比较函数进行简化,如下所示。

function compareDown(num1, num2){    return num2 - num1;}function compareUp(num1, num2){    return num1 - num2;}

8、操作方法

1)concat():基于当前数组中的所有项创建一个新数组。具体来说,这个方法会先创建当前数组一个副本,然后将接收到的参数添加到这个副本的末尾,最后返回新构建的数组。不会改变原来的数组。即用于连接两个或多个数组。

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

2)slice():基于当前数组中的一或多个项创建一个新数组。即返回指定数组的一个片段或子数组。

var nums = [1,2,3,4,5];var num1 = nums.slice(1);  //2,3,4,5var num2 = nums.slice(1,4);  //2,3,4

3)splice():主要用途是向数组的中部插入项。

使用这种方法的方式有3种:删除、插入和替换。

  • 删除:传入2个参数,即要删除的第一项的位置和要删除的项数。
  • 插入:传入3个参数,即起始位置、0和要插入的项。
  • 替换:传入3个参数,即起始位置、要删除的项数和要插入的任意数量的项。
var num = [1,2,3];var removed = num.splice(0,1);  // 删除第一项alert(num);  // 2,3alert(removed);  // 1removed = num.splice(1,0,4,5);  //从位置1开始插入两项alert(num);  // 2,4,5,3alert(removed);  // 返回一个空数组removed = num.splice(1,1,6,7);  //插入两项,删除一项alert(num);  // 2,6,7,5,3alert(removed);  // 4,返回是删除的一项

4)join():用于把数组中的所有元素放入一个字符串。可以传入一个参数,将元素通过指定的分隔符进行分隔。

var num = [1,2,3,4,5];alert(num);             //1,2,3,4,5alert(num.join());      //1,2,3,4,5alert(num.join("-"));   // 1-2-3-4-5

9、位置方法

  • indexOf():从数组的开头(位置0)开始向后查找。
  • lastIndexOf():从数组的末尾开始向前查找。

这两个方法都接收两个参数:要查找的项和(可选的)表示查找起点位置的索引。

var num = [1,2,3,4,5,4,3,2,1];alert(num.indexOf(4));  // 3alert(num.lastIndexOf(4));  // 5alert(num.indexOf(4,4));  // 5alert(num.lastIndexOf(4,4));  // 3

10、迭代方法

每个方法接收两个参数:要在每一项上运行的函数和(可选的)运行该函数的作用域对象——影响this的值。
传入这些方法中的函数会接收三个参数:数组项的值、该项在数组中的位置和数组对象本身。

  • every():对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true。
  • filter():对数组中的每一项运行给定函数,返回该函数会返回true的项组成的数组。
  • forEach():对数组中的每一项运行给定函数。这个方法没有返回值。本质上与使用for循环迭代数组一样。
  • map():对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。
  • some()::对数组中的每一项运行给定函数,如果该函数对任一项返回true,则返回true。
var num = [1,2,3,4,5,4,3,2,1];var everyResult = num.every(function(item,index,array){    return (item > 2);});alert(everyResult);  // falsevar someResult = num.some(function(item,index,array){    return (item > 2);});alert(someResult);  // truevar filterResult = num.filter(function(item,index,array){    return (item > 2);});alert(filterResult);  // [3,4,5,4,3]var mapResult = num.map(function(item,index,array){    return (item * 2);});alert(mapResult);  // [2,4,6,8,10,8,6,4,2]var forEachResult = num.forEach(function(item,index,array){    //执行某些操作});

11、缩小方法

  • reduce():从数组的第一项开始,逐个遍历到最后。
  • reduceRight():从数组的最后一项开始,向前遍历到第一项。

这两个方法都会迭代数组的所有项,然后构建一个最终返回的值。
都接收两个参数:一个在每一项上调用的函数和(可选的)作为缩小基础的初始值。
传入的函数接收4个参数:前一个值、当前值、项的索引和数组对象。这个函数返回的任何值都会作为第一个参数自动传给下一项。

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

上面两个方法都可以执行求数组中所有值得之和操作。对于reduce()方法,第一次执行回调函数,prev是1,cur是2。而reduceRight()相反,第一次执行回调函数,prev是5,cur是4。

原创粉丝点击