JavaScript3.1

第 5 章“引用类型”
5.1 Object 类型
创建Object 实例的方式有两种。
第一种是使用new 操作符后跟Object 构造函数,如下所示:

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

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

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

访问对象属性时使用的都是点表示法,这也是很多面向对象语言中通用的语法。不过,在JavaScript 也可以使用方括号表示法来访问对象的属性。在使用方括号语法时,应该将要访问的属性以字符串的形式放在方括号中,如下面的例子所示。

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

5.2 Array 类型
除Object 之外,Array 类型是ECMAScript 中最常用的类型。
ECMAScript 数组的每一项可以保存任何类型的数据。也就是说,可以用数组的第一个位置来保存字符串,用第二位置来保存数值,用第三个位置来保存对象,以此类推。而且,ECMAScript 数组的大小是可以动态调整的,即可以随着数据的添加自动增长以容纳新增数据。

创建数组的基本方式有两种。第一种是使用Array 构造函数。

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

创建数组的第二种基本方式是使用数组字面量表示法。

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

数组的length 属性很有特点——它不是只读的。因此,通过设置这个属性,可以从数组的末尾移
除项或向数组中添加新项。请看下面的例子:

var colors = ["red", "blue", "green"]; // 创建一个包含3 个字符串的数组
colors[99] = "black"; // (在位置99)添加一种颜色
alert(colors.length); // 100

在这个例子中,我们向colors 数组的位置99 插入了一个值,结果数组新长度(length)就是100
(99+1)。而位置3 到位置98 实际上都是不存在的,所以访问它们都将返回undefined。

1.检测数组:确定某个对象是不是数组。Array.isArray(obj);
2.数组的转换方法:
所有对象都具有toLocaleString()、toString()和valueOf()方法。
如果数组中的某一项的值是null 或者undefined,那么该值在join()、toLocaleString()、toString()和valueOf()方法返回的结果中以空字符串表示。
3.数组的栈方法:
ECMAScript 为数组专门提供了push()和pop()方法,以便实现类似栈的行为(后进先出)。
4.数组的队列方法:
ECMAScript 为数组专门提供了shift()和push()方法,可以像使用队列(先进先出)一样使用数组。
同时使用unshift()和pop()方法,可以从相反的方向来模拟队列,即在数组的前端添加项,从数组末端移除项

var colors = {};
var count = color.unshift("red, green");
alert(count); //2
count = color.unshift("black");
alert(count);//3
var item = colors.pop();
alert(item);//"green"

alert(color.length);//2

5.数组的重新排序方法:reverse()反向排序和sort()

sort()方法会调用每个数组项的toString()转型方法,然后比较得到的字符串,以确定如何排序。即使数组中的每一项都是数值,sort()方法比较的也是字符串。

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

数值5 虽然小于10,但在进行字符串比较时,"10"则位于"5"的前面,于是数组的顺序就被修改了。
因此sort()方法可以接收一个比较函数作为参数,以便我们指定哪个值位于哪个值的前面。

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

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

6.数组的操作方法:
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()方法

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()方法

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

两个位置方法: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

var person = { name: "Nicholas" };
var people = [{ name: "Nicholas" }];
var morePeople = [person];
alert(people.indexOf(person)); //-1
alert(morePeople.indexOf(person)); //0

7.五个迭代方法:
每个方法都接收两个参数:
一、要在对数组中的每一项上运行的函数
二、和(可选的)运行该函数的作用域对象——影响this 的值。
注意:
传入这些方法中的函数会接收三个参数:数组项的值、该项在数组中的位置和数组对象本身。根据使用的方法不同,这个函数执行后的返回值可能会也可能不会影响方法的返回值。
 every():对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true。
 some():对数组中的每一项运行给定函数,如果该函数对任一项返回true,则返回true。

var numbers = [1,2,3,4,5,4,3,2,1];
//every()来说,传入的函数必须对每一项都返回true,这个方法才返回true;否则,返回false。
var everyResult = numbers.every(function(item, index, array){
	return (item > 2);
});
alert(everyResult); //false
//some()方法则是只要传入的函数对数组中的某一项返回true,就会返回true。
var someResult = numbers.some(function(item, index, array){
	return (item > 2);
});
alert(someResult); //true

 filter():对数组中的每一项运行给定函数,返回该函数会返回true 的项组成的数组。

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];
numbers.forEach(function(item, index, array){
//执行某些操作
});

8.归并数组的方法
reduce()和reduceRight()
这两个方法都接收两个参数:一个在每一项上调用的函数和(可选的)作为归并基础的初始值。

使用reduce()方法可以执行求数组中所有值之和的操作,比如:
var values = [1,2,3,4,5];
var sum = values.reduce(function(prev, cur, index, array){
return prev + cur;
});
alert(sum); //15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值