Fork me on GitHub

Js中数据类型以及变量作用域

数据类型(变量类型)

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的存取,实际上都是操作的同一块内存区域。如果希望重新分配内存空间存储引用型变量,那么我就需要使用克隆方法或者自定义方法来复制引用变量的数据。

关于变量作用域我知道的就这些了,这之中有什么写的不对或不够的地方,可以指正出来,也可以和我讨论,分享个人的观点,共同进步。

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!