JavaScript和Java、C这样的语言之间存在一个重要的差别,那就是JavaScript是非类型的,这就意味着JavaScript的变量可以存放任何类型的值。有一个特性是与JavaScript缺少类型规则相关,即在必要时JavaScript可以快速、自动地将一种类型的值转换成另外一种类型。
在JavaScript程序中,使用一个变量之前,必须先声明它。变量是使用关键字var声明的。如果没有用var语句给一个变量指定初始值,那么虽然这个变量被声明了,但是在给它存入一个值之前,它的初始值就是undefined。var语句还可以作为for循环和for/in循环的一部分,这样就使循环变量的声明成为了循环语法自身的一部分,很是简洁。
for(var i=0;i<10;i++) document.write(i,"<br>");
for(var i in o) document.write(i,"<br>");
由var声明的变量是永久性的,也就是说,用delete运算符来删除这些变量将会引发错误。
如果尝试读一个未声明的变量的值,JavaScript会生成一个错误。如果尝试给一个未用var声明的变量赋值,JavaScript会隐式声明该变量。注意隐式声明的变量总是被创建为全局变量,即使该变量只在一个函数体内使用。局部变量只在一个函数中使用,要防止在创建局部变量时创建全局变量,就必须在函数体内部使用var语句。无论是全局变量还是局部变量,最好都使用var语句创建,这是一个好的编程习惯。
变量的作用域:
在函数体内部,局部变量的优先级比同名的全局变量高。如果给一个局部变量或函数的参数声明的名字与某个全局变量的名字相同,那么就有效地隐藏了这个全局变量。在声明局部变量时,一定要使用var语句。
没有块级作用域:
和C、C++以及Java不同,JavaScript没有块级作用域。函数中声明的所有变量,无论是在哪里声明的,在整个函数中它们都是有定义的。看下面的代码:
var scope="global";
function f(){
alert(scope);//undefined
var scope="local";
alert(scope);//local
}
f();
局部变量在整个函数体内都是有定义的,这就意味着在整个函数体中都隐藏了同名的全局变量。虽然局部变量在整个函数体中都是有定义的,但是在执行var语句之前,它是不会被初始化的。
基本类型和引用类型:
变量保存了基本类型的实际值,但是对引用类型的值却只保存对它的引用。
垃圾收集:
JavaScript不要求手动地释放内存,它使用一种称为垃圾收集的方法。JavaScript的解释器可以检测到何时程序不再使用一个对象了。当它确定了一个对象是无用的时候(例如程序中使用的变量再也无法引用这个对象了),它就知道不再需要这个对象,可以把它所占用的内存释放掉了。
var s="hello";
var u=s.toUpperCase();
s=u;
运行了这些代码之后,就不能再获得原始的字符串"hello",因为程序中没有变量再引用它了。系统检测到这一事实后,就会释放该字符串的存储空间以便这些空间可以被再利用。垃圾收集是自动进行的,对程序员透明。