javascript基礎文法——全面理解變數和標識符,javascript變數
關於javascript,第一個比較重要的概念是變數,變數的工作機制是javascript的基本特性。實際上,變數是標識符的一種。本文將詳細介紹變數和標識符
定義
標識符(Identifier)就是一個名字,用來對變數、函數、屬性、參數進行命名,或者用做某些迴圈語句中的跳轉位置的標記
//變數var Identifier = 123;//屬性(new Object).Identifier = 'test';//函數及參數function IdentifierName(Identifier1){};//跳轉標記Identifier:for(var i = 0; i < 5; i++){ if(i == 3){ break Identifier; }}
在日常生活中,有些東西是固定不變的,有些東西則會發生變化。例如,人的姓名和生日是固定不變的,但心情和年齡卻會隨著時間變化而變化。人們把那些會發生變化的東西稱為變數
當程式需要將值儲存起來以備將來使用時,便將其賦值給一個變數。變數(variable)是一個用於儲存值的預留位置,可以通過變數名稱來獲得對值的引用
命名規則
在詞法結構一文中,我們介紹到javascript是一門區分字母大小寫語言,且和其他任何程式設計語言一樣,javascript保留了一些標識符為自己所用,保留字不能用做普通的標識符
[注意]保留字包括關鍵字、未來保留字、空字面量和布爾值字面量
保留字 ReservedWord :: Keyword FutureReservedWord NullLiteral BooleanLiteral
javascript標識符名允許包含字母、數字、貨幣符號和底線(但第一個字元不允許是數字)
//錯誤示範 6num //開頭不能用數字 %sum //開頭不能用除(_ $)外特殊符號,如(% + /等) sum+num //開頭中間不能使用除(_ $)外特殊符號,如(% + /等)
javascript允許標識符中出現 Unicode字元全集中的字母和數字(包括中文)。因此,程式員也可以使用非英語語言或數學符號來書寫標識符
var 測試文字 = 'test';
[注意]出於可移植性和易於書寫的考慮,通常我們不使用擴充的ASCII或Unicode字元
通常駝峰格式是標識符命名的首選格式,第一個字母小寫,剩下的每個單詞的首字母大寫
var myMoodToday = 'happy';
對於不同的資料類型,javascript有約定俗成的標識符名命名規則
類型 首碼 樣本 數組(Array) a aItems布爾值(Boolean) b bIsComplete浮點數(Float) f fPrice函數(Function) fn fnHandler整數(Integer) i iItemCount對象(Object) o oDIv1Regex(RegExp) re reEmailCheck字串(String) s sUserName變數()Variant v vAnything
變數聲明
聲明
在javascript中,使用一個變數之前應當先聲明(declare),變數是使用關鍵字var(variable的縮寫)來聲明的
var i;var sum;
也可以通過一個var關鍵字來聲明多個變數
var i ,sum;
賦值
把值存入變數的操作稱為賦值(assignment)。一個變數被賦值以後,我們就說該變數包含這個值
給變數第一次賦值的過程,叫初始化
我們可以將變數的初始賦值和變數聲明合寫在一起
var message = 'hello';var i=0,j=0,k=0;
如果未在var聲明語句中給變數指定初始值,那麼雖然聲明了這個變數,但在給它存入一個值之前,它的初始值就是undefined
在for迴圈和for-in迴圈中同樣可以使用var語句,這樣可以更簡潔地聲明在迴圈文法內中使用的迴圈變數
for(var i=0; i<10; i++)console.log(i);
變數可以在聲明時賦值,但不能有其他動作,如+=、-=等
var a = 2;//是正確的var a += 2;//是錯誤的var a = 2++;//是錯誤的,++只能用於變數,不能用於常量
重複聲明
使用var語句重複聲明變數是合法且無害的,如果重複聲明且帶有賦值操作,相當於重新賦值
遺漏聲明
如果試圖讀取一個沒有聲明的變數的值,javascript會報錯
javascript允許遺漏聲明,即直接對變數賦值而無需事先聲明,賦值操作將自動聲明該變數
但是,在ECMAScript5strict 模式中,給一個沒有聲明的變數賦值會報錯
<script>'use strict';a = 5;console.log(a);</script>
變數特性
javascript變數是弱類型(也叫鬆散類型)的,所謂鬆散類型就是可以用來儲存任何類型的資料
程式設計語言分類動態類型語言和靜態類型語言兩種。 動態類型語言是指在運行期間才去做資料類型檢查的語言,也就是說,在用動態類型的語言編程時,不用給任何變數指定資料類型,該語言會在第一次賦值給變數時,在內部將資料類型記錄下來。javascript就是動態類型語言的代表。
在javascript中,可以在修改變數值的同時修改值的類型
var message = 'hi';message = 100;//有效,但不推薦
變數鬆散類型的特性總結起來有兩點:一是聲明時不用給變數指定資料類型;二是賦值時可以修改資料類型
變數範圍
變數的範圍(scope),又叫執行環境(execution context),是程式原始碼中定義這個變數的地區
範圍分為全域範圍和函數範圍(又叫局部範圍)兩種
全域範圍是最外圍的一個執行環境,在web瀏覽器中,全域執行環境被認為是window對象。所有全域變數和函數都是作為window對象的屬性和方法建立的。全域變數擁有全域範圍,在javascript代碼中的任何地方都是有定義的。全域範圍直到應用程式退出例如關閉網頁或瀏覽器時才會被銷毀
在函數內聲明的變數只在函數體內有定義。它們是局部變數,範圍是局部性的。函數參數也是局部變數,它們只在函數體內有定義。函數範圍中的所有代碼執行完畢後,該範圍被銷毀,儲存在其中的所有變數和函數定義也隨之銷毀
function test(){ var message = 'hi';}test();alert(message);//錯誤
如果省略var操作符,則會建立一個全域變數
function test(){ message = 'hi';}test();alert(message);//'hi'
雖然省略var操作符可以定義全域變數,但並不推薦。在局部範圍中定義的全域變數很難維護,而且如果有意地忽略了var操作符,也會由於相應變數不會馬上就有定義而導致不必要的混亂,給未經聲明的變數賦值在strict 模式下會導致拋出ReferenceError錯誤
在函數體內,局部變數的優先順序高於同名的全域變數,如果在函數內聲明的一個局部變數或者函數參數中帶有的變數和全域變數重名,那麼全域變數就被局部變數遮蓋
var scope = 'global';function checkscope(){ var scope = 'local'; return scope;};checkscope();//'local'
聲明提升(hoisting)
塊級範圍
塊級範圍是指花括弧內的每一段代碼都具有各自的範圍,而javascript沒有塊級範圍。javascript只有函數範圍:變數在聲明它們的函數體以及這個函數體嵌套的任意函數體內都是有定義的
這意味著,變數在聲明之前甚至已經可用。javascript這個特性被非正式地稱為聲明提升(hoisting),javascript函數裡聲明的所有變數(不涉及賦值)都被提前到函數體的頂部
[注意]其實除了變數提升,函數也被提升,到函數部分會有詳細介紹
var scope = 'global';function f(){ console.log(scope);//undefined var scope = 'local'; console.log(scope);//'local'}
//變數聲明提升之後,相當於下面代碼var scope = 'global';function f(){ var scope; console.log(scope);//undefined scope = 'local'; console.log(scope);//'local'}
javascript中沒有塊級範圍,所以一些程式員特意將變數聲明放在函數體頂部,這種原始碼非常清晰地反映了真實的變數範圍
屬性變數
當聲明一個javascript全域變數時,實際上是定義了全域對象window的一個屬性
當使用var聲明一個變數時,建立的這個變數是不可配置的,也就是說這個變數無法通過delete運算子刪除
var truevar = 1;console.log(truevar,window.truevar);//1 1delete truevar;//falseconsole.log(truevar,window.truevar);//1 1
如果沒有使用strict 模式並給一個未聲明的變數賦值的話,javascript會自動建立一個全域變數,以這種方式建立的變數是全域對象的正常的可配置屬性,並可以刪除它們
window.fakevar1 = 10;console.log(fakevar1,window.fakevar1);//10 10 this.fakevar2 = 20;console.log(fakevar2,window.fakevar2); //20 20fakevar = 30;console.log(fakevar,window.fakevar); //30 30delete window.fakevar1;//truedelete this.fakevar2;//truedelete fakevar;//trueconsole.log(fakevar1,window.fakevar1);//報錯console.log(fakevar2,window.fakevar2); //報錯console.log(fakevar,window.fakevar); //報錯
javascript全域變數是全域對象的屬性,這是在ECMAScript中強制 規定的。局部變數當做跟函數調用相關的某個對象的屬性。ECMAScript3稱為調用對象(call object),ECMAScript5稱為聲明內容物件(declarative environment record)。javascript允許使用this關鍵字來引用全域對象,卻沒有辦法可以引用局部變數中存放的對象。這種存放局部變數對象的特有性質,是一種對我們不可見的內部實現
以上這篇javascript基礎文法——全面理解變數和標識符就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援幫客之家。