javascript变量可以用来保存两种类型的值:基本类型和引用类型。基本类型包括以下5种:undefined、Null、string、Boolean、Number等, 引用类型是object;基本类型和引用类型都具有几下特点:
1、基本类型值在内存中占据固定大小的空间,因此基本类型的值被保存在栈内存中;
2、从一个变量向另一个变量复制基本类型的值,会创建这个值的副本。
3、引用类型的值是对象,保存在堆中;
4、包含引用类型值的变量实际并不是包含对象本身,而是一个指向该对象的指针;
5、从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量始终指的同一个对象;
6、确定一个值是哪种基本类型可以用typeof操作符,而确定一个值是哪种引用类型可以用instanceof操作符‘;
var num1=5; var num2=num1; num2=6; num2;//6 num1;// 5 var obj1=new Object(); var obj2=obj1; obj1.name="dd"; alert(obj2.name);//"dd" 指向的是同一个对象;地址相同n var obj1=new Object(); var obj2=new Object();//两个对象,地址也不一样
var s="ddd"; var b=ture; var c=22; var u; var n=null; var 0=new function(); alert(typeof s);//string; alert(typeof b);//boolean; alert(typeof u);//undefined; alert(typeof n);//object; alert(typeof 0);//object;
确定是哪种引用类型时,用instanceof
alert(persons instanceif object);//变量person是object吗? alert(colorss instanceif array);//变量colors是array吗? alert(pattern instanceif RegExp);//变量pattern是RegExp吗?
函数的预处理(提升)
alert(a); var a=123;//执行的结果是undefined; 程序相当于是: var a; alert(a); a=123;
函数的执行第一步要进行预处理,然后再一步步执行代码,看实例
<script type="text/javascript"> alert(a); var a = 1; alert(a); function a(){alert(123);} alert(a); a(); </script> 第一步预编译 var a; function a() {alert(123);} 第二步一步步执行代码: alert(a);//function a() {alert(123);} a=1; alert(a);//1 alert(a)://1 a();//报错,相当于1();
js没有按引用传参的功能,切忌,不能把传递引用参数当做按引用传参
function setName(obj){ obj.name="dddd"; } var person=new object(); setName(person); alert(person,name);//ddd这里是按质传参的
同级函数的作用域不是嵌套的,不能访问
function f1(){ var b=2; alert(b); f2(); } function f2() { var d=3; alert(d); alert(b);//不出现b }
但是如果是这样的嵌套函数f2()嵌套在f1()作用域中,f1()作用域嵌套在全局作用域中,形成了作用域链;
function f1(){ var b=2; alert(b); function f2() { var d=3; alert(d); alert(b);//2 } }
for语句和if语句没有封闭作用域的功能,都是全局的
所有变量都存在于一个执行环境(也称作用域)当中,这个环境决定了变量的生命周期,以及哪部分代码可以访问其中的代码,以下是总结:
1、执行环境有全局执行环境和函数执行环境之分;
2、每一次进入一个新的执行环境,都会创建一个用于搜索变量和函数的作用域链;
3、函数的局部环境不仅有访问函数作用域中的变量,而且有权访问其包含(父类)环境、乃至全局环境;
4、全局环境智能访问在全局环境中定义的变量和函数,而不能直接访问局部环境中的任何数据;
5、变量的执行环境有助于确定如何释放内存;
javascript语言是一门具有自动垃圾收集机制的编程语言,开发人员不必关心内存分配和回收问题:可以对javascript的垃圾收例程作如下总结;
1、 离开作用域的值将自动标记为可以回收,因此将在垃圾收集期间被删除;
2、“标记清除”是目前流行的垃圾收集算法,这种算法的思想是给当前不使用的值加上标记,然后再将其回收
3、解除变量的引用不仅有助于消除循环引用对象,而且对垃圾收集也有好处,为了确保有效地回收内存,应该及时解除不再使用的全局对象,全局对象属性以及循环引用变量的引用;
function createPerson(name){ var localPerson=new Object(); localPerson.name=name; return localPerson; } var dd=createPerson("dddd"); dd=null;//手工解除dd的引用