js高級程序設計-讀書記錄 ch3

第三章 基本概念

3.1 語法

3.1.1 區分大小寫

3.1.2 標識符

指變量、函數、屬性的名字,或者函數的參數。,按照慣例使用camelcase。

3.1.3 註釋

C風格://&/**/

3.1.4 嚴格模式(可以理解成異常處理?)

在嚴格模式下,ECMA中的一些不確定的行爲將得到處理,而且對某些不安全的操作也會拋出錯誤

3.1.5 語句

以分號結尾,雖然沒有也有效。

3.2 關鍵字和保留字

3.3 變量

是鬆散型的,就是可以用來保存任何類型的數據。var message;

未初始化時會保存成“undefined”

不建議修改變量所保存值的類型,雖然有效。

省略var操作符可以定義全局變量,但是不推薦,在嚴格模式下會拋出錯誤。

3.4 數據類型 

5種簡單數據類型:Undefined, Null, Boolean, Number, String.

也可返回“object”,“function”

3.4.2 undefined類型

typeof操作符

用來檢測變量的數據類型。(是一個操作符而不是函數,所以不需要使用括號)

var message;

alert(typeof message);
alert(typeof age);//沒有被聲明,但是也會返回undefined
所以儘量顯式初始化變量吧,就可以知道被檢測的變量還沒有被聲明,而不是尚未初始化。

3.4.3 Null類型

Null值表示一個空對象指針。所以typeof會返回object

實際上,undefined是派生自null的,因此

alert(null==undefined);//true 但是==操作符出於比較目的會轉換操作數類型

只要意在保存對象的變量還沒有真正保存對象,就應該明確地讓該變量保存null值。

3.4.4 Boolean類型

是ECMA中用得最多的類型。=true/false

可以對任何數據類型的值調用Boolean()函數,而且總會返回一個Boolean值。

3.4.5 Number類型

最令人關注的數據類型。

十進制直接寫,八進制加個前導0(八進制在嚴格模式下無效),十六進制加個0x

1.浮點數值

如果某次結果得到了一個超出JAVASCRIPT數值範圍的值,那麼這個值將被自動轉換infinity,而且不能參與下一次的計算。可以使用isFinite函數判斷是否是無窮。

NaN即非數值是一個特殊的數值。isNaN,會先用valueOf將其轉換成數值。

有三個函數可以把非數值轉換爲數值:Number(可以用於任何數據類型), parseInte(), parseFloat()(後兩個轉換字符串)

Number(011)=11(前導零被吃掉),對空字符返回0

parseInt會依次解析字符直到遇到一個非數字字符。parseInt("22.5")=22;

ECMAScript允許parseInt實現把以0(不是0x或0X)開頭的字符串解析爲八進制或十進制數。也可以加入第二個參數指定進制。

3.4.6 String類型

任何字符串的長度都可以通過訪問其length屬性取得。

ECMAScript中的字符串是不可變的,一旦創建便不能再更改其值。要改變某個變量保存的字符串,首先要銷燬原來的字符串(???)但是可以用加號拼接?

toString()函數轉換成字符串,可以添加參數指定轉換成的進制數。在不知道要轉換的值時都是null或undefined可以使用轉型函數String(),它能加任何類型的值(+null+undefined)轉換爲字符串。比toString更有能力一點點。

3.4.7 Object類型

即是數據和功能的集合,用new創建。var o=new Object();

括號可省(如果不傳遞參數,但不推薦)。

一個重要思想:在ECMAScript中,Object類型是所有它的實例的基礎。

Object的每個實例都具有下列屬性和方法:

 ...constructor 構造函數^^

...hasOwnProperty(propertyName)用於檢查給定的屬性在當前對象實例中(而不是在實例的原型中)是否存在。參數必須爲字符串

...isPrototypeOf(Object) 用於檢查傳入的對象是否是另一個對象的原型

...propertyIsNumerable(propertyName)用於檢查給定的屬性是否能夠使用for-in語句來枚舉,參數得是字符串。

...toString() 返回對象的字符串表示

...valueOf() 通常與toString的返回值相同。


3.5 操作符

3.5.1 一元操作符

1.遞增和遞減操作符(和C一致)

前置先自增或自減再執行運算,後置先執行運算。

var o={valueOf : function(){return -1;}};

2.一元加和減操作符

一元減操作符主要用於表示負數。

3.5.2 位操作符

也有按位與或非

3.5.3 布爾操作符(skip)

!0=!false=!null=!NaN=true

邏輯與操作屬於短路操作,即如果第一個操作數能夠決定結果,那麼就不會再對第二個操作數求值。

例子:
var found = true;

var result = (found && someUndefinedVariable);//這裏會發生錯誤

alert(result);//這一行不會執行

另一個例子:
var found = false;
var result = (found && someUndefinedVariable);//不會發生錯誤

alert(result); //false

邏輯或也是短路操作符。如果第一個操作數的求值結果爲true,就不會對第二個操作數求值了。
一個例子:
var found = true;

var result = (found || someUndefinedVariable); //無錯

alert(result); //true

另一個例子:
var found = false;

var result = (found || someUndefinedVariable); //出錯

alert(result); //不會執行


可以利用邏輯或的這一行爲來避免爲變量賦值爲null或undefined,例如:
var myObject = preferredObject || backupObject;
變量preferredObject中包含優先賦給變量myObject的值,變值backupObject負責在preferredObject中不包含有效值的情況下提供後備值。如果p的值不是null,那麼就用它的值;如果是null,則將b的值賦給myObject。

3.5.4 乘性操作符

/得商%取模

在操作數爲非數值的情況下會執行自動的類型轉換(使用Number())。

如果一個Infinity與0相乘結果爲NaN,與非零相乘是±infinity

3.5.5 加性操作符

和字符串用+的時候,數字會被轉換成字符串

和加號不同的是,減法中一個操作數爲字符串時,先將該字符串轉換爲數字。

如果一個操作數是對象、數值或布爾值,則調用它們的toString()方法取得相應的字符串值,然後再應用前面關於字符串的規則。對於undefined和null,則分別調用String()函數並取得字符串undefined和null.

3.5.6 關係操作符

<, >, <=

在比較兩個字符串時,比較的是兩個字符串中對應位置的每個字符的字符編碼值。可以用.toLowerCase或.toUpperCase來轉換大小寫。

如果一個操作數是數值,則將另一個操作數轉換爲一個數值,然後執行數值比較。

var result="a"<3;//false,因爲“a”被轉換成了NaN

3.5.7 相等操作符

1.相等和不相等

==&!= 會先轉換操作數再比較

null和undefined是相等的。

2.全等和不全等

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

3.5.8 條件操作符

?: 如var max=(num1>num2)?num1:num2;

3.5.9 賦值操作符

num+=10;

3.5.10 逗號操作符

逗號操作符多用於聲明多個變量,但除此之外,逗號操作符還可以用於賦值。在用於賦值時,逗號操作符總會返回表達式中的最後一項。

3.6 語句

3.6.1 if語句

if (condition) statement1 else statement2

3.6.2 do-while語句

do {

    statement

}while(expression);

至少要執行一次。

3.6.3 while語句

while(expression){statement;}

3.6.4 for語句
使用while做不到的,for同樣做不到。

3.6.5 for-in語句

for(property in expression) statement

3.6.6 label語句

label:statement

3.6.7 break和continue (同C)

3.6.8 with語句

作用是將代碼的作用域設置到一個特定的對象中。語法如下:

with (expression) statement

相當於是把多個語句封裝成一個語句吧,但是性能不好,不建議使用。

3.6.9 switch(同C)

3.7 函數

function functionName(arg0, arg1...){ statements}

畢竟不區分變量類型。所有函數參數中也不需要像C中啥的要加上類型。

3.7.1 理解參數

ECMAScript不介意傳進來多少參數,甚至不傳遞參數,在函數體內可以通過arguments來訪問這個參數數組,從而獲得傳遞給這個函數的每一個參數,可以用length屬性來確定傳遞進來多少個參數。(可以利用length加if語句來實現重載功能,ECMAScript中沒有重載,如果兩個名字相同,後定義的有效)

function sayHi(){

alert("hello" + arguments[0]+arguments[1]);

}

sayHi("nico", "how are you");

說明了函數的一個重要特點:命名的參數只提供便利但不是必需的。

沒有傳遞值的命名參數將自動被賦予undefined值。

ECMAScript中的所有參數傳遞的都是值,不可能通過引用傳遞參數。

3.7.2 沒有重載

可以通過檢查傳入參數的類型和數量做出不同的反應,以模仿重載。




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