javascript基礎(chǔ)語法——全面理解變量和標(biāo)識符
關(guān)于javascript,第一個比較重要的概念是變量,變量的工作機(jī)制是javascript的基本特性。實(shí)際上,變量是標(biāo)識符的一種。本文將詳細(xì)介紹變量和標(biāo)識符
定義
標(biāo)識符(Identifier)就是一個名字,用來對變量、函數(shù)、屬性、參數(shù)進(jìn)行命名,或者用做某些循環(huán)語句中的跳轉(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; } }
在日常生活中,有些東西是固定不變的,有些東西則會發(fā)生變化。例如,人的姓名和生日是固定不變的,但心情和年齡卻會隨著時間變化而變化。人們把那些會發(fā)生變化的東西稱為變量
當(dāng)程序需要將值保存起來以備將來使用時,便將其賦值給一個變量。變量(variable)是一個用于保存值的占位符,可以通過變量名稱來獲得對值的引用

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

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

javascript允許遺漏聲明,即直接對變量賦值而無需事先聲明,賦值操作將自動聲明該變量

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

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