本筆記彙總了作者認爲“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類型
該類型只有兩個字面值:true
和false
。
雖然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 } |