javascript基礎語法——變數和標識符

来源:http://www.cnblogs.com/xiaohuochai/archive/2016/06/01/5549833.html
-Advertisement-
Play Games

[1]定義 [2]命名規則 [3]變數聲明 [4]變數特性 [5]變數作用域 [6]聲明提升(hoisting) [7]屬性變數 ...


×
目錄
[1]定義 [2]命名規則 [3]聲明[4]特性[5]作用域[6]聲明提升[7]屬性變數

前面的話

  關於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           oDIv1
正則表達式(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允許遺漏聲明,即直接對變數賦值而無需事先聲明,賦值操作將自動聲明該變數   但是,在ECMAScript5嚴格模式中,給一個沒有聲明的變數賦值會報錯
<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操作符,也會由於相應變數不會馬上就有定義而導致不必要的混亂,給未經聲明的變數賦值在嚴格模式下會導致拋出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 1
delete truevar;//false
console.log(truevar,window.truevar);//1 1

  如果沒有使用嚴格模式並給一個未聲明的變數賦值的話,javascript會自動創建一個全局變數,以這種方式創建的變數是全局對象的正常的可配置屬性,並可以刪除它們

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);//報錯
console.log(fakevar2,window.fakevar2); //報錯
console.log(fakevar,window.fakevar); //報錯

  javascript全局變數是全局對象的屬性,這是在ECMAScript中強制 規定的。局部變數當做跟函數調用相關的某個對象的屬性。ECMAScript3稱為調用對象(call object),ECMAScript5稱為聲明上下文對象(declarative environment record)。javascript允許使用this關鍵字來引用全局對象,卻沒有辦法可以引用局部變數中存放的對象。這種存放局部變數對象的特有性質,是一種對我們不可見的內部實現

 

參考資料

【1】ES5/語法 https://www.w3.org/html/ig/zh/wiki/ES5/lexical
【2】阮一峰Javascript標準參考教程——語法概述 http://javascript.ruanyifeng.com/grammar/basic.html
【3】W3School-Javascript高級教程——ECMAScript變數 http://www.w3school.com.cn/js/pro_js_variables.asp
【4】《javascript權威指南(第6版)》第3章 類型、值和變數
【5】《javascript高級程式設計(第3版)》第3章 基本概念 第4章 變數、作用域和記憶體問題
【6】《javascript語言精粹(修訂版)》第2章 語法
【7】《javascript DOM編程藝術(第2版)》第2章 Javascript語法


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Using console.log() instead of alert() ...
  • 在Javascript中經常會遇到字元串的問題,但是如果要拼接的字元串過長就比較麻煩了。 如果是在一行的,可讀性差不說,如果要換行的,會直接報錯。 在此介紹幾種Javascript拼接字元串的技巧. 字元串相加(+) 利用反斜線拼接字元串 利用數組拼接字元串 利用數組的join方法,把數組轉成字元串 ...
  • 先介紹下層疊樣式表的三種形式: 1.內聯樣式,在html標簽中style屬性設置。 2.嵌入樣式,通過在head標簽設置style標簽添加樣式。 3.外部樣式,通過link標簽引入外部樣式 進入正題。 style屬性獲取樣式值,使用方法:obj.style.attr style只能獲取元素的內聯樣式 ...
  • 分享幾道JavaScript相關的面試題. 字元串反轉 這這裡提供了兩種解題思路。如果各位讀者還有其他的思路,可以分享交流! 第一方法: 第二種方法: 編寫一個JavaScript函數 parseQueryString,它的用途是把URL參數解析為一個對象,如:var url = “http://w ...
  • 1.get請求 function () { //向伺服器請求 時間 //1.創建非同步對象(小瀏覽器,後臺線程) var xhr = new XMLHttpRequest(); //2.設置參數,true表示使用非同步模式 xhr.open("get", "GetTime.ashx?name= Mr靖" ...
  • SearchFlight ...
  • jQuery 表單插件 jQuery cxCalendar 日期選擇器 jQuery cxColor 顏色選擇器 jQuery cxSelect 聯動下拉菜單 jQuery Validation Engine 表單驗證 jQuery soColorPacker 網頁拾色器 jQuery AutoCo ...
  • 學習要點: 1.熱門旅游區 2.標題介紹區 3.旅游項目區 主講教師:李炎恢 本章主要開始使用學慣用 HTML5 和 CSS3 來構建 Web 頁面,第一個項目採用 PC 端固定佈局來實現。 一.熱門旅游區 本節課,我們將探討一下首頁最核心的部分,旅游區。這塊內容由兩個部分組成,一個是大標題,表示熱 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...