对象(引用类型的值)是引用类型的一个实例,新对象是使用new操作符后跟一个构造函数来创建的。构造函数本身就是一个函数,该函数用于创建新对象。ECMAScript提供了很多原生引用类型(Object,Array,Date,RegExp,Funcion…)。
一、Object类型
1、 创建方式
① 、使用new操作符后跟Object构造函数
Var person=new Object();
Person.name=’xxxx’;
Person.age=10;
② 对象字面量标识法
Var person={
Name:’xxxx’,
Age:10
}
属性默认都是字符串,打不打引号都可以。
2、 使用方式(访问对象的属性)
① 、点表示法
Person.name;person.age;
② 、中括号表示法
Person[‘name’];person[‘age’]
方括号中的字符串可以通过变量传入
二、Array类型
ECMAScript中的数组相对于其他语言来讲比较特殊,是个功能比较多的数据类型。主要区别在于:每一项都可以保存任何类型的数据,数组的大小是可以动态调整的。
1、 创建方式
① 、使用Array的构造函数
Var colors = new Array();
Var colors = new Array(“aa”,”bb”,”cc”);
② 、使用数组字面量表示法
Var colors = [“aa”,”bb”,”cc”];
2、 Array用作栈(FILO)
Array类型自带了两个方法push(),pop(),如果要实现一个栈的数据结构可以直接用Array类型定义。
3、 Array用作队列(FIFO)
Array类型的shift()方法可以取得数组中第一个元素并移除该元素,结合push()方法,就可以将一个数组当做队列来使用
4、 一些常用方法(混个眼熟,用到时再去查)
① 、重排序:Reverse()、sort()
② 、连接Concat();
③ 创建新数组slice();
④ 插入删除替换splice();
⑤ 查找索引indexOf()、lastIndexOf();
⑥ 迭代方法:every()、filter()、forEach()、map()、some();
⑦ 缩小方法:reduce()、reduceRight()
三、Date类型
四、RegExp类型
以上两种类型,低端应用中比较少见,尤其是正则表达式,博大精深不是一句两句能明白的,用到再查API吧。
五、Function类型
什么,函数竟然是一种数据类型,没错,ECMAScript中函数实际上是对象,函数与其他引用类型一样可以具有属性和方法。每个函数都是Function类型的实例,函数名实际上是一个指向函数对象的指针。这意味着js中定义函数时的函数名单从定义函数的角度讲意义不大,因为函数执行的逻辑跟函数名完全没关系。函数名既然是一个变量那么也就意味着它可以作为参数传递给另外的函数,也可以作为函数的返回值返回。
ECMAScript中函数没有定义返回值类型,因为返回值可以是任何类型,这是跟变量的定义相符合的,因为一个变量可以表示任何类型的数据。
Ex1:
Function aa(){};
Var bb=function(){};//与上面效果完全相同。
Ex2:
function aa () {
alert('aa');
};
var aa = function() {
alert('bb');
}
调用aa()时将会输出bb
Ex3:
以下两个button单击后都输出了2,童鞋们,亮瞎眼了吗?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script type="text/javascript">
var golbalaaa= 1;
function test() {
var age=1;
alert(age);
}
function test1() {
var age1=2;
alert(age1);
};
test=test1;
</script>
</head>
<body>
<form>
<input type="button" onclick="test()" />
<input type="button" onclick="test1()" />
</form>
</body>
</html>
1、 函数声明与函数表达式的区别
这里定义函数声明就是带函数名的函数的定义,函数表达式就是不带函数名的函数定义。
解析器在向执行环境中加载数据时,对函数声明和函数表达式并非一视同仁,解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问),这也就意味着通过函数声明方式定义的函数可以先使用后定义;对于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行,这也就是说如果通过这种方式定义的函数必须先定义然后才能使用,否则肯定会报错(unexpected identifier)。
2、 函数的内部属性
① arguments:数组对象,包含着传入函数中的所有参数
a) 这个对象有一个比较特殊的属性:callee,是一个指针,指向拥有这个arguments对象的函数。
② This:this引用的是函数的执行环境对象(与这个函数处于同一级别的环境,也就是这个函数的调用者的作用域)
③ Caller:调用当前函数的函数的引用,如果是在全局作用域中调用当前函数,它的值为null
④ Length:函数的参数的个数
⑤ Prototype:神奇的原型(先混个眼熟吧,这个东西是跟继承相关)
3、 函数的内部方法
以下两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。
① apply():接受两个参数,一个是在其中运行函数的作用域,另一个是参数数组(可以是Array实例,也可以使arguments对象)
② call():与apply()的区别在于接受参数的方式不同,第一个this没有变化,变化的是其余参数都直接(逐个列出来)传递给函数
以上方法真正强大的地方是能够扩充函数赖以运行的作用域,这样一来对象就可以不和方法有任何耦合关系,对象需要什么方法可以通过这种方式调用。
③ bind()。这个方法会创建一个函数的实例,其this值会被绑定到传给bind()函数的参数(一般是一个对象)的作用域上。是不是有种依赖注入的味道?
六、基本包装类型
常见的OO编程语言都有基本类型的包装类型,目的是为了更方便处理基本类型数据,因为包装了之后就可以增加更多额外的功能。ECMAScript中提供了3个特殊的引用类型:Boolean、Number、String。
Ex1:
Var s1 = ‘xxxxxxxxxxxxxx’;
Var s2 = v1.substring(2);
解释器其实做了这么几个操作:创建一个String类型的实例,在这个String类型的实例上调用substring()方法,销毁这个实例。
使用new创建的引用类型的对象,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的引用类型的对象,则只存在于一行代码的执行瞬间,然后立即被销毁,这意味着我们不能再运行时为基本类型值添加属性和方法。
Boolean类型没什么好说的,主要过一下Number类型与String类型的一些常见方法。
1、 Number类型
① toFixed():按照指定的小数位返回数值的字符串表示
② toExponential():返回数值的指数形式表示的字符串
③ toPrecision():
2、 String类型
① 、length属性,表示包含多少个字符
② 、charAt()、charCodeAt():访问字符串中特定位置的字符
③ 、concat():字符串拼接
④ 、slice()、substr()、substring()
⑤ 、indexOf、lastIndexOf()
⑥ 、trim()
⑦ 、toLowerCase()、toLocalLowerCase()、toUpperCase()、toLocalUpperCase()
⑧ 、replace()
⑨ 、split()
七、单体内置对象
所谓打你内置对象:有ECMAScript提供的,不依赖与宿主环境的对象。Object,Array,String等都是内置对象,这里再补充两个Global、Math。
在大多数的ECMAScript实现中都不能直接访问Global对象,不过WEB浏览器实现了承担该角色的windows对象。全局变量和函数都是Global对象的属性。Math对象提供了很多属性和方法,用于辅助完成负载的数学计算。
本文系个人读书总结,转载请注意出处