- 數(shù)據(jù)類型包括基本數(shù)據(jù)類型與復(fù)雜的數(shù)據(jù)類型object類型,而object類型在這里也說了,可以被稱為引用類型。
在js內(nèi),我們是通過關(guān)鍵字var
來聲明變量的。任何類型的變量均用var來聲明。 - 針對(duì)不同的數(shù)據(jù)類型,變量值的類型也會(huì)不同,同樣也可以分為基本類型值與引用類型值兩種。
- 變量被聲明為基本類型,則其值也是基本類型值,基本類型值是實(shí)際值,js允許直接操作保存在變量中的值。
- 變量被聲明為引用類型,則其值也是引用類型值,引用類型值是保存內(nèi)存中的對(duì)象,js不允許直接操作他,則當(dāng)操作該變量時(shí),是在操作該對(duì)象的引用。(這個(gè)機(jī)理需要明白,才能理解其復(fù)制的機(jī)制)
- 關(guān)于聲明變量時(shí),內(nèi)存的分配
- 基本類型值:按值訪問,操作的是他們實(shí)際保存在棧中的值;
引用類型值:按引用訪問,當(dāng)查詢時(shí),我們需要先從棧中讀取內(nèi)存地址,然后再順藤摸瓜地找到保存在堆內(nèi)存中的值; - 變量的初始化
-
基本類型值
var num1=5;
棧內(nèi)存 -
引用類型值
var obj1=new object();
對(duì)象內(nèi)存圖
-
-
檢測(cè)類型
- typeof
var s="dudu";
alert(typeof s);// string
typeof操作符是確定變量為基本類型的。但是對(duì)于變量的值為對(duì)象或null時(shí),那么typeof會(huì)返回“object”。 - instanceof
alert(person instanceof Array);//變量person是Array類型么?
因?yàn)樗幸妙愋投际荗bject的實(shí)例,所以
alert(person instanceof Object);//返回true
- typeof
-
執(zhí)行環(huán)境及作用域
- 執(zhí)行環(huán)境定義了變量或函數(shù)有權(quán)訪問的其他數(shù)據(jù),每個(gè)執(zhí)行環(huán)境都有一個(gè)與之關(guān)聯(lián)的變量對(duì)象,該執(zhí)行環(huán)境中,定義的所有變量和函數(shù)都保存在這個(gè)對(duì)象中。
- 在web瀏覽器中,全局執(zhí)行環(huán)境中,所有變量都保存在window對(duì)象中。
- 每個(gè)函數(shù)都有自己的執(zhí)行環(huán)境,當(dāng)執(zhí)行流進(jìn)入一個(gè)函數(shù)時(shí),函數(shù)的環(huán)境就會(huì)被推入一個(gè)環(huán)境棧中,而在函數(shù)執(zhí)行之后,棧將其環(huán)境彈出。
- 作用域鏈——當(dāng)代碼在一個(gè)環(huán)境中執(zhí)行時(shí),會(huì)創(chuàng)建變量對(duì)象的一個(gè)作用域鏈。其作用就是保證對(duì)執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。作用域鏈的最前端,始終都是當(dāng)前執(zhí)行的代碼所在環(huán)境的變量對(duì)象,而作用域鏈的最后端,則是全局執(zhí)行環(huán)境的變量對(duì)象。
- 如果環(huán)境是函數(shù),則將其活動(dòng)對(duì)象作為變量對(duì)象,活動(dòng)對(duì)象,最開始只是包含一個(gè)變量即arguments對(duì)象。
- 標(biāo)示符解析——即沿著作用域鏈一級(jí)一級(jí)的搜索標(biāo)識(shí)符的過程,搜索過程始終從作用鏈的最前端開始,然后逐級(jí)向后回溯,直至找到標(biāo)識(shí)符為止。為什么要解析呢?因?yàn)樵诰植凯h(huán)境中使用的非自己環(huán)境的變量對(duì)象內(nèi)的變量,則需要看看,這個(gè)變量在不在作用域鏈上的外層環(huán)境內(nèi)。
- 規(guī)律:內(nèi)部環(huán)境可以通過作用域鏈訪問所有的外部環(huán)境,但是外部環(huán)境不能訪問內(nèi)部環(huán)境中的任何變量和函數(shù)。
- ** 作用域鏈的延長(zhǎng)**
因?yàn)橛行┱Z句可以在作用域鏈的前端臨時(shí)增加一個(gè)變量對(duì)象,該變量對(duì)象也會(huì)在代碼執(zhí)行后被移除。- 第一種情況:
try catch
語句的catch塊。會(huì)創(chuàng)建一個(gè)新的變量對(duì)象,其中包含的是被拋出的錯(cuò)誤對(duì)象的聲明。 - 第二種情況:
with
語句。會(huì)將指定的對(duì)象添加到作用域鏈中,即添加到當(dāng)前執(zhí)行環(huán)境的變量對(duì)象中,也就是當(dāng)前執(zhí)行換進(jìn)的變量對(duì)象中的變量也可以訪問with語句指定的對(duì)象。
var qs="";
with(location){
var url=href+qs
}
- 第一種情況:
- js沒有塊級(jí)作用域
這里的塊級(jí)作用域,更多的是強(qiáng)調(diào)沒有像其他類C的語言中,由花括號(hào)封閉的代碼塊都有自己的作用域。但是函數(shù)是js中唯一擁有自身作用域的結(jié)構(gòu)。 - 沒有塊級(jí)作用域,那些
if(){}
與for(){}
則需要注意啦。大括號(hào)里新建的變量,括號(hào)結(jié)束后,可不會(huì)自動(dòng)退還內(nèi)存的。 - 聲明變量
- var聲明的變量會(huì)自動(dòng)添加到最近的環(huán)境中,如果某變量在函數(shù)內(nèi)沒有使用var聲明,便直接初始化,那么該變量則自動(dòng)添加到全局環(huán)境中。
-
變量聲明提升——當(dāng)前作用域內(nèi)的聲明都會(huì)提升到最前面,包括變量和函數(shù)的聲明。
function(){
var a="1";
var f=function(){};
var b="2";
}
變量afb的聲明會(huì)被提升到函數(shù)作用域的最前面類似如下:
function(){
var a,f,b;
a="1";
f=function(){};
b="2";
}
注意函數(shù)表達(dá)式的聲明并沒有被提升,這也是函數(shù)表達(dá)式與函數(shù)聲明的區(qū)別,看下面
function(){
var f1;function f2(){};
f1();//雖然f1的聲明被提升,但是f1提升后的值為undefined。所以此句會(huì)報(bào)錯(cuò)。
f2();
var f1=function(){};
}
- 查詢標(biāo)識(shí)符
- 當(dāng)某個(gè)環(huán)境中為了讀取或?qū)懭攵靡粋€(gè)標(biāo)示符時(shí),必須通過搜索來確定該標(biāo)示符實(shí)際代表什么。搜索過程從作用域鏈的前端開始,向上逐級(jí)查詢與給定名字匹配的標(biāo)識(shí)符,如果在局部環(huán)境中找到,則停止搜索。
- 因此訪問局部變量要比訪問全局變量更快,是吧!
-
標(biāo)識(shí)符同名問題
js中的一個(gè)名字以四種方式進(jìn)入作用域,其優(yōu)先級(jí)如下:
1、語言內(nèi)置:this、arguments
2、形式參數(shù):
3、函數(shù)聲明:
4、變量聲明:
名字聲明的優(yōu)先級(jí)如上,但是初始化確實(shí)按照該名字在聲明未提前之前的代碼順序,進(jìn)行初始化。
function(){
var foo;
alert(typeof foo);//function
function foo(){}
foo="foo";
alert(typeof foo);//string
}
JS—變量、作用域、內(nèi)存
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
- 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
- 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
- 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
- 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- 基本類型和引用類型 js中變量類型分為兩大類。基本類型和引用類型。基本類型指值直接保存在變量本地的類型。引用類型變...
- 本章內(nèi)容 理解基本類型和引用類型的值 理解執(zhí)行環(huán)境 理解垃圾收集 由于不存在定義某個(gè)變量必須要保存何種數(shù)據(jù)類型值的...
- 目錄 UIDevice設(shè)備相關(guān)信息設(shè)備電量近距離傳感器設(shè)備性能、界面模式NSBundle獲取應(yīng)用名稱應(yīng)用短版本號(hào)應(yīng)...