3.1 語法
3.1.1 區分大小寫
test和Test表示兩個不同的變量
3.1.2 標識符
標識符:指變量,函數,屬性的名字或者函數的參數
標識符命名規則:
1.第一個字母必須是一個字母,下劃線(_),或一個美元符號$
2.其他字符可以是字母,下劃線,美元符號或數字
3.不可以使用關鍵字作為標識符
4。推薦使用駝峰命名法,比如:changeColor
3.1.3 注釋
//單行注釋
/*
* 多行注釋
*
*/
3.1.4 嚴格模式
ECMAScript5 引入了嚴格模式概念
在頂部添加代碼:'user strict';
3.1.5 語句:
不能省略語句結尾分號原因:
- 如果省略,將會由解析器確定語句的結尾,
- 加上分號,會避免很多錯誤(例如不完整的輸入)
- 代碼結尾沒有分號,會導致壓縮錯誤;
- 提高性能,解析器不用在推測哪里插入分號耗費時間
if (test)
alert(test) //有效,但容易出錯,不推薦使用
if (test) {
alert(test) //推薦使用
}
3.2 關鍵字和保留字
關鍵字和保留字都不能作為標識符或者屬性
3.3 變量
js中每個變量僅僅是一個用來保存值的占位符而已
3.4 數據類型
3.4.1 typeof操作符
typeof是一個操作符,而不是函數
用來檢測基本類型變量的數據類型
typeof 15 ==> number
3.4.2 Undefined 類型
//聲明了未初始化的message,和未聲明的age,都返回undefined
var message;
alert(message) ==> "undefined";
alert(age) ==> "undefined";
3.4.3 Null類型
typeof null ==> 'object' ==> 從邏輯上講,null表示一個空對象指針,所以會返回object
null 和 undefined 關系:
- undefined 派生自null ,所以 null == undefined ==> true;
- 無論什么情況下,都沒有必要把一個變量的值顯式的設置為undefined;
- 如果定義的變量準備在將來用于保存對象,那么最好將該變量初始化為null而不是其他值;
3.4.4 Boolean 類型
Boolean類型的字面值true和false是區分大小寫的,也就是說True和False都不是Boolean值,只是標識符;
3.4.5 Number類型
八進制字面量在嚴格模式下是無效的,會導致報錯
- 浮點數值
浮點數:該數值中必須包含一個小數點,并且小數點后面必須至少有一位數字
var floatNum = .1 //有效,但不推薦
浮點數存在的問題:
0.1 + 0.2 ==> 0.30000000000000004
解決方案: 使用toFixed() 來保留小數點后幾位
這是基于IEEE754數值的浮點計算通病,其他語言也會出現這樣的問題
if (a + b == 0.3){ //這樣的判斷在浮點數下,會導致錯誤
alert('you got 0.3')
}
數值范圍:
Infinity和-InfinityNaN
非數值,是一個特殊的數值,用來表示一個本來要返回數值的操作數未返回數值的情況(防止錯誤)
var aa = 'ww';
0/aa ==> NaN
js中,任何數值除以非數值會返回NaN,因此不會影響代碼執行
NaN擁有兩個非同尋常的特點:
- 任何涉及NaN的操作,都會返回NaN
- NaN與任何值都不相等,包括自己;
isNaN() 檢測是否是數值有問題:
isNaN('') ==> false
isNaN()把空字符串或空格當作0處理
- 數值轉換
有三個函數可以把非數值轉換為數值
Number() ==> 用于任何數據類型
由于Number在轉換字符串時比較復雜而且不夠合理,因此在處理整數上常用
parseInt()函數;
parseInt()和parseFloat() ==> 用于把字符串轉為數值
parseInt原理:
parseInt()函數在轉換字符串時,更多的是看其是否符合數值模式。會忽略字符串前面的空格,直至找到第一個非空字符。如果第一個字符不是
數字或者負號,parseInt()會返回NaN。也就是說,parseInt()轉換空字符串會返回NaN,如果第一個是數字字符,parseInt()會繼續解析第二個字符,
直到解析完所有后續字符或者遇到一個非數字字符
例如:
parseInt('123blue') ==> 123
parseInt('') ==> NaN
parseInt(22.5) ==> 22
parseInt接收第二個參數,表示轉換時使用的基數
parseInt(12,10) ==> 表示用十進制來解析
不指定基數意味著讓parseInt()自己決定如何解析輸入的字符串,為了避免錯誤的解析,建議無論什么情況下都明確指定基數;
parseFloat()和parseInt()區別:
- 都是字符串中第一個小數點有效,第二個無效
parseInt('22.34.45') ==》 22
parseFloat('22.34.45') ==> 22.34
2.parseFloat() 始終會忽略前導的0,且parseFloat()只解析十進制的值
parseFloat('1234blue') ==》 1234
parseFloat('oxA') ==》 0
parseFloat('22.5') ==> 22.5
parseFloat('22.34.5') ==> 22.34
parseFloat('0908.5') ==> 908.5
3.4.6 String類型
1.轉義字符:
\n 換行 ==》 'he said, \n'
\' 單引號 ==》 'he said,\'hey.\''
\" 雙引號 ==》 'he said,\"hey.\''
2.轉換為字符串
toString() ==> var num = 123; num.toString() ==> '123'
toString()問題:null和undefined沒有這個方法,調用時會報錯
如果不確定需要轉換的字符串是不是null和undefined,則建議使用String()
String()詳解:
- 如果值有toString(),則調用;
- 如果值為null,則返回null;
- 如果值為undefined,則返回undefined;
3.4.7 Object 類型
Object類型所具有的任何屬性和方法也同樣存在于更具體的對象中
3.5 操作符
3.5.1 一元操作符
只能操作一個值的操作符叫一元操作符
- 遞增和遞減操作符
前置型:變量的值在語句被求值以前改變
++age == age = age + 1;
--age == age = age - 1;
后置型:遞增遞減操作是在語句被求值之后才執行
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2 ==> 22;
var num4 = num1 + num2 ==> 21
- 一元加和減操作符
一元加操作符
+'01' ==> 1
+'1.1' ==> 1.1
+'z' ==> NaN
+false ==> 0
一元減操作符
-‘01’ ==》 -1
-‘1.1’ ==》 -1.1
-‘z’ ==> NaN
-false ==> -0
3.5.2 布爾操作符
- 邏輯非
!{} ==> false
!{name:'wang'} ==> false
邏輯與
&&
邏輯與操作符屬于短路操作,如果第一個操作數能決定結果,那么就不會再對第二個操作數求值邏輯或
||
邏輯或也是短路操作;
3.5.3 乘性操作符
- 乘法
var result = 44 * 45;
- 除法
var result = 66 / 11;
3.求模(求余數)
var result = 26 % 5;
3.5.4 加法操作符
- 加法
var result = 66 + 1;
- 減法
var result = 66 - 1;
3.5.5 關系操作符
< > <= >=
3.5.6 相等操作符
- 相等和不相等
== !=
null == undefined ==> true
NaN == NaN ==》 true
true == 1 ==> true
true == 2 ==> false
- 全等和不全等
=== !==
3.5.7 條件操作符
var flag = this.value ? true : false;
3.5.8 賦值操作符
var num = 10;
num = num + 10;
可轉換為:
var num = 10;
num += 10;
類似的還有:
num *= 10 == num = num * 10;
num /= 10 == num = num / 10;
num %= 10 == num = num % 10;
num -= 10 == num = num - 10;
3.5.9 逗號操作符
var num,age,name;
3.6 語句
3.6.1 if語句
if( condition ){ // ECMAScript會自動調用Boolean()轉換函數將這個表達式結果轉換為一個布爾值
//
}
3.6.2 do-while 語句
后測試循環語句,只有在循環體中代碼執行之后,才會測試出口條件
var i = 0;
do {
i += 2
} while ( i < 10 );
3.6.3 while 語句
前測試循環語句,在循環體內代碼被執行之前,就會對出口條件求值;
var i = 0;
while( i < 10 ){
i += 2;
}
3.6.4 for語句
前測試循環語句
for(;;){ //無限循環,會導致瀏覽器崩潰,可以試試;
console.log(11)
}
3.6.5 for in 語句
用來枚舉對象的屬性
如果要迭代的對象是null, undefined,則會終止循環
所以在使用for in之前,要確保該對象不是null或undefined
3.6.6 break 和 continue 語句
break: 立即退出循環,強制繼續執行循環后的語句;
continue: 立即退出循環,從循環的頂部繼續執行;
3.6.7 with語句
with語句作用主要是將代碼的作用域設置到一個特定的對象中,定義with語句主要是為了簡化多次編寫同一個對象的工作;
var qs = location.search.substring(1);
var hostName = location.hostname;
var url = location.href;
使用with語句改寫:
with(location){
var qs = search.substring(1);
var hostName = hostname;
var url = href;
}
缺點:嚴格模式下不允許使用with語句,否則將會視為語法錯誤
一般情況下,作用域鏈只會被with和catch語句影響。當使創建用with的時候,函數會創建一個新的活動對象,推到最前端,該對象就是with的對象。這就意味著所有的局部變量都處于第二個作用域鏈對象中去了,這也就是為什么要避免使用with的原因。
由于大量使用with語句會導致性能下降,同時也會造成調試代碼困難,因此不建議使用with
3.6.8 switch語句
省略break關鍵字,會導致執行完當前case后,繼續執行下一個case
3.7 函數
3.7.1 理解參數
ECMAScript不介意傳遞進來多少個參數,也不在乎傳進來參數是什么數據類型。
在函數體內,可以通過arguments對象來訪問這個參數數組,從而獲取傳遞給函數的每一個參數
獲取函數的參數數量:arguments.length;
function nums(num1,num2) {
console.log(arguments)
}
nums(1,2,3)
可以看到打印結果:
3.7.2 沒有重載
其他語言(Java)中,可以為一個函數編寫兩個定義,只要這兩個定義的簽名(接受的參數的類型和數量)不同即可,ECMAScript函數沒有簽名,
因為其參數是由包含零或多個值的數組來表示的,而沒有函數簽名,真正的重載是不可能做到的;
如果在ECMAScript中定義了兩個名字相同的函數,則該名字只屬于后定義的函數;