JavaScript高級程序設計(讀書筆記)(三)

本筆記彙總了作者認爲“JavaScript高級程序設計”這本書的前七章知識重點,僅供參考。

第三章 基本概念

JavaScript的核心語言特性在ECMA-262中是以名爲ECMAScript的僞語言的形式來定義的。ECMAScript中包含了所有基本的語法、操作符、數據類型以及完成基本的計算任務所必須的對象,但沒有對取得輸入和產生輸出的機製作出規定。理解ECMAScript及其紛繁複雜的各種細節,是理解其在Web瀏覽器中的實現——JavaScript的關鍵。目前大多數實現所遵循的都是ECMA-262第3版,但很多都已經着手開始實現第5版了。以下簡要總結了ECMAScript種基本的要素。

  • ECMAScript中的基本數據類型包括Undefined、Null、Boolean、Number和String。
  • 與其他語言不同,ECMAScript沒有爲整數和浮點數值分別定義不同的數據類型,Number類型可用於表示所有數值。
  • ECMAScript中也有一種複雜的數據結構,即Object類型,該類型是這門語言中所有對象的基礎類型。
  • 嚴格模式爲這門語言中容易出錯的地方施加了限制。
  • ECMAScript提供了很多與C及其他類C語言中相同的基本操作符,包括算數操作符、布爾操作符、關係操作符、相等操作符及賦值操作符等。
  • ECMAScript從其他語言中借鑑了許多流控制語句,例如if語句、for語句和switch語句等。

ECMAScript中的函數與其他語言中的函數有諸多不同之處。

  • 無須指定函數的返回值,因爲任何ECMAScript函數都可以在任何時候返回任何值。
  • 實際上,未指定返回值的函數返回的是一個特殊的undefined值。
  • ECMAScript中也沒有函數簽名的概念,因爲其函數參數是以一個包含零或多個值的數組的形式傳遞的。
  • 可以向ECMAScript函數傳遞任意數量的參數,並且可以通過arguments對象來訪問這些參數。
  • 由於不存在函數簽名的特性,ECMAScript函數不能重載。

語法:

ECMAScript的一切(如變量、函數名和操作符)都區分大小寫。ECMAScript標識符采用駝峯式大小寫格式,標識符是按照下列規則組合起來的一或多個字符:

  • 第一個字符必須是一個字母、下劃線(_)或一個美元符號($);
  • 其他字符可以是字母、下劃線、美元符號或數字。

ECMAScript採用C風格註釋,包括單行註釋和塊級註釋,如下所示:

//  單行註釋

/*
 *  這是一個多行
 * (塊級)註釋
 * /

ECMAScript5引入了嚴格模式(strict mode)的概念。嚴格模式下,ECMAScript3中的一些不確定的行爲將得到處理,而且對某些不安全的操作也會拋出錯誤。要在整個腳本中啓用嚴格模式,在頂部添加"use strict",在函數內部上方包含這條編譯指示,也可以制定函數在嚴格模式下執行:

function doSomething(){
    "use strict";
    //函數體
}

變量

ECMAScript的變量是鬆散類型的,使用var操作符定義變量,省略var操作符會創建一個全局變量。

function test(){
    message = "hi";    //  全局變量
}
test();
alert(message);    //  "hi"

數據類型

ECMAScript中有5中簡單數據類型:Undefined、Null、Boolean、Number和String。對一個值使用typeof操作符可以檢測給定變量的數據類型。

Undefined類型
Undefined只有一個值,即特殊的undefined。使用var生命單位對其加以初始化時,變量的值就是undefined。對未聲明的變量執行typeof操作符也會返回undefined

注意:即便未初始化的變量會自動被賦予undefined值,但顯式地初始化變量依然是明智的選擇。如果能夠做到這一點,那麼當typeof操作符返回"undefined"值時,我們就知道被檢測的變量還沒有被聲明,而不是尚未初始化。

Null類型
Null類型是第二個只有一個值的數據類型,這個特殊值時null

Boolean類型
該類型只有兩個字面值:truefalse
雖然Boolean類型字面值只有兩個,但ECMAScript中所有類型的值都有與這兩個Boolean值等價的值。要將一個值轉換爲其對應的Boolean值,可以調用轉型函數Boolean(),如下例所示:

var message = "Hello world!";
var messageAsBoolean = Boolean(message);

下滿給出各數據類型及其轉換的規則:

數據類型 轉換爲true的值 轉換爲false的值
Boolean true false
String 任何非空字符串 “”(空字符串)
Number 任何非零數字值(包括無窮大) 0和NaN(參見本章後面有關NaN的內容)
Object 任何對象 null
Undefined n/a undefined

Number類型

這種類型使用IEEE754格式來表示整數和浮點數值。
ECMAScript並不能保存世界上所有的數值,它能夠表示的最小數值保存在Number.MIN_VALUE中——在大多數瀏覽器中,這個值時5e-324;對應的最大數值保存在Number.MAX_VALUE中——在大多數瀏覽器中,這個值是1.7976931348623157e+308。如果計算結果超出,正的被轉爲Infinity,負的被轉爲-Infinity。想確定一個數是不是有窮的,可以使用isFinity()函數。

NaN

NaN,即非數值(Not a Number)是一個特殊的數值,這個數值用於表示一個本來要返回數值的操作數未返回數值的情況(這樣就不會拋出錯誤了)。例如,任何數值除以0會返回NaN。NaN有兩個非同尋常的特點,任何涉及NaN的操作(例如NaN/10)都會返回NaN。其次,NaN與任何值都不相等,包括NaN本身。可以用isNaN()確定這個參數是否“不是數值”。isNaN()在接收到一個值後,會嘗試將這個值轉換爲數值。某些不是數值得值會直接轉換爲數值,例如字符串“10”或Boolean值。而任何不能被轉換爲數值的值都會導致這個函數返回true。例如:

alert(isNaN(NaN));              //true
alert(isNaN(10));               //false(10是一個數值)
alert(isNaN("10"));             //false(可以被轉換成數值10)
alert(isNaN("blue"));           //false(不能被轉換成數值)
alert(isNaN(true));             //false(可以被轉換成數值1)

有三個函數可以把非數值轉換爲數值:Number()parseInt()parseFloat()。第一個函數,即轉型函數Number()可以用於任何數據類型,而另兩個則專門用於把字符串轉換成數值。

String類型

String類型用於表示由零或多個16位Unicode字符組成的字符序列,即字符串。字符串可以由雙引號(”)或單引號(’)表示,兩者等價。ECMAScript中的字符串是不可變的,也就是說,字符串一旦創建,它們的值就不能改變。要改變某個變量保存的字符串,首先要銷燬原來的字符串,然後再用另一個包含新值的字符串填充該變量。
任何字符串的長度都可以通過訪問其length屬性取得。
把一個值轉換爲一個字符串有兩種方式。一種是使用幾乎每個值都有的toString()方法,在調用數值的toString()方法時,可以傳遞一個參數:輸出數值的基數;在不知道要轉換的值是不是null或undefined的情況下,還可以使用轉型函數String()

Object類型

ECMAScript中的對象其實就是一組數據和功能的集合。對象可以通過執行new操作符後跟要創建的對象類型的名稱來創建。Object類型是所有它的實例的基礎,Object的每個實例都具有下列屬性和方法。

  • constructor:保存着用於創建當前對象的函數。對於前面的例子而言,構造函數(constructor)就是Object()
  • hasOwnProperty(propertyName):用於檢測給定的屬性在當前對象實例中(而不是在實例的原型中)是否存在。其中,作爲參數的屬性名(propertyName)必須以字符串形式指定(例如:o.hasOwnProperty("name"))。
  • isPrototypeOf(object):用於檢查傳入的對象是否是傳入對象的原型(第5章將討論原型)。
  • propertyIsEnumerable(propertyName):用於檢查給定的屬性是否能夠使用for-in語句(本章後面將會討論)來枚舉。與hasOwnProperty()方法一樣,作爲參數的屬性名必須以字符串形式指定。
  • toLocaleString():返回對象的字符串表示,該字符串與執行環境的地區對應。
  • toString():返回對象的字符串表示。
  • valueOf():返回對象的字符串、數值或布爾值表示。通常與toString()方法的返回值相同。

操作符

名稱 操作符 例子
一元操作符
遞增操作符 ++ var age=29;++age; //age爲30
遞減操作符 var age=29;--age; //age爲28
一元加操作符 + var b=false;b=+b; //變成了數值0
一元減操作符 - var b=false;b=-b; //變成了數值0
位操作符
按位非 NOT(~) var num1=25;var num2=~num1;alert(num2); //-26
按位與 AND(&) var result=25 & 3;alert(result);//1
按位或 OR(|) var result=25 | 3;alert(result);//27
按位異或 XOR(^) var result=25 ^ 3;alert(result);//26
左移 << var oldValue=2;var newValue=oldValue << 5;//64
有符號的右移 >> var oldValue=64;var newValue=oldValue >> 5;//2
無符號的右移 >>> var oldValue=-64;var newValue=oldValue >>> 5;//134217726
布爾操作符
邏輯非 ! alert(!false);//true
邏輯與 && var result=true && false;//false
邏輯或 || var found=true;var result=(found || someUndefinedVariable);//true
乘性操作符(略)
加性操作符(略)
關係操作符(略)
條件操作符(略)
賦值操作符(略)
逗號操作符(略)

相等操作符

ECMAScript中的相等操作符由兩個等於號(==)表示,不等操作符右歎號後跟等於號(!=)表示。
在轉換不同的數據類型時,相等和不相等操作符遵循下列基本規則:

  • 如果有一個操作數是布爾值,則在比較相等性之前先將其轉換爲數值——false轉換爲0,而true轉換爲1;
  • 如果一個操作數是字符串,另一個操作數是數值,在比較相等性之前先將字符串轉爲數值;
  • 如果一個操作數是對象,另一個操作數不是,則調用對象的valueOf()方法,用得到的基本類型值按照前面的規則進行比較;

這兩個操作符在進行比較時則要遵循下列規則。

  • null和undefined是相等的。
  • 要比較相等性之前,不能將null和undefined轉換成其他任何值。
  • 如果有一個操作數是NaN,則相等操作符返回false,而不相等操作符返回true。重要提示:即使兩個操作數都是NaN,結果不變。
  • 如果兩個操作數都是對象,則比較他們是不是同一個對象。如果兩個操作數都指向同一個對象,則相等操作符返回true;否則,返回false。

除了在比較之前不轉換操作數之外,全等和不全等操作符與相等和不相等操作符沒有什麼區別。全等操作符(===),不全等操作符(!==)。

由於相等和不相等操作符存在類型轉換問題,而爲了保持代碼中數據類型的完整性,推薦使用全等和不全等操作符。


語句

語句 語法
if語句 if (condition) statement1 else statement2
do-while語句 do {
  statement
} while (expression);
while語句 while(expression) statement
for語句 for (initialization; expression; post-loop-expression) statement
for-in語句 for (property in expression) statement
label語句 label:statement
break和continue語句 break語句會立即退出循環,強制繼續執行循環後面的語句。而continue語句雖然也是立即退出循環,但退出循環後會從循環的頂部繼續執行
with語句 with語句的作用是將代碼的作用域設置到一個特定的對象中。with (expression) statement;
switch語句 switch (expression) {
 case value: statement
  break;
 case value: statement
  break;
 case value: statement
  break;
 case value: statement
  break;
 default: statement
}

函數(略)

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