第三章 基本概念
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 沒有重載
可以通過檢查傳入參數的類型和數量做出不同的反應,以模仿重載。