javascript基礎(chǔ)語(yǔ)法——全面理解變量和標(biāo)識(shí)符
關(guān)于javascript,第一個(gè)比較重要的概念是變量,變量的工作機(jī)制是javascript的基本特性。實(shí)際上,變量是標(biāo)識(shí)符的一種。本文將詳細(xì)介紹變量和標(biāo)識(shí)符
定義
標(biāo)識(shí)符(Identifier)就是一個(gè)名字,用來(lái)對(duì)變量、函數(shù)、屬性、參數(shù)進(jìn)行命名,或者用做某些循環(huán)語(yǔ)句中的跳轉(zhuǎn)位置的標(biāo)記
//變量 var Identifier = 123; //屬性 (new Object).Identifier = 'test'; //函數(shù)及參數(shù) function IdentifierName(Identifier1){}; //跳轉(zhuǎn)標(biāo)記 Identifier: for(var i = 0; i < 5; i++){ if(i == 3){ break Identifier; } }
在日常生活中,有些東西是固定不變的,有些東西則會(huì)發(fā)生變化。例如,人的姓名和生日是固定不變的,但心情和年齡卻會(huì)隨著時(shí)間變化而變化。人們把那些會(huì)發(fā)生變化的東西稱為變量
當(dāng)程序需要將值保存起來(lái)以備將來(lái)使用時(shí),便將其賦值給一個(gè)變量。變量(variable)是一個(gè)用于保存值的占位符,可以通過(guò)變量名稱來(lái)獲得對(duì)值的引用

命名規(guī)則
在詞法結(jié)構(gòu)一文中,我們介紹到j(luò)avascript是一門(mén)區(qū)分字母大小寫(xiě)的語(yǔ)言,且和其他任何編程語(yǔ)言一樣,javascript保留了一些標(biāo)識(shí)符為自己所用,保留字不能用做普通的標(biāo)識(shí)符
[注意]保留字包括關(guān)鍵字、未來(lái)保留字、空字面量和布爾值字面量
保留字 ReservedWord :: Keyword FutureReservedWord NullLiteral BooleanLiteral
javascript標(biāo)識(shí)符名允許包含字母、數(shù)字、美元符號(hào)和下劃線(但第一個(gè)字符不允許是數(shù)字)
//錯(cuò)誤示范 6num //開(kāi)頭不能用數(shù)字 %sum //開(kāi)頭不能用除(_ $)外特殊符號(hào),如(% + /等) sum+num //開(kāi)頭中間不能使用除(_ $)外特殊符號(hào),如(% + /等)
javascript允許標(biāo)識(shí)符中出現(xiàn) Unicode字符全集中的字母和數(shù)字(包括中文)。因此,程序員也可以使用非英語(yǔ)語(yǔ)言或數(shù)學(xué)符號(hào)來(lái)書(shū)寫(xiě)標(biāo)識(shí)符
var 測(cè)試文字 = 'test';
[注意]出于可移植性和易于書(shū)寫(xiě)的考慮,通常我們不使用擴(kuò)展的ASCII或Unicode字符
通常駝峰格式是標(biāo)識(shí)符命名的首選格式,第一個(gè)字母小寫(xiě),剩下的每個(gè)單詞的首字母大寫(xiě)
var myMoodToday = 'happy';
對(duì)于不同的數(shù)據(jù)類型,javascript有約定俗成的標(biāo)識(shí)符名命名規(guī)則
類型 前綴 示例 數(shù)組(Array) a aItems 布爾值(Boolean) b bIsComplete 浮點(diǎn)數(shù)(Float) f fPrice 函數(shù)(Function) fn fnHandler 整數(shù)(Integer) i iItemCount 對(duì)象(Object) o oDIv1 正則表達(dá)式(RegExp) re reEmailCheck 字符串(String) s sUserName 變量()Variant v vAnything
變量聲明
聲明
在javascript中,使用一個(gè)變量之前應(yīng)當(dāng)先聲明(declare),變量是使用關(guān)鍵字var(variable的縮寫(xiě))來(lái)聲明的
var i; var sum;
也可以通過(guò)一個(gè)var關(guān)鍵字來(lái)聲明多個(gè)變量
var i ,sum;
賦值
把值存入變量的操作稱為賦值(assignment)。一個(gè)變量被賦值以后,我們就說(shuō)該變量包含這個(gè)值
給變量第一次賦值的過(guò)程,叫初始化
我們可以將變量的初始賦值和變量聲明合寫(xiě)在一起
var message = 'hello'; var i=0,j=0,k=0;
如果未在var聲明語(yǔ)句中給變量指定初始值,那么雖然聲明了這個(gè)變量,但在給它存入一個(gè)值之前,它的初始值就是undefined

在for循環(huán)和for-in循環(huán)中同樣可以使用var語(yǔ)句,這樣可以更簡(jiǎn)潔地聲明在循環(huán)語(yǔ)法內(nèi)中使用的循環(huán)變量
for(var i=0; i<10; i++)console.log(i);
變量可以在聲明時(shí)賦值,但不能有其他操作,如+=、-=等
var a = 2;//是正確的 var a += 2;//是錯(cuò)誤的 var a = 2++;//是錯(cuò)誤的,++只能用于變量,不能用于常量
重復(fù)聲明
使用var語(yǔ)句重復(fù)聲明變量是合法且無(wú)害的,如果重復(fù)聲明且?guī)в匈x值操作,相當(dāng)于重新賦值
遺漏聲明
如果試圖讀取一個(gè)沒(méi)有聲明的變量的值,javascript會(huì)報(bào)錯(cuò)

javascript允許遺漏聲明,即直接對(duì)變量賦值而無(wú)需事先聲明,賦值操作將自動(dòng)聲明該變量

但是,在ECMAScript5嚴(yán)格模式中,給一個(gè)沒(méi)有聲明的變量賦值會(huì)報(bào)錯(cuò)
<script> 'use strict'; a = 5; console.log(a); </script>

變量特性
javascript變量是弱類型(也叫松散類型)的,所謂松散類型就是可以用來(lái)保存任何類型的數(shù)據(jù)
編程語(yǔ)言分類動(dòng)態(tài)類型語(yǔ)言和靜態(tài)類型語(yǔ)言兩種。 動(dòng)態(tài)類型語(yǔ)言是指在運(yùn)行期間才去做數(shù)據(jù)類型檢查的語(yǔ)言,也就是說(shuō),在用動(dòng)態(tài)類型的語(yǔ)言編程時(shí),不用給任何變量指定數(shù)據(jù)類型,該語(yǔ)言會(huì)在第一次賦值給變量時(shí),在內(nèi)部將數(shù)據(jù)類型記錄下來(lái)。javascript就是動(dòng)態(tài)類型語(yǔ)言的代表。
在javascript中,可以在修改變量值的同時(shí)修改值的類型
var message = 'hi'; message = 100;//有效,但不推薦
變量松散類型的特性總結(jié)起來(lái)有兩點(diǎn):一是聲明時(shí)不用給變量指定數(shù)據(jù)類型;二是賦值時(shí)可以修改數(shù)據(jù)類型
變量作用域
變量的作用域(scope),又叫執(zhí)行環(huán)境(execution context),是程序源代碼中定義這個(gè)變量的區(qū)域
作用域分為全局作用域和函數(shù)作用域(又叫局部作用域)兩種
全局作用域是最外圍的一個(gè)執(zhí)行環(huán)境,在web瀏覽器中,全局執(zhí)行環(huán)境被認(rèn)為是window對(duì)象。所有全局變量和函數(shù)都是作為window對(duì)象的屬性和方法創(chuàng)建的。全局變量擁有全局作用域,在javascript代碼中的任何地方都是有定義的。全局作用域直到應(yīng)用程序退出例如關(guān)閉網(wǎng)頁(yè)或?yàn)g覽器時(shí)才會(huì)被銷毀
在函數(shù)內(nèi)聲明的變量只在函數(shù)體內(nèi)有定義。它們是局部變量,作用域是局部性的。函數(shù)參數(shù)也是局部變量,它們只在函數(shù)體內(nèi)有定義。函數(shù)作用域中的所有代碼執(zhí)行完畢后,該作用域被銷毀,保存在其中的所有變量和函數(shù)定義也隨之銷毀
function test(){ var message = 'hi'; } test(); alert(message);//錯(cuò)誤
如果省略var操作符,則會(huì)創(chuàng)建一個(gè)全局變量
function test(){ message = 'hi'; } test(); alert(message);//'hi'
雖然省略var操作符可以定義全局變量,但并不推薦。在局部作用域中定義的全局變量很難維護(hù),而且如果有意地忽略了var操作符,也會(huì)由于相應(yīng)變量不會(huì)馬上就有定義而導(dǎo)致不必要的混亂,給未經(jīng)聲明的變量賦值在嚴(yán)格模式下會(huì)導(dǎo)致拋出ReferenceError錯(cuò)誤
在函數(shù)體內(nèi),局部變量的優(yōu)先級(jí)高于同名的全局變量,如果在函數(shù)內(nèi)聲明的一個(gè)局部變量或者函數(shù)參數(shù)中帶有的變量和全局變量重名,那么全局變量就被局部變量遮蓋
var scope = 'global'; function checkscope(){ var scope = 'local'; return scope; }; checkscope();//'local'
聲明提升(hoisting)
塊級(jí)作用域
塊級(jí)作用域是指花括號(hào)內(nèi)的每一段代碼都具有各自的作用域,而javascript沒(méi)有塊級(jí)作用域。javascript只有函數(shù)作用域:變量在聲明它們的函數(shù)體以及這個(gè)函數(shù)體嵌套的任意函數(shù)體內(nèi)都是有定義的
這意味著,變量在聲明之前甚至已經(jīng)可用。javascript這個(gè)特性被非正式地稱為聲明提升(hoisting),javascript函數(shù)里聲明的所有變量(不涉及賦值)都被提前到函數(shù)體的頂部
[注意]其實(shí)除了變量提升,函數(shù)也被提升,到函數(shù)部分會(huì)有詳細(xì)介紹
var scope = 'global'; function f(){ console.log(scope);//undefined var scope = 'local'; console.log(scope);//'local' }
//變量聲明提升之后,相當(dāng)于下面代碼 var scope = 'global'; function f(){ var scope; console.log(scope);//undefined scope = 'local'; console.log(scope);//'local' }
javascript中沒(méi)有塊級(jí)作用域,所以一些程序員特意將變量聲明放在函數(shù)體頂部,這種源代碼非常清晰地反映了真實(shí)的變量作用域
屬性變量
當(dāng)聲明一個(gè)javascript全局變量時(shí),實(shí)際上是定義了全局對(duì)象window的一個(gè)屬性
當(dāng)使用var聲明一個(gè)變量時(shí),創(chuàng)建的這個(gè)變量是不可配置的,也就是說(shuō)這個(gè)變量無(wú)法通過(guò)delete運(yùn)算符刪除
var truevar = 1; console.log(truevar,window.truevar);//1 1 delete truevar;//false console.log(truevar,window.truevar);//1 1
如果沒(méi)有使用嚴(yán)格模式并給一個(gè)未聲明的變量賦值的話,javascript會(huì)自動(dòng)創(chuàng)建一個(gè)全局變量,以這種方式創(chuàng)建的變量是全局對(duì)象的正常的可配置屬性,并可以刪除它們
window.fakevar1 = 10; console.log(fakevar1,window.fakevar1);//10 10 this.fakevar2 = 20; console.log(fakevar2,window.fakevar2); //20 20 fakevar = 30; console.log(fakevar,window.fakevar); //30 30 delete window.fakevar1;//true delete this.fakevar2;//true delete fakevar;//true console.log(fakevar1,window.fakevar1);//報(bào)錯(cuò) console.log(fakevar2,window.fakevar2); //報(bào)錯(cuò) console.log(fakevar,window.fakevar); //報(bào)錯(cuò)
javascript全局變量是全局對(duì)象的屬性,這是在ECMAScript中強(qiáng)制 規(guī)定的。局部變量當(dāng)做跟函數(shù)調(diào)用相關(guān)的某個(gè)對(duì)象的屬性。ECMAScript3稱為調(diào)用對(duì)象(call object),ECMAScript5稱為聲明上下文對(duì)象(declarative environment record)。javascript允許使用this關(guān)鍵字來(lái)引用全局對(duì)象,卻沒(méi)有辦法可以引用局部變量中存放的對(duì)象。這種存放局部變量對(duì)象的特有性質(zhì),是一種對(duì)我們不可見(jiàn)的內(nèi)部實(shí)現(xiàn)
以上這篇javascript基礎(chǔ)語(yǔ)法——全面理解變量和標(biāo)識(shí)符就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
getElementById在任意一款瀏覽器中都可以用嗎的疑問(wèn)回復(fù)
getElementById在任意一款瀏覽器中都可以用嗎的疑問(wèn)回復(fù)...2007-05-05JavaScript的繼承實(shí)現(xiàn)小結(jié)
JavaScript作為面向?qū)ο蟮娜躅愋驼Z(yǔ)言,繼承也是其非常強(qiáng)大的特性之一。那么如何在JS中實(shí)現(xiàn)繼承呢?本文將給大家揭開(kāi)神秘面紗2017-05-05JavaScript 鏈?zhǔn)浇Y(jié)構(gòu)序列化詳解
這篇文章主要介紹了JavaScript 鏈?zhǔn)浇Y(jié)構(gòu)序列化詳解的相關(guān)資料,需要的朋友可以參考下2016-09-09js parsefloat parseint 轉(zhuǎn)換函數(shù)
JavaScript提供了3個(gè)顯式的類型轉(zhuǎn)換函數(shù),分別是eval()、parseInt()和parseFloat()。2010-01-01Javascript學(xué)習(xí)筆記之函數(shù)篇(五) : 構(gòu)造函數(shù)
javascript本身是沒(méi)有類的概念,只有函數(shù)的概念。javascript的類實(shí)際上也是一個(gè)javascript的函數(shù),在這個(gè)特殊的函數(shù)中間可以包含變量和其他javascript函數(shù)的引用。那么這個(gè)特殊的函數(shù)本身就是javascript所謂類的構(gòu)造函數(shù)。2014-11-11JavaScript數(shù)據(jù)類型相關(guān)知識(shí)詳解
這篇文章主要介紹了JavaScript數(shù)據(jù)類型相關(guān)知識(shí)詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)js數(shù)據(jù)類型的小伙伴們有很好的幫助,需要的朋友可以參考下2021-04-04JavaScript 高級(jí)篇之函數(shù) (四)
本節(jié)我將分享我對(duì)函數(shù),嵌套函數(shù),作為數(shù)據(jù)的函數(shù),作為對(duì)象的函數(shù)等2012-04-04