日期:2014-05-16  浏览次数:20394 次

学习面向对象javascript(五)内置对象

在javascript中,提供了一些内置对象。Object就是其中一个,他是所有javascript对象的父对象。另外还有其他的一些。
基本上,内置对象可以分成三组:

  • 数据包装对象:Object,Array,Function,Boolean,Number,String。
  • 公共对象:Math,Date,RegExp。
  • 错误对象:Error对象

Object

Object是所有javascript对象的父对象。创建一个空对象你可以使用大括号方式或者构造函数方式。下面的两种是等效的:

var o = {};
var o = new Object();
?


一个空对象并不是完全没有用的,他其实已经包含了一些方法和属性,比如:
o.constructor属性返回构造器函数
o.toString()方法返回一个字符串形式的对象的描述,当一个对象被用作string来使用的是,这个方法会被执行,比如alert的时候。
o.valueOf()方法返回一个对象的单值,通常是对象自己,比如:

o.valueOf() === o;  // true

Array

Array()是一个内置函数,我们可以用它来作为创建数组的构造器。下面两种是等效的:

var a = new Array();
var a = [];
?


当使用Array()创建数组时,我们可以传入参数作为数组的元素。

var a = new Array(1,2,3,'four');
a;  // [1, 2, 3, "four"]
?


特殊的是,当我们只传入一个数字的时候。构造器会把这个数字作为数组的长度来创建一个数组。

var a2 = new Array(5);
a2;  // [undefined, undefined, undefined, undefined, undefined]
?


下面我们可以比较一下数组和对象。

var a = [], o = {};
?


在数组中,有一个length属性,而对象没有;

a.length;  // 0
typeof o.length;  // "undefined"
?


我们可以向数组和对象中添加数字或者非数字属性。

a[0] = 1; 
o[0] = 1;
a.prop = 2; 
o.prop = 2;
?


但是数组中的length属性只会计算数字属性的长度。

a.length;  // 1
?


length这个属性我们是可以手动设置的。
如果我们设置一个比当前大的一个数字,那么数组会开辟一些空的元素来填充数组,值为undefined。

a.length = 5;
a;  // [1, undefined, undefined, undefined, undefined]
?


如果把length设为比当前小的数字,数组将会把多余的元素截断。

a.length = 2;
a;  // [1, undefined]

?

Array里面还包含了其他一些有用的方法,比如sort(), join(), slice()。
我们可以试一些方法。

var a = [3, 5, 1, 7, 'test'];
?


push()方法和pop()方法在对栈操作时比较有用。
push方法可以把一个元素加在数组的最后面,pop方法会删除最后一个元素。所以a.push('new')相当于a[a.length]='new',而a.pop()相当于a.length--。
push方法返回加入新元素以后的数组的长度,pop方法返回删除掉的元素。

a.push('new');  // 6
a;  // [3, 5, 1, 7, "test", "new"]
a.pop();  // "new"
a;  // [3, 5, 1, 7, "test"]
?


sort()方法可以对一个数组进行自然排序,并返回排序后的数组。

var b = a.sort();
b;  // [1, 3, 5, 7, "test"]
a;  // [1, 3, 5, 7, "test"]
?


可见,a,b指向了同一个数组。

join()返回一个用给定值把各个数组元素连接起来的字符串。

a.join(' : ');  // "1 : 3 : 5 : 7 : test"
?


slice()方法返回一个数组指定范围的一个拷贝数组,意思就是拷贝出数组的一个范围内元素,而不改变数组本身。

b = a.slice(1, 3);  // [3, 5]
b = a.slice(0, 1);  // [1]
b = a.slice(0, 2);  // [1, 3]
a;  // [1, 3, 5, 7, "test"]
?


splice()方法会修改原数组,它会删掉指定部分的元素,并可以用新的元素来填补这些空缺。前两个参数表示起始位置和终止位置,其他的参数表示用于填补的新元素。

b = a.splice(1, 2, 100, 101, 102);  // [3, 5]
a;  // [1, 100, 101, 102, 7, "test"]
?


也可以不加填补的新元素。

a.splice(1, 3);  // [100, 101, 102]
a;  // [1, 7, "test"]

?Function

另一种创建方法的方式是使用内置对象Function。但是这种方式不建议使用。
以下是几种创建方法的方式:

function sum(a, b) {return a + b;};
sum(1, 2);  // 3
var sum = function(a, b) {return a + b;};
sum(1, 2);  // 3
var sum = new Function('a', 'b', 'return a + b;');
sum(1, 2);  // 3
?


当使用Function()构造一个函数时,首先需要传入函数的参数,然后传入函数体的源代码。Javascript引擎会评估传入的源代码,并生成一个新的方法返回。所以,使用这种方式和使用eval()函数有着同样的缺点。
如何使用Function构造器来构造一个含有很多参数的方法时,可以将参数用逗号隔开,一次性传入。

var first = new Function('a, b, c, d', 'return arguments;');
first(1,2,3,4);  // [1, 2, 3, 4]
var second = new Function('a, b, c', 'd', 'return arguments;');
second(1,2,3,4);  // [1, 2, 3, 4]
var third = new Function('a', 'b', 'c', 'd', 'return arguments;');
third(1,2,3,4);  // [1, 2, 3, 4]
?


像其他对象一样,Function有co