标签:
1.js是untyped的语言,或者说弱类型的,不想c#,java这些强类型语言,定义变量必须明确变量类型为string ,int ,bool(当然c#支持var,但编译器已经处理变量为对应的类型了,与js不一样),js定义所有变量都是用var,而后可以随意修改变量值,如下代码:
1 var i = 23;//number 2 i = "hello";//string 3 i = true;//boolean 4 alert(i);//true
2.变量的种类:全局变量 局部变量
如果变量定义不用var声明,则该变量为全局变量,但这可能会与预期不一致,一个好的习惯就是,定义所有变量都用var;
如果局部变量与全局变量名称一致,则在局部变量的作用范围内局部变量会覆盖全局变量的值:
1 var v = "global"; 2 function test1() { 3 var v = "local"; 4 alert(v); 5 } 6 7 test1();//local
3.作用范围
global变量作用范围为整个js文件,而local变量范围为定义其变量所在的代码块(如:function,loop,function中的params),有种情况特别注意:局部变量的生效范围是贯穿其作用域始终的,而不是自其定义出开始生效,如下代码:
1 var v2 = "global"; 2 function test2() { 3 alert(v2);//undefined 4 var v2 = "local"; 5 alert(v2);//local 6 } 7 test2();
尽管v2变量在function外部已经定义,但由于test2()内部有定义v2,所以在test2()的v2是与外部无关的,只是第一次alert时,其变量尚未初始化,为undefined,之后赋值变为local,因此另一个建议:function中的变量定义最好都放在function最开始处。再如下例,局部变量的作用范围是不限代码块的(for循环、if语句):
1 function test3(x) { 2 if (typeof x == "object") { 3 var t = 1; 4 function subTest3() { 5 for (var i = 0; i < 10; i++) { 6 //do nothing 7 } 8 alert(i);//9 i is defined everywhere,not only loop. 9 } 10 subTest3(); 11 } 12 alert(t);//1 t is defined everywhere,not only block. 13 } 14 15 test3({ name: "wang" });//test the function test3() with an object param.
4.变量类型的相互转化
之前有提到过,js中类型的转换是根据需要默认转的,如:var s="hello"; s=s+22; 自动将22转换成string类型,拼接成hello22,不多说
5.值类型与引用类型
js中的类型分两类:primitive类型--int,boolean,null,undefined,值在内存中所占大小固定不变,为值类型
function,arrary,function,在内存中大小不固定,为引用类型
至于string,算是特殊类型吧,尽管在内存中大小不定(string长度不定),但string是固定不变的,讨论其是值类型还是引用类型是无意义的(moot),就当是个独特的存在吧
1 var a = 11; 2 var b = a; 3 a = "hello"; 4 alert(b);//11 b没有变,因为b,a是两个独立值 5 6 var a = new Array(1, 2, 3, 4); 7 var b = a; 8 b[0] = "yes"; 9 alert(a);//yes,2,3,4 array是引用类型,a,b指向同一array
标签:
原文地址:http://www.cnblogs.com/baweier2013/p/5103928.html