基本类型值:表示简单的数据段,undefined null string number boolean 为基本类型,可以操作保存在变量中的实际的值。
引用类型:表示多个值构成的对象。保存在内存中。因为js不能直接访问内存,所以只能方位内存的引用。
var person=new object()
person.name="john"
alert(person.name);//输出john
var person="john"
person.name="Bill"
alert(person.name)//输出错误
只能给引用类型添加属性
复制变量值(与C语言类似)
int num1=5;
int num2=num1;
那么num1,2的值都是5.
当变量为引用类型的时候,复制一个变量到另一个变量中,那么复制过去的只是一个引用,然而两个变量指向同一个引用,指向内存中同一个地址。一个改变另一个也将改变。
var person1=new object();
person1.name="wang";
var person2=person1;
person2.name="zhang";
alert(person1,name);//输出zhang
参数的传递是按照值类型传递的。基本类型的参数传递就和基本类型值的变量赋值一样,同理引用类型也是一样。
例子:
function addten(num)
{
num=num+10;
return num;
}
var a=30;
var result=addten(a);
alert(a)//30
alert(result)//40
在调用addten函数的时候a的值直接付给num,等函数执行完之后返回给result。然而a的值并没有任何改变。
function change(obj)
{
obj.name="wang";
obj=new object();
obj.name="zhang";
}
var person=new object();
change(person);
alert(person.name);//wang
原理:在执行change函数的时候,person吧引用付给了obj,而obj吧引用指向的内存地址的name属性改变为wang,接着obj被实例化new object(),相当于吧obj指向了内存中的其他地址,接着为这个新的地址name属性赋值,其实对原来的obj地址已经没有任何关系了,等到函数执行完,obj开始的地址的属性发生了变化,新付给的地址呗销毁,实际上也就是person的属性发生了变化。
所以参数传递的时候只不过基本类型赋值的是变量的值,引用类型赋值的是变量指向的地址。
执行环境:定义了变量和函数有权访问的其他数据,每个执行环境都有一个与之对应的变量对象,环境中定义的所有的变量和函数都保存在这个对象当中,但是程序员无法访问它。
全局执行环境是最外围的执行环境,一般是window。
每个函数都有自己的执行环境,当执行这个函数的时候函数的环境会被推入到一个环境栈中,执行完成后吧环境返回给原来的执行环境中,
延长作用域链:一般执行环境分为全局和局部(函数)。可以再作用域的前段临时增加一个变量对象,该变量对象会在代码执行完被移除,具体的来说当代码执行到try catch语句以及with语句的时候作用域链会加长。
没有块级的作用域。
例如:
if(true)
{
var chars="wang"
}
alert(chars);//wang
for(int i=0;i<10;i++)
{
dosomething(i);
}
alert(i)//i=10
在这种情况下,快中声明的变量都是当前的变量对象中。
声明变量:
var声明的变量会自动的添加到最近的环境中,如果声明变量的时候没用使用var,那么变量会自动的添加到全局的环境中。
例如:
function add(num1,num2)
{
var sum=num1+num2;
return sum;
}
var result=add(10,20)//result=30
alert(sum)//error
如果吧sum定义为
sum=num1+num2
不适用var声明的话 sum为全局变量,那么alert(sum)返回30
在这个函数执行完之后sum依然可以使用。
Js的垃圾回收机制:
在c 和c++中开发人员需要跟踪内存使用情况,然后手动的释放内存。但是js可以自动的释放。其操作就是找出不用的内存然后释放。js的垃圾回收器会在一个时间间隔内自行该操作。
主要的方法分为标记清除,引用计数。