1)对象的引用
对象的引用方法有两种 点语法 【】方法
var obj{
a:1,
b:2,
c:3
};
console.log(obj.a);//1
console。log(obj["a"]);//1
question:对象是什么?储存在哪里?
栈 堆
栈的数据读取写入速度快 储存量小
堆的数据读取写入速度慢 储存量大
string number bool undefined 储存在栈中
对象储存在堆中
栈中的变量一旦不再使用就会清理掉
堆中的对象的地址就是本身的引用地址 即使不再使用对象的地址也不会被清理 ——》 内存泄漏问题
obj=null 清理不再使用对象的引用地址 解决 内存泄漏问题
var obj1={
a:1,
b:2
};
var obj2={
c:3,
d:4
};
obj2=obj1;//把obj1的引用地址复制给obj2
console。log(obj1==obj2);//true
obj2.a=5;//两个对象的引用地址一样所以obj2可以调用到obj1下的a赋值5 a:5
obj1.b=6;//调用自身下的值点语法即可 b:6
obj1.c=7;//由于引用地址一样obj1也可以找到obj2的值 c:7
obj2.d=8;//调用自身 d:8
console.log(obj1.a,obj1.b,obj2.c,obj2.d);//5 6 7 8
tips:obj1地址复制给obj2时,由于obj2的地址丢失,obj2的值没有重新定义将会为undefined.
2)函数
函数也是对象
function 函数名(参数1,参数2){
代码块
};
函数名(参数1,参数2);//调用函数方法
函数方法的应用:
function calculate(v1,v2,type){
switch(type){
case"+":
console.log(v1+v2);
break;
case"-":
console.log(v1-v2);
break;
case"*":
console.log(v1*v2);
break;
case"/":
console.log(v1/v2);
break;
}
}
calculate(8,9,"*");//72
函数方法调用严格按照顺序来
3)函数的定义
匿名函数
fn();
匿名函数没有名字
可以设置给一个对象,或者一个变量
命名函数
函数名();
命名函数可以在函数定义之前和之后执行,但是匿名函数只能在函数定义后执行
自执行匿名函数
(function(){
代码块
})();
自身会执行无法调用执行
构造函数创建
var 变量名=new Function("参数1","参数2","代码块");
变量名(参数1,参数2);//调用函数方法
构造函数中,前面的内容就是这个创建函数的所有参数,最后一个内容就是这个函数执行代码块
要求所有内容都必须是字符串
缺点,构造函数创建函数缺点是运行速度慢,效率低,因为需要将所有的字符串转换为代码
对象方法定义函数方法
var obj={
fn:function(){
代码块 };
};
4)函数的参数
形参 实参
function testType(n,m){//该行的n,m为行参
console.log(n+m);//该行的n,m为实参
};
testType(8,8);//16
testType();//不填入参数也可以执行,相当于给形参定义undefined
testType(8);//只定义一个参数,第二个参数还是定义了undefined
testType(1,2,3);//多余的参数不会被传入接收到函数
//形参有几个实参就要有几个顺序不能改变
//不想给那个形参传入参数可以定义为undefined
var obj={a:1};
function fn2(o){
o.a++;
}
fn2(obj);
console.log(obj);
// 传参传入的是对象,变量是对象,变量的值就是这个对象的引用地址
// 当传参时将引用地址赋值给o,因此,o和obj的引用地址相同,是同一个对象,
// 所以修改了o.a值,obj.a也被修改了