一、基本类型和引用类型的值
1.变量的数据类型的值:
(1)基本类型值:Undefined、Null、Boolean、Number、String;
不可添加属性
(2)引用类型值:可以添加属性和方法
如:
var person = new Object();
//添加一个名为name的属性
person.name = "linlin";
alert(person.name); //linlin
引用类型值的副本是一个指针,如果用一个引用类型的值初始化另一个变量,这两个变量指向同一个对象。
var person1 = new Object();
var person2=person1;
person1.name = "linlin";
alert(person2.name);
2.传递参数
ECMAScript的所有参数都是按值传递的。
基本类型值的传递和基本类型变量的复制一样。
引用类型值的传递和引用类型变量的复制一样。
如:
//基本类型值的传递
function addTen(num){
num+=10;
return num;
}
var count = 20;
var result=addTen(count);
alert(count); //20,count不会发生改变
alert(result); //30
//引用类型值的传递
function setName(num){
num.name="xiaowang";
num.age = 18;
//虽然函数内部修改了参数的值,但原来的引用不会改变
重写的num引用的是一个局部变量,而这个局部变量会在
函数执行完毕后立即被销毁。
num = new Object();
num.age = 24;
}
var person = new Object();
person.name="lili";
setName(person);
alert(person.name); //xiaowang
alert(person.age); //18
//虽然只是函数中的name属性改变了,但是函数外的person
也发生了改变,说明这两个变量指向了同一个对象
3.检测类型
(1)typeof:可以检测 String、Number、Boolean、Undefined、null和object都返回object
格式:alert( typeof 变量名 );
(2)instanceof:可以检测出是什么类型的对象
格式:alert( 变量名 instanceof 引用类型 );
(其中引用类型有:Object、Array、Date、RegExp、Function、基本包装类型:Boolean、Number、String,单体内置对象:Global对象、Math对象)
二、执行环境及作用域
1.执行环境:定义了变量或函数有权访问的其他数据,决定了它们的各自行为。每个执行环境都有与之相关的变量对象(环境中定义的变量或函数都保存在这个变量对象中)。
2.作用域链:保证对执行环境有权访问的所有变量和函数的有序访问。
- 内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数。
3.延长作用域链:
(1)with语句:将指定的对象添加到作用域链中。
(2)try-catch语句和catch块
4.没有块级作用域:
由于没有块级作用域,所以在if、for等语句中定义的变量在这些语句执行完毕后不会进行销毁,但在c、c++、java中执行完语句就会立刻销毁。
js中的作用域:
(1)全局作用域:函数之外声明的变量,会成为全局变量。
(2)局部作用域:
在 JavaScript 函数中声明的变量,会成为函数的局部变量。只能在函数内部访问它们。
三、垃圾收集
1.js有自动收集垃圾机制。垃圾收集器是周期性运行的。
2.垃圾收集的方法:
(1)标记清除:离开作用域的值会被标记为可以回收,从而在垃圾收集期间被删除。
(2)引用计数:垃圾收集器在第二次运行时,会释放第一次引用中引用次数为0的值所占用的内存。
3.管理内存:当不再使用某些数据时,可采用(变量名=null ;)的方式解除引用。