数据类型(变量类型)
javascript中的数据类型有:字符串(String)、数字(Number)、布尔(Boolean)、数组(Array)、对象(Object)、空(Null)、未定义(undefined)。
var x ; //x是undefined类型
var x=123; //x是数字类型
var x="123"; //x是字符串类型
var x=true/false; //x是布尔类型
var x=[]; //x是数组类型
var x={1,2,3} //x是一个对象类型
但是Null这种数据类型该怎么表示呢?其实Null类型只有一个值:null,但是当我们这样写的时候:var x=null; console.log(typeof(x)); 返回的结果却是object,也就是说x是一个对象类型。(在逻辑上,你可以认为null是一个空的对象指针,所以结果为“object”)。
那么,我们该如何判断一个类型呢,很简单,我们只要把变量的值与null进行比较即可:
<script>
var x=null;
if(x===null){
alert("is null");
}
alert(null==undefined);//结果为true
alert(null===undefined); //结果却为false
</script>
两个等号的时候undefined实际上是从值null派生来的,所以显示true。但是用到严格等于的时候,null和undefined的数据类型是不一样的,所以返回了false。
变量
变量的声明
在js中,变量声明分为两种,显示声明和隐式声明
var x=100;//显示声明
x=100;//隐式声明
全局变量和局部变量
在函数function中使用var声明(即显示声明)的变量是局部变量,而没有var声明(即隐式声明)的变量是全局变量。
当我们使用未经任何声明的变量时js就会报错,但是我使用未经声明的而被赋值的变量时js就不会报错了。相反js会认为我们隐式声明了一个全局变量,所以这一点一定要注意。
变量作用域
任何程序语言中变量的作用域都是一个很关键的细节。JS中变量的作用域相对与JAVA、C这类语言显得更自由,一个很大的特征就是JS变量没有块级作用域,函数中的变量在整个函数都中有效,看看下面的代码:
<script type="text/javascript">
function outPut(s){
document.writeln(s);//定义一个输出函数
}
var i=0;//全局变量
outPut(i);//调用输出函数结果为0
function text(){
var i=1;
outPut(i);
//1,因为text函数里面定义了一个局部变量,所以在text函数调用outPut的时候是输出text函数里面的局部变量i的值,也就是1
}
text();
outPut(i)//仍然是0,因为这时候调用输出函数是在text函数之外调用的,所以里面的局部变量没有起作用;
function aa(){
i=2;//这里使用了前面讲的隐式声明,也就是说这里定义了一个全局变量i,而这个i会把前面定义的 同名的全局变量i给覆盖掉
outPut(i);//2
}
aa();
outPut(i)//2 i=2;
function bb(){
var i;//变量提升
outPut(i);//undefined
i=1;
outPut(i);//1
}// 这个函数中i已经被var声明了,只是前面未被赋值而已,后面的i虽然是隐式声明的模样,但是别忘了它前面已经被var声明了,
bb();
outPut(i);//2 所以bb()中的i并未被覆盖。
</script>
从上面就可以证明JS如果用var在函数体中声明变量,那么此变量在且只在该函数体内有效,函数运行结束时,本地变量即可销毁了。
基本类型和引用类型
JS不同于JAVA、C这些语言,在变量申明时并不需要声明变量的存储空间。变量中所存储的数据可以分为两类:基本类型和引用类型。其中数值、布尔值、null和undefined属于基本类型,对象、数组和函数属于引用类型。
基本类型在内存中具有固定的内存大小。例如:数值型在内存中占有八个字节,布尔值只占有一个字节。对于引用型数据,他们可以具有任意长度,因此他们的内存大小是不定的,因此变量中存储的实际上是对此数据的引用,通常是内存地址或者指针,通过它们我们可以找到这个数据。
引用类型和基本类型在使用行为上也有不同之处:
<script type="text/javascript">
//定义一个输出函数
function outPut(s){
document.writeln(s)
}
var a = 3;
var b = a;
outPut(b);
//3
a = 4;
outPut(a);
//4
outPut(b);
//3
</script>
对基本类型b进行赋值时,实际上是又开辟了一块内存空间,因此改变变量a的值对变量b没有任何影响。
<script type="text/javascript">
//定义一个输出函数
function outPut(s){
document.writeln(s)
}
var a_array = [1,2,3];
var b_array = a_array;
outPut(b_array); //1,2,3
a_array[3] = 4;
outPut(b_array);//1,2,3,4
</script>
上面是对引用类型的变量赋值,实际上他们传递的是对内存地址的引用,因此对a_array和b_array的存取,实际上都是操作的同一块内存区域。如果希望重新分配内存空间存储引用型变量,那么我就需要使用克隆方法或者自定义方法来复制引用变量的数据。
关于变量作用域我知道的就这些了,这之中有什么写的不对或不够的地方,可以指正出来,也可以和我讨论,分享个人的观点,共同进步。
