深入理解JS中的變量及作用域、undefined與null
1、Javascript變量作用域
javascript中,變量主要分為局部變量和全局變量兩種,對應(yīng)的作用域也是局部作用域和全局作用域。
1 局部變量和作用域
局部變量一般在函數(shù)體內(nèi)部聲明使用:
function func(){
var i=12;//局部變量
......
}
局部變量的作用域在聲明這個變量的函數(shù)體范圍內(nèi)使用。
局部變量的聲明周期從函數(shù)被調(diào)用執(zhí)行開始初始化,在函數(shù)調(diào)用執(zhí)行完畢之后被銷毀。
2、全局變量和作用域
全局變量一般在函數(shù)體外面聲明:
var i=12;//全局變量
function func(){
......
}
還有一種沒有聲明而直接使用的變量,默認為全局變量:
function func(){
i=12;//沒有被聲明(使用var 關(guān)鍵字聲明),默認為全局變量
}
全局變量在當(dāng)前頁面中所有的腳本和方法中都可以使用,作用域為當(dāng)前頁面腳本中。
全局變量的聲明周期在變量被初始化時被創(chuàng)建,在當(dāng)前頁面關(guān)閉的時候被銷毀。
2、typeof關(guān)鍵字
typeof關(guān)鍵字主要用來檢測變量的數(shù)據(jù)類型,JavaScript中主要的數(shù)據(jù)類型有string、number、Boolean、object等
console.log(typeof 'str');//string
console.log(typeof 23);//number
console.log(typeof false);//boolean
console.log(typeof [1,3,12]);//object
console.log(typeof {name:'jack',age:12});//object
console.log(typeof new Date());//object
注意: js中的數(shù)組、json對象都是object數(shù)據(jù)類型的
3、null和undefined
null和undefined在JavaScript中經(jīng)常出現(xiàn),表示一個變量的值為空或者是一個變量未被定義。在表示值的時候,都可以表示為空值,但是在數(shù)據(jù)類型方面還是不一樣。
console.log(typeof null);//object var persion = null; console.log(persion);//null console.log(typeof undefined);//undefined var persion2; console.log(persion2);//undefined
null的數(shù)據(jù)類型為object,undefined的數(shù)據(jù)類型就是undefined。
變量聲明,值為null,變量值為null;變量只聲明,沒有賦值,值為undefined。
再看一組對比:
console.log(null==undefined);//true 值相等 console.log(null===undefined);//false 類型不相等
這就可以看出來,null和undefined的表示值的時候,都表示空;null的數(shù)據(jù)類型為object,undefined的數(shù)據(jù)類型就是undefined。只聲明而沒有初始化的值都是undefined。
下面是補充
Situation One
<script>
var i; //全局變量
//方法名是camel命名法
//方法里面的變量是局部變量
function sayHello(){
var x=100;
alert(x);
x++;
}
sayHello(); //輸出100
alert(x); //報錯,因為x是局部變量,訪問不到
</script>
Situation Two
<script>
function sayHello(){
var x=100;
if(x==100){
var y=x+1;
alert(y); //輸出101
}
alert(y); //也輸出101,在方法內(nèi)部,不存在塊級作用域,在C#中就不可以了?。?!
for(var i=0;i<2;i++){
alert(i)
} //在for循環(huán)里面定義的變量是塊級作用域
alert(i); //因為i是局部變量,所以輸出2
}
sayHello();
</script>
注:變量使用前可以不用var聲明,這樣的變量會被認為是“全局變量”,但很少這樣用
關(guān)于undefined與null
有以下幾種情況的,變量的值為undefined
1、變量定義,但沒有賦值,則變量的值為undefined
2、調(diào)用的方法沒有返回值,在返回的值為undefined
3、對象的屬性值不存在,則返回值為undefined,如:document.ddd
Example1:
var xx;
var yy=null;
if(xx==yy){
alert('相等');
}
else{
alert('不等');
}
輸出結(jié)果為相等,因為在進行if判斷時,瀏覽器會對xx及yy進行值的判斷,因為兩者都沒有具體的值,認為他們都是false。
如果if判斷中換成===[全等于符號],則輸出不等!因為===表示要求xx及yy的數(shù)據(jù)類型和值都要相同才可以!
Example2:
var xx=10
var yy='10';
if(xx==yy){
alert('相等');
}
else{
alert('不等');
}
輸出相等,如果換成===,則輸出不等
Example3:
var n='10';
switch(n){
case 10:
alert('數(shù)字');
break;
case '10':
alert('字符串');
break;
}
輸出 字符串
switch中的判斷要考慮類型
總結(jié):if中的判斷是判斷數(shù)值,不考慮類型
相關(guān)文章
利用uniapp+vue3+js適配微信隱私協(xié)議開發(fā)指南
這篇文章主要給大家介紹了關(guān)于利用uniapp+vue3+js適配微信隱私協(xié)議開發(fā)指南的相關(guān)資料,適配最新微信小程序隱私協(xié)議開發(fā)指南,兼容uniapp版本,需要的朋友可以參考下2023-12-12
在JS中如何把毫秒轉(zhuǎn)換成規(guī)定的日期時間格式實例
本篇文章主要介紹了在JS中如何把毫秒轉(zhuǎn)換成規(guī)定的日期時間格式實例,非常具有實用價值,需要的朋友可以參考下2017-05-05
axios/fetch實現(xiàn)stream流式請求示例詳解
這篇文章主要為大家介紹了axios/fetch實現(xiàn)stream流式請求示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09
JS時間轉(zhuǎn)換標(biāo)準(zhǔn)格式、時間戳轉(zhuǎn)換標(biāo)準(zhǔn)格式的示例代碼
這篇文章主要介紹了JS時間轉(zhuǎn)換標(biāo)準(zhǔn)格式、時間戳轉(zhuǎn)換標(biāo)準(zhǔn)格式的示例代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05
webpack結(jié)合express實現(xiàn)自動刷新的方法
這篇文章主要給大家介紹了關(guān)于webpack結(jié)合express實現(xiàn)自動刷新的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用webpack具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
微信小程序?qū)崿F(xiàn)語音識別轉(zhuǎn)文字功能及遇到的坑
這篇文章主要介紹了小程序?qū)崿F(xiàn)語音識別轉(zhuǎn)文字功能,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08
手把手教你實現(xiàn)一個JavaScript時間軸組件
本文主要是給大家?guī)硪粋€時間軸的組件開發(fā)教程,其主要功能就是可以拖動時間軸來定位當(dāng)前時間,可以通過鼠標(biāo)滾輪來修改當(dāng)前時間分辨率,需要的可以參考一下2022-10-10

