ECMAScript快速入門——對比Java

我是來自58同城的一名Android開發工程師,可以幫你內推所有技術崗位。

如果這篇文章幫助到了你,歡迎點贊、留言,關注點贊不迷路。

 

ECMAScript作爲JavaScript和微信小程序開發的基礎,是學習過程中的一個重要單元,爲了降低學習成本,現將我在W3CSchool的學習筆記分享出來,希望能夠幫到更多想要快速掌握這門技術的同學:


資料來源:W3CSchool

和Java一樣,ECMAScript區分大小寫,註釋的格式相同,通過{}確定代碼塊,原始數據類型存儲在堆棧,對象的引用存儲在堆中 。

 

變量是弱類型的

與Java和C不同,ECMAScript中的變量無特定的類型,定義變量時只用var運算符,可以將它初始化爲任意值。

因此,可以隨時改變變量所存數據的類型(儘量避免這樣做)。

 

關於語句的結尾分號

ECMAScript則允許開發者自行決定是否以分號結束一行代碼。如果沒有分號,ECMAScript就把折行代碼的結尾看做該語句的結尾(與Visual Basic和VBScript相似),前提是這樣沒有破壞代碼的語義。

 

括號表示代碼塊

從Java中借鑑的另一個概念是代碼塊。

代碼塊表示一系列應該按順序執行的語句,這些語句被封裝在左括號({)和右括號(})之間。

 

關於變量初始化:

與Java不同,ECMAScript中的變量並不一定要初始化(它們是在幕後初始化的,將在後面討論這一點)。

 

變量聲明不是必須的

ECMAScript另一個有趣的方面(也是與大多數程序設計語言的主要區別),是在使用變量之前不必聲明。

 

關於ECMA的關鍵字:

關於ECMA的保留字:

保留字在某種意思上是爲將來的關鍵字而保留的單詞。因此保留字不能被用作變量名或函數名。

關於原始類型和引用類型:

在 ECMAScript 中,變量可以存在兩種類型的值,即原始值和引用值。

原始值存儲在棧(stack)中的簡單數據段,也就是說,它們的值直接存儲在變量訪問的位置。

引用值存儲在堆(heap)中的對象,也就是說,存儲在變量處的值是一個指針(point),指向存儲對象的內存處。爲變量賦值時,ECMAScript 的解釋程序必須判斷該值是原始類型,還是引用類型。要實現這一點,解釋程序則需嘗試判斷該值是否爲 ECMAScript 的原始類型之一,即 Undefined、Null、Boolean、Number 和 String 型。由於這些原始類型佔據的空間是固定的,所以可將他們存儲在較小的內存區域 - 棧中。這樣存儲便於迅速查尋變量的值。

在許多語言中,字符串都被看作引用類型,而非原始類型,因爲字符串的長度是可變的。ECMAScript 打破了這一傳統。

如果一個值是引用類型的,那麼它的存儲空間將從堆中分配。由於引用值的大小會改變,所以不能把它放在棧中,否則會降低變量查尋的速度。相反,放在變量的棧空間中的值是該對象存儲在堆中的地址。地址的大小是固定的,所以把它存儲在棧中對變量性能無任何負面影響。

關於ECMA的原始類型:

ECMAScript 有 5 種原始類型(primitive type),即 Undefined、Null、Boolean、Number 和 String。ECMA-262 把術語類型(type)定義爲值的一個集合,每種原始類型定義了它包含的值的範圍及其字面量表示形式。

ECMAScript 提供了 typeof 運算符來判斷一個值是否在某種類型的範圍內。可以用這種運算符判斷一個值是否表示一種原始類型:如果它是原始類型,還可以判斷它表示哪種原始類型。

關於字符串的大小比較:

對於字符串,第一個字符串中每個字符的代碼都與會第二個字符串中對應位置的字符的代碼進行數值比較。完成這種比較操作後,返回一個 Boolean 值。問題在於大寫字母的代碼都小於小寫字母的代碼,這意味這着可能會遇到下列情況:

var bResult = "Blue" < "alpha";

alert(bResult); //輸出 true

在上面的例子中,字符串 "Blue" 小於 "alpha",因爲字母 B 的字符代碼是 66,字母 a 的字符代碼是 97。要強制性得到按照真正的字母順序比較的結果,必須把兩個數轉換成相同的大小寫形式(全大寫或全小寫的),然後再進行比較:

var bResult = "Blue".toLowerCase() < "alpha".toLowerCase();

alert(bResult); //輸出 false

把兩個運算數都轉換成小寫,確保了正確識別出 "alpha" 在字母順序上位於 "Blue" 之前。

關於數字和字符串的比較:

無論何時比較一個數字和一個字符串,ECMAScript 都會把字符串轉換成數字,然後按照數字順序比較它們。

不過,如果字符串不能轉換成數字又該如何呢?考慮下面的例子:

var bResult = "a" < 3;

alert(bResult);

你能預料到這段代碼輸出什麼嗎?字母 "a" 不能轉換成有意義的數字。不過,如果對它調用 parseInt() 方法,返回的是 NaN。根據規則,任何包含 NaN 的關係運算符都要返回 false,因此這段代碼也輸出 false:

var bResult = "a" >= 3;

alert(bResult);

通常,如果小於運算的兩個值返回 false,那麼大於等於運算必須返回 true,不過如果某個數字是 NaN,情況則非如此。

關於ECMA的等性運算符:

判斷兩個變量是否相等是程序設計中非常重要的運算。在處理原始值時,這種運算相當簡單,但涉及對象,任務就稍有點複雜。

ECMAScript 提供了兩套等性運算符:等號和非等號用於處理原始值,全等號和非全等號用於處理對象。

 

關於等性運算時的轉換問題:

關於ECMA的標籤語句:

關於ECMA的標籤語句:

 

關於ECMA的對象:

在Javascript語言體系中,不存在類(Class)的概念的,javascript中不是基於‘類’的,而是通過構造函數(constructor)和原型鏈(prototype chains)實現的。

什麼是構造函數?

構造函數,就是提供了一個生成對象的模板並描述對象的基本結構的函數。一個構造函數,可以生成多個對象,每個對象都有相同的結構。總的來說,構造函數就是對象的模板,對象就是構造函數的實例。

構造函數的特點有:

  • 構造函數的函數名首字母必須大寫。

  • 內部使用this對象,來指向將要生成的對象實例。

  • 使用new操作符來調用構造函數,並返回對象實例。

 

關於ECMA的 arguments對象:

arguments對象就是在函數調用過程中,函數在無需指定形參的情況下,函數內部可以通過arguments[INDEX]就可以訪問到傳入的實參,並且,利用該性質,還可以實現函數的重載模擬,即,可以傳入不同數量的參數。

關於ECMA內置對象

關於ECMA的prototype屬性:

關於ECMA對象的作用域:

ECMA只存在一種作用域,所有的對象的屬性和方法都是公有的

一般來說,用下劃線來提示其他開發者,該對象爲私有

例:

提示color屬性爲私有屬性

 

ECMA的靜態作用域:

ECMA沒有靜態作用域,但可以給函數不在其內部定義的情況下提供給其屬性和方法,例如:

alternate就是後加入的方法,並且支持調用

關於ECMA的對象廢除:

將對象指向null即可

如何理解ECMA中的關鍵字this:

它用在對象的方法中。關鍵字 this 總是指向調用該方法的對象

 

ECMAScript中主流的類或對象創建方式?

目前使用最廣泛的是混合的構造函數/原型方式,此外,

動態原型方法也很流行,在功能上與構造函數/原型方式等價。可以採用這兩種方式中的任何一種。不過不要單獨使用經典的構造函數或原型方式

下面分別介紹這兩種方式:

混合的構造函數/原型方式:

聯合使用構造函數和原型方式,就可像用其他程序設計語言一樣創建對象。這種概念非常簡單,即用構造函數定義對象的所有非函數屬性,用原型方式定義對象的函數屬性(方法)。結果是,所有函數都只創建一次,而每個對象都具有自己的對象屬性實例。

 

動態原型方法:

可以用prototype屬性來實現類似Java的函數重載效果

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章