JavaScript基本概念1

來源:互聯網
上載者:User

標籤:單行   正常化   獨立   static   const   提高   否則   多行   預留位置   

Beauty will fade but love will stay.

ECMA-262 通過 ECMAScript 描述了 JavaScript 的所有基本概念。在瞭解 JavaScript 這門語言最基本的工作原理之前,讓我們再回顧一下 ECMAScript 發展曆史:
1)JavaScript 與 ECMAScript 是什麼關係?
JavaScript 的含義比 ECMAScript 多得多,一個完整的 JavaScript 實現由 ECMAScript、DOM 和 BOM 三個部分組成,其中 ECMAScript 是 JavaScript 的核心。
2)ECMAScript 是幹什麼的?
在早期 JavaScript 有兩個不同版本:Netscape Navigator 中的 JavaScript 和 Internet Explorer 3 中的 JScript,因此 ECMA 推出了 ECMAScript。ECMAScript 規定了 JavaScript 的基本文法和特性,自此各瀏覽器開發商開始將 ECMAScript 作為各自 JavaScript 實現的基礎。ECMAScript 是正常化的指令碼(script)語言。
3)ECMA-262是幹什麼的?
ECMA-262 是 ECMAScript 語言的標準定義,與 網頁瀏覽器沒有依賴關係,也不包含輸入輸出定義。因為 ECMA-262 定義的 ECMAScript 只是 JavaScript 的基礎內容,所以各開發商可以在此基礎之上構建出更完善的指令碼語言。

(1)ECMA-262 第1版:本質與 Netscape 的 JavaScript 1.1 相同,去除了對針對瀏覽器的特性,支援 Unicode 標準(多語言開發),對象也變成了和平台無關的。(1997年6月)
(2)ECMA-262 第2版:與 ISO/IEC-16262(即 ECMAScript)保持嚴格一致,沒有新增、修改和刪除。(1998年6月)
(3)ECMA-262 第3版:它標誌著 ECMAScript 成為了一門真正的程式設計語言。在此之後 ECMAScript 沉寂了許多年,直到 Ajax 流行起來後標準工作才再次起步。(1999年12月)
(4)ECMA-262 第4版:於發布前被廢棄, 但是它的大部分內容被 ES 6 繼承了。
(5)ECMA-262 第5版:力求澄清第 3 版中的歧義,並添加了新的功能。(2009年12月)
(6)ECMA-262 第5.1版:與 ISO/IEC 16262:2011 第三版保持嚴格一致。(2011年6月)
(7)ECMA-262 第6版:增添了許多必要的特性(2015年6月)
(8)ECMA-262 第7版:又被稱為 ECMAScript 2016,增加了兩個新的特性。(2016年6月)
(9)ECMA-262 第8版:又被稱為 ECMAScript 2017,增加了字元處理、錯誤處理和一些新函數。(2017年6月)

雖然 ECMAScript 的新標準不斷地被推出來了,目前市場上大多數瀏覽器也都能相容ECMAScript 5 了,但工作中常常要求相容 IE 的低版本,所以 ECMA-262 第 3 版中定義的 ECMAScript 依然是各瀏覽器實現最多的一個版本。

1.文法

ECMAScript的文法大量借鑒了 C 和其他類 C 語言的文法。

區分大小寫

ECMAScript中的一切(變數、函數名和操作符)都區分大小寫。

標識符

標識符就是指變數、函數、屬性的名字,或者函數的參數,它由符合以下條件的一個或多個字元組成:

  • 第一個字元必須是一個字母、底線或者一個貨幣符號
  • 其他字元可以是字母、底線、貨幣符號或數字

其中的字母可以包含擴充的 Unicode 字母字元(因為儲存標識符時採用的就是Unicode編碼),所以理論上你可以使用 UTF-8 中的任一字元(例如中文字元)來組成標識符,只是我們不推薦這樣做。
按照慣例,ECMAScript 標識符採用駝峰命名法(首字母小寫,後面單詞的首字母大寫)。
關鍵字、保留字、true、false、null 不能用作標識符。

undefined 是全域對象 window 的一個屬性,這個屬性是不可寫(writable:false)的,也就是說在全域範圍內不能重新賦值(賦值無效但不會報錯);
又因為 undefined 不是 js 的關鍵字或保留字,所以它可以被當作一個標識符,在除了全域範圍以外的任何範圍中(例如在方法中)使用。

注釋

ECMAScript使用 C 風格的注釋,包括單行注釋(//)和塊級注釋(/* */)。

/*   * 這是多行注釋,此行左邊的星號無特殊意義,僅用於提高注釋可讀性  */
strict 模式

strict 模式在 ECMAScript 5被引入,為 JavaScript 定義了一種不同的解析與執行模型,在此模式下 ECMAScript 3 中的一些不確定行為將得到處理,某些不安全操作也會拋出錯誤。
要在整個指令碼中啟用strict 模式,可以在指令碼頂部添加如下代碼:

"use strict";

這行代碼是一個編譯指示,用於告訴 JavaScript 引擎切換到strict 模式。
類似的,要在函數中啟用strict 模式,可以在函數內部的上方包含這條編譯指令。

語句

ECMAScript 中的語句以一個分號結尾;如果省略分號則由解析器確定語句結尾,推薦在任何時候都不要省略分號。推薦在控制語句中使用代碼塊(即{}),即使代碼塊中只有一行語句。

2.關鍵字和保留字

ECMA-262 描述了一組具有特定用途的關鍵字,這些關鍵字可用於表示控制語句的開始或結束,或者用於執行特定操作等。關鍵字不能用作標識符。以下是ECMAScript 的全部關鍵字:

break       do          instanceof  typeofcase        else        new         varcatch       finally     return      voidcontinue    for         switch      whiledebugger*   function    this        withdefault     if          throw       delete      in          try 

其中 debugger 是 ECMAScript 5 新增的關鍵字,在此之前它是一個保留字。

ECMA-262 描述了一組不能用作標識符的保留字,儘管目前這些保留字在 ECMAScript 中沒有任何用途,但它們將來可能被用作關鍵字。以下是 ECMAScript 第 3 版定義的全部保留字(即 Java 的所有關鍵字):

abstract    enum        int         shortboolean     export      interface   staticbyte        extends     long        superchar        final       native      synchronizedclass       float       package     throwsconst       goto        private     transientdebugger    implements  protected   volatiledouble      import      public

ECMAScript 第 5 版在非strict 模式下運行時的保留字縮減為以下幾個:

class       enum        extends     superconst       export      import      

這意味著非strict 模式下開發商得以使用那些被釋放的保留字來作為標識符。

ECMAScript 第 5 版在strict 模式下運行時的保留字縮減為以下幾個:

class       enum        extends     superconst       export      import      implementinterface   static      let         yieldpackage     private     protected   public

在這裡,let 和 yield 是 ECMAScript 第 5 版新增的保留字。ECMAScript 第 5 版在strict 模式中還對 eval 和 arguments 施加了限制,它們不能用作標識符或屬性名稱,但它們並不完全是保留字。

為了保證相容性,通常會將第3版的保留字外加 let 和 yield,即目前出現過的所有保留字作為編程時的參考。
JavaScript 預定義了很多全域變數和函數,應當避免把它們的名字用做變數名和函數名。每一種特定的 JavaScript 運行環境(用戶端、伺服器端等)都有自己的一個全域屬性列表,我們可以通過 Window 對象來瞭解用戶端 JavaScript 中定義的全域變數和函數列表。

在實現 ECMAScript 第 3 版的 JavaScript 引擎中,使用關鍵字作為標識符會導致“Identifier Expected”錯誤,但是使用保留字作為標識符不一定會導致相同錯誤,這取決於不同的引擎。

ECMAScript 第 5 版修改了關鍵字和保留字的規則:關鍵字和保留字不能用作標識符,但可以用作對象的屬性名稱。我們不建議這樣做,以便保持代碼的相容性。

3.變數

ECMAScript 的變數是鬆散類型的(即可以儲存任意類型的資料),每個變數只是一個用於儲存值的預留位置。

定義變數,可以使用var操作符,例如:
var message;
像這樣未初始化的變數,會儲存一個特殊值 undefined。
var message = "hello";
像這樣初始設定變數不會把它標記為字串類型,僅僅是賦值而已,因此我們可以修改一個變數的類型,只是這種做法並不推薦。
使用 var 來定義的變數通常是局部變數,僅在定義該變數的範圍中有效,如果範圍是整個指令碼,那麼它就是全域變數。

可以通過省略 var 操作符,定義一個全域變數:
message = "hello";
使用這種方式定義的變數始終是一個全域變數,即使該語句在一個方法內。
在局部範圍中的全域變數難以維護,並且在一個範圍執行前其內的全域變數還沒有定義,所以應該謹慎的使用全域變數。
在strict 模式下,不允許給一個未聲明的變數(即全域變數)賦值,否則會拋出 ReferenceError 錯誤。

4.語句if語句

文法:if (條件) 語句1 else 語句2
條件不一定是布爾值,ECMAScript 會自動調用 Boolean() 將其轉化為布爾值
當條件成立時執行語句1,否則執行語句2

do-while語句

文法:do { 語句 } while (條件)
是一種後測試迴圈語句,即先執行一次語句再進行判斷,條件成立繼續執行語句,否則退出迴圈

while語句

文法:while (條件) 語句
是一種前測試迴圈語句,即先進行判斷,再根據判斷結果執行語句或退出迴圈

for語句

文法:for (初始化語句;條件;額外語句) 語句
也是一種前測試迴圈語句,它可以在迴圈開始前定義初始設定變數,在每次迴圈結束時執行一行額外語句
for迴圈與while迴圈作用相同,它只是把與迴圈有關的代碼集中在一起

for-in語句

文法:for (變數 in 對象) 語句
是一種精準的迭代語句,可以用來枚舉對象的屬性
每次迴圈,都會將對象中的一個屬性賦值給變數,所有屬性都被遍曆一遍時停止迴圈
如果待遍曆的對象為 null 或 undefined,則不執行語句,直接結束迴圈

label語句

文法:標籤:語句
定義的標籤可以由 break 或 continue 語句引用

break和continue語句

用於在迴圈中精確的控制碼執行,break 會立刻退出整個迴圈,而 continue 會退出當前這一次迴圈,然後從迴圈頂部繼續執行

with語句

文法:with (對象) 語句
用於將代碼的範圍設定到一個特定的對象中
例如:

var a = local.name;var b = local.address;

可以簡寫為:

with (local) {    var a = name;    var b = address;}

strict 模式下不允許使用 with 語句

switch語句

文法:

switch (條件) {    case 情況1:語句    break;    case 情況2:語句    break;    default:語句}  

本質是一種簡化的if語句
它的判斷條件可以使用任何資料類型,case 的值也不一定是常量
switch 在比較值時使用全等於操作符,不會發生類型轉換

5.函數

ECMAScript 通過函數封裝多條語句,在任何地方任何時候調用執行
基本文法:

function 函數名 (參數列表) {    語句}

通過函數名加上圓括弧來調用函數,括弧中可以傳入適當的參數,多個參數間用逗號隔開
ECMAScript 中的函數在定義時不必指定傳回值類型,函數在任何時候都可以通過 return 語句實現傳回值
return 語句如果不帶有任何傳回值,或者函數沒有 return 語句,函數將返回 undefined 值
strict 模式下,函數和參數不能命名為 eval 或 arguments,參數也不能同名

理解參數

ECMAScript 不介意傳遞參數的個數和資料類型,因為參數在內部是用一個數組來表示的,解析器不會驗證參數列表,可見命名的參數只是方便閱讀而並非必需的,通過 arguments 對象可以訪問這個參數數組
arguments 對象的 length 屬性工作表示有多少個參數傳遞給了函數,利用這個可以讓函數接收任意數量的參數並實現適當的功能(例如重載)
例如:

function add(num1,num2) { // num1 和 num2 是具名引數    return arguments[0] + arguments[1];}

arguments 中參數的值總是與對應的具名引數的值(如果有具名引數)保持同步,但他們並非訪問的同一個記憶體空間
如果只傳入一個參數,則只有 arguments[0] 而沒有 arguments[1],但是沒有傳遞值的具名引數 num2 將被自動賦予 undefined 值
strict 模式下,arguments 的值不允許重寫

  • 按值傳遞:函數的形參是實參的副本。修改形參的值並不會影響實參。由於每次都需要複製副本,對一些複雜類型效能較低。
  • 按引用傳遞:函數的形參是實參的隱式引用。形參的值如果被修改,實參也會被修改。使函數調用的追蹤更加困難。

ECMAScript 在的所有參數傳遞都是值傳遞,不可能通過引用傳遞參數,因為物件變數儲存的值是這個對象在堆記憶體中的記憶體位址。

  • 原始值:儲存在棧中的簡單類型資料區段,變數訪問的位置就是值儲存的位置。
  • 引用值:儲存在堆中的對象,變數首先訪問的是儲存在棧中的值,得到的是一個指標(堆中的記憶體位址值),然後根據指標得到儲存在堆中的對象

JS 的基本類型是按值傳遞的。
JS 的對象的傳遞是按共用傳遞的,函數接受對象實參引用的這個形參,既不是按值傳遞的對象副本,也不是按引用傳遞的隱式引用。
在函數內對對象的屬性進行操作,實際就是對其指向對象的屬性進行操作,因為此時形參和實參都指向同一個引用值,這裡共用傳遞和引用傳遞的表現是一致的。
但是,如果對形參的整體進行操作,實際上是新定義了一個對象,形參儲存在棧中的值引用地址修改為了新的對象的引用地址,此時形參和實參相互獨立。

沒有重載

ECMAScript 函數不能重載,因為沒有簽名(接受的參數個數和類型),但可以通過一些方法模仿方法重載。
如果定義兩個同名函數,則後者會覆蓋前者。
ECMAScript 函數參數是一個含零個或多個值的數組,通過檢查傳入參數個數,可以近似的實現函數的重載。

JavaScript基本概念1

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.