引用类型是一种数据结构,用于将数据和功能组织在一起。
Object类型
创建Object实例的方式有两种,一种是使用new操作符后跟Object构造函数。
var person = new Object();
person.name = "Nicholas";
person.age = 27;
另一种方式是使用对象字面量表示法。
var person = {
name:Nicholas;
age:27;
5:true;//数值属性名会自动转换为字符串
};
一般来说,访问对象属性时使用的都是点表示法,在JavaScript也可以使用方括号表示法来访问对象的属性。
alert(person.name);
alert(person["name"]);
alert(person["name"+i]);
function类型
函数的定义:
funcation sum(num1,num2){
return num1+num2;
}//方法1
var sum = function(num1,num2){
return num1+ numm2;
};//方法2
函数是对象,函数名是指针
function sum(num1,num2){
return num1+ numm2;
}
alert(sum(10,10));
var anothersum = sum;
alert(anothersum(10,10));//20
sum = null;
alert(anothersum(10,10));//20
使用不带圆括号的函数名是访问函数指针,而非调用函数。此时,anothersum和sum同时指向同一个函数,因此anothersum可以被调用并返回结果。即使将sum设置为null,让他与函数断绝关系,仍可以正常调用anothersum。
1、没有重载
function addSomeNum(num){
return num + 10;}
function addSomeNum(num){
return num + 20;}//此函数被重写,先前函数体被覆盖
var result = addSomeNum(10);//30
2、函数声明与函数表达式
解析器会率先读取函数声明,并使其在执行任何代码之前可用,至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被执行。
alert(sum(10,10));
function sum(num1,num2){
return num1+num2;}
代码开始执行前已经读取并将函数声明添加到执行环境中,所以,即使声明函数的代码在调用它的代码之后,也可以正常运行。如果把上述的函数声明改为函数表达式,就会在执行期间发生错误。
3、函数内部属性
在函数内部,有两个特殊的对象:arguements和this。
arguements的主要用途是保存函数参数,这个对象有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguements对象的函数。
var trueFactorial = factorial;
factorial = function(){
return 0;
};
alert(trueFactorial(5)); //120 递归运算
alert(factorial(5)); //0
另一个特殊对象是this。指向该function的拥有者,如果是全局函数this则指向window对象
window.color = "red";
var o = { color: "blue" };
function sayColor(){
alert(this.color);
}
sayColor(); //red
o.sayColor = sayColor;
o.sayColor(); //blue
ECMAScript也规范化了另一个函数对象的属性:caller。这个属性中保存着调用当前函数的函数的引用,如果是在全局作用于中调用当前函数,它的值为空。
function outer(){
inner();
}
function inner(){
alert(arguments.callee.caller);//调用了outer.toString()
}
outer();//弹出outer的定义的源代码
4、函数属性和方法
外部属性:
1、length:表示函数希望接受的参数的个数
2、prototype:保存着函数的例如valueOf()等函数,只是访问方式是function.valueOf()而已,并且这个属性里的信息是不可以被枚举的
apply()方法
接受两个参数:一个是其中运行的作用于,里一个数参数数组或者arguements对象。
function sum(num1, num2){
return num1 + num2;
}
function callSum1(num1, num2){
return sum.apply(this, arguments);//传入arguments对象
}
function callSum2(num1, num2){
return sum.apply(this, [num1, num2]);//传入数组
}
alert(callSum1(10,10)); //20
alert(callSum2(10,10)); //20
call()方法
call方法与apply方法作用相同,区别仅在于接受参数的方式不同,第一个参数是this没有变,变化的是其余的参数都直接传递给函数。
function sum(num1, num2){
return num1 + num2;
}
function callSum(num1, num2){
return sum.call(this, num1, num2);
}
alert(callSum(10,10)); //20
apply和call方法的强大之处在于能够扩充函数赖以运行的作用域。
window.color = "red";
var o = { color: "blue" };
function sayColor(){
alert(this.color);
}
sayColor(); //red
//调用apply方法一样
sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(o); //blue
bind()方法
这个方法会创建一个函数的实例,其this值会被绑定到传给bind函数的值。
window.color = "red";
var o = { color: "blue" };
function sayColor(){
alert(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor(); //blue