JavaScript高级 引用类型(二)《JavaScript高级程序设计(第三版)》
五、Function类型
是JS中最重要的一种引用类型
构造方式:(三种)
函数声明:
函数表达式定义:
函数构造器:
没有重载:
如果有两个相同函数名的函数,执行时,执行最近被定义的一次。
函数声明和函数表达式:
函数声明和函数表达式两种常用创建函数的方式虽然作用一致,但是解析器在向执行环境中加载数据时是不一样的。
alter( sum( 10 , 20 ) );
var sum = function( a , b ){
return a+b;
}
以上代码是错误的,在以上代码的初始化环境中,sum变量仅仅被定义为undefined。
如果是用函数声明方式,那么在初始化环境中,就会执行载入函数,则不会执行错误。(如下:)
alter( sum( 10 , 20 ) );
function sum ( a , b ){
return a+b;
}
作为值的函数:
因为在上面的创建函数的过程中,函数名就是变量,那么函数可以作为值来使用。所以就可以把函数像值一样作数参数使用,也可以在函数中像值一样被返回。
函数内部对象:
arguments:类数组对象,包含所以传入的参数,此对象有个属性叫做callee(指针),指向拥有该对象的函数。
function sum(){} --> sum.arguments --> arguments.callee = sum
实现递归解耦:
this:它引用的是函数据以执行的环境对象。
函数的名字仅仅是一个包含指针的变量
函数属性和方法:
caller:它保存了调用当前函数的函数的引用。
length : 函数接收参数的个数
prototype : 它保存了引用类型的所有实例方法,toString() / valueOf();
apply(this,[parm1,parm2]) : 在特定的作用域调用函数。第一个参数this指当前环境对象(作用域对象),第二个参数可以是参数数组或者arguments对象。
call(this,parm1,parm2) :同上 ,区别在于接受参数方式不同。第一个参数this意涵相同,后面的参数需要逐一单独列举出来。
ps:他们的最重要的作用是扩充函数的运行作用域。可以让函数在指定作用域下执行。极大的好处就是对象和方法不要任何耦合关系。
bind() : 会创建一个函数的实例,该函数this的值会被绑定到给定的参数对象。
这样的好处是 即使在全局作用域下,objectSayColor()的作用域仍然是a。
继承的方法:(toLocalString() 、 toString()、valueOf() )
每个函数的这两个方法都会返回函数的代码,但是具体的格式因浏览器而异。
六、基本包装类型
这一点和java类似,JS也给几个基本类型提供了包装类型 以便于操作基本类型。(Boolean , Number , String)
他们具有其他引用类型的共同特征,但是同时也具有他们各自基本类型的特殊行为。
这就是一个自动包装的过程。
他们和普通引用类型的最主要区别在于:生命周期。
用new操作符创建实例的生命周期在执行流离开当前作用域之前一直存在。而自动创建的基本包装类对象,在执行流离开的一瞬间就销毁了。
转型函数和new的包装类型是不一样的:
Boolean类型:
var a = new Boolean(false);
alert( a && true ); //true
这个实例中,一般会认为弹出false。实则不然,因为引用类型在布尔表达式中都会转化为true。
其次:
Number类型
String类型
String类型的实例化都有length属性
也提供了一些方法:
基本操作
截取
位置
大小写
字符串模式匹配
search():如果没找到 返回-1且每次必须从头找
替换
分割
fromCharCode()
接收一个或多个字符编码,把他们转换成字符串
七、单体内置对象
一它是一种不依赖宿主环境的对象,这些对象在JS程序执行之前就已经存在了,简而言之,开发人员不需要实例化这些内置对象,直接可以使用。
Global对象
它在JS中实质上是一个“终极兜底对象”。它不属于任何对象的属性和方法,但是 所有的其他的对象都是他的属性和方法(事实上,并没有全局变量,其实所有的全局作用域下定义的属性和函数都是Global对象的属性)。
URL编码/方法
主要对地址字符串中一些浏览器无法接受的字符串进行编码。(一般情况下使用encodeURL()多一些,只对后面的参数编码)
eval()方法
这是JS中最强大的一个方法。它就像一个JS的解析器,执行要执行的JS字符串。在eval()方法执行时。它的参数(JS代码)也同样拥有eval()的执行环境对象,作用域链也一致。
在使用时要注意其他用户代码注入攻击。
Global对象的属性
包括特殊值undefined、NaN、Infinity都是对象的属性,同时所有的原生引用类型的构造函数(Object、Function)也都是Global的属性。
window对象
在JS中没有明确指出如何访问Global,但是,在Web浏览器中,都是讲Global对象作为window对象的一部分加以实现的。所以可以把Global看作window。
Math对象
这是JS对数学公式和信息提供的一个公共位置--Math对象。
Math对象的属性
min()、max()
四舍五入
random()方法
selectFrom()方法 --- 通过调用selectFrom(2,10)可以得到一个介于2和10(包括2,10)的数值。
其他方法
八、小结
对象在JS中被称为引用类型的值,而且有一些内置的引用类型用来创建一些特定的对象。
- 引用类型与传统面向对象编程的类相似,但是实现不同;
- Object是一个基础类型,其他所有的类型都是从Object继承而来;
- Array是一组值得有序列表、同时提供了操作这些值得功能;
- Date类型提供了有关日期、时间的信息,以及相关操作功能;
- RegExp类型是JS支持正则表达式的一个接口;
- Function类型是所有函数的类(所有函数是Function类型的实例),所以函数也是对象,所以函数自身也拥有方法;
- 基本包装类型Boolean、Number、String:每个包装类型都映射到同名的基本类型;在读取模式下访问基本类型时,会自动创建对应的基本包装类型以方便操作;一经操作完包装类型后,会立即销毁所创建的包装对象;
- 在所有代码执行以前就存在两个对象Global和Math。特别在Web浏览器中,Global作为window对象的一部分。