3.1 語法
3.1.1 區(qū)分大小寫
test和Test表示兩個(gè)不同的變量
3.1.2 標(biāo)識(shí)符
標(biāo)識(shí)符:指變量商膊,函數(shù),屬性的名字或者函數(shù)的參數(shù)
標(biāo)識(shí)符命名規(guī)則:
1.第一個(gè)字母必須是一個(gè)字母裂七,下劃線(_),或一個(gè)美元符號$
2.其他字符可以是字母鹃操,下劃線,美元符號或數(shù)字
3.不可以使用關(guān)鍵字作為標(biāo)識(shí)符
4春哨。推薦使用駝峰命名法荆隘,比如:changeColor
3.1.3 注釋
//單行注釋
/*
* 多行注釋
*
*/
3.1.4 嚴(yán)格模式
ECMAScript5 引入了嚴(yán)格模式概念
在頂部添加代碼:'user strict';
3.1.5 語句:
不能省略語句結(jié)尾分號原因:
- 如果省略,將會(huì)由解析器確定語句的結(jié)尾赴背,
- 加上分號椰拒,會(huì)避免很多錯(cuò)誤(例如不完整的輸入)
- 代碼結(jié)尾沒有分號,會(huì)導(dǎo)致壓縮錯(cuò)誤凰荚;
- 提高性能燃观,解析器不用在推測哪里插入分號耗費(fèi)時(shí)間
if (test)
alert(test) //有效,但容易出錯(cuò)便瑟,不推薦使用
if (test) {
alert(test) //推薦使用
}
3.2 關(guān)鍵字和保留字
關(guān)鍵字和保留字都不能作為標(biāo)識(shí)符或者屬性
3.3 變量
js中每個(gè)變量僅僅是一個(gè)用來保存值的占位符而已
3.4 數(shù)據(jù)類型
3.4.1 typeof操作符
typeof是一個(gè)操作符缆毁,而不是函數(shù)
用來檢測基本類型變量的數(shù)據(jù)類型
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表示一個(gè)空對象指針,所以會(huì)返回object
null 和 undefined 關(guān)系:
- undefined 派生自null ,所以 null == undefined ==> true;
- 無論什么情況下践啄,都沒有必要把一個(gè)變量的值顯式的設(shè)置為undefined;
- 如果定義的變量準(zhǔn)備在將來用于保存對象浇雹,那么最好將該變量初始化為null而不是其他值;
3.4.4 Boolean 類型
Boolean類型的字面值true和false是區(qū)分大小寫的,也就是說True和False都不是Boolean值屿讽,只是標(biāo)識(shí)符;
3.4.5 Number類型
八進(jìn)制字面量在嚴(yán)格模式下是無效的昭灵,會(huì)導(dǎo)致報(bào)錯(cuò)
- 浮點(diǎn)數(shù)值
浮點(diǎn)數(shù):該數(shù)值中必須包含一個(gè)小數(shù)點(diǎn),并且小數(shù)點(diǎn)后面必須至少有一位數(shù)字
var floatNum = .1 //有效伐谈,但不推薦
浮點(diǎn)數(shù)存在的問題:
0.1 + 0.2 ==> 0.30000000000000004
解決方案: 使用toFixed() 來保留小數(shù)點(diǎn)后幾位
這是基于IEEE754數(shù)值的浮點(diǎn)計(jì)算通病烂完,其他語言也會(huì)出現(xiàn)這樣的問題
if (a + b == 0.3){ //這樣的判斷在浮點(diǎn)數(shù)下,會(huì)導(dǎo)致錯(cuò)誤
alert('you got 0.3')
}
數(shù)值范圍:
Infinity和-InfinityNaN
非數(shù)值衩婚,是一個(gè)特殊的數(shù)值窜护,用來表示一個(gè)本來要返回?cái)?shù)值的操作數(shù)未返回?cái)?shù)值的情況(防止錯(cuò)誤)
var aa = 'ww';
0/aa ==> NaN
js中,任何數(shù)值除以非數(shù)值會(huì)返回NaN非春,因此不會(huì)影響代碼執(zhí)行
NaN擁有兩個(gè)非同尋常的特點(diǎn):
- 任何涉及NaN的操作柱徙,都會(huì)返回NaN
- NaN與任何值都不相等,包括自己奇昙;
isNaN() 檢測是否是數(shù)值有問題:
isNaN('') ==> false
isNaN()把空字符串或空格當(dāng)作0處理
- 數(shù)值轉(zhuǎn)換
有三個(gè)函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值
Number() ==> 用于任何數(shù)據(jù)類型
由于Number在轉(zhuǎn)換字符串時(shí)比較復(fù)雜而且不夠合理护侮,因此在處理整數(shù)上常用
parseInt()函數(shù);
parseInt()和parseFloat() ==> 用于把字符串轉(zhuǎn)為數(shù)值
parseInt原理:
parseInt()函數(shù)在轉(zhuǎn)換字符串時(shí),更多的是看其是否符合數(shù)值模式储耐。會(huì)忽略字符串前面的空格羊初,直至找到第一個(gè)非空字符。如果第一個(gè)字符不是
數(shù)字或者負(fù)號,parseInt()會(huì)返回NaN长赞。也就是說晦攒,parseInt()轉(zhuǎn)換空字符串會(huì)返回NaN,如果第一個(gè)是數(shù)字字符得哆,parseInt()會(huì)繼續(xù)解析第二個(gè)字符脯颜,
直到解析完所有后續(xù)字符或者遇到一個(gè)非數(shù)字字符
例如:
parseInt('123blue') ==> 123
parseInt('') ==> NaN
parseInt(22.5) ==> 22
parseInt接收第二個(gè)參數(shù),表示轉(zhuǎn)換時(shí)使用的基數(shù)
parseInt(12,10) ==> 表示用十進(jìn)制來解析
不指定基數(shù)意味著讓parseInt()自己決定如何解析輸入的字符串贩据,為了避免錯(cuò)誤的解析栋操,建議無論什么情況下都明確指定基數(shù);
parseFloat()和parseInt()區(qū)別:
- 都是字符串中第一個(gè)小數(shù)點(diǎn)有效饱亮,第二個(gè)無效
parseInt('22.34.45') ==》 22
parseFloat('22.34.45') ==> 22.34
2.parseFloat() 始終會(huì)忽略前導(dǎo)的0矾芙,且parseFloat()只解析十進(jìn)制的值
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.轉(zhuǎn)義字符:
\n 換行 ==》 'he said, \n'
\' 單引號 ==》 'he said,\'hey.\''
\" 雙引號 ==》 'he said,\"hey.\''
2.轉(zhuǎn)換為字符串
toString() ==> var num = 123; num.toString() ==> '123'
toString()問題:null和undefined沒有這個(gè)方法,調(diào)用時(shí)會(huì)報(bào)錯(cuò)
如果不確定需要轉(zhuǎn)換的字符串是不是null和undefined近上,則建議使用String()
String()詳解:
- 如果值有toString(),則調(diào)用剔宪;
- 如果值為null,則返回null戈锻;
- 如果值為undefined歼跟,則返回undefined;
3.4.7 Object 類型
Object類型所具有的任何屬性和方法也同樣存在于更具體的對象中
3.5 操作符
3.5.1 一元操作符
只能操作一個(gè)值的操作符叫一元操作符
- 遞增和遞減操作符
前置型:變量的值在語句被求值以前改變
++age == age = age + 1;
--age == age = age - 1;
后置型:遞增遞減操作是在語句被求值之后才執(zhí)行
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
邏輯與
&&
邏輯與操作符屬于短路操作格遭,如果第一個(gè)操作數(shù)能決定結(jié)果哈街,那么就不會(huì)再對第二個(gè)操作數(shù)求值邏輯或
||
邏輯或也是短路操作;
3.5.3 乘性操作符
- 乘法
var result = 44 * 45;
- 除法
var result = 66 / 11;
3.求模(求余數(shù))
var result = 26 % 5;
3.5.4 加法操作符
- 加法
var result = 66 + 1;
- 減法
var result = 66 - 1;
3.5.5 關(guān)系操作符
< > <= >=
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;
可轉(zhuǎn)換為:
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會(huì)自動(dòng)調(diào)用Boolean()轉(zhuǎn)換函數(shù)將這個(gè)表達(dá)式結(jié)果轉(zhuǎn)換為一個(gè)布爾值
//
}
3.6.2 do-while 語句
后測試循環(huán)語句拒迅,只有在循環(huán)體中代碼執(zhí)行之后骚秦,才會(huì)測試出口條件
var i = 0;
do {
i += 2
} while ( i < 10 );
3.6.3 while 語句
前測試循環(huán)語句,在循環(huán)體內(nèi)代碼被執(zhí)行之前璧微,就會(huì)對出口條件求值作箍;
var i = 0;
while( i < 10 ){
i += 2;
}
3.6.4 for語句
前測試循環(huán)語句
for(;;){ //無限循環(huán),會(huì)導(dǎo)致瀏覽器崩潰前硫,可以試試胞得;
console.log(11)
}
3.6.5 for in 語句
用來枚舉對象的屬性
如果要迭代的對象是null, undefined,則會(huì)終止循環(huán)
所以在使用for in之前屹电,要確保該對象不是null或undefined
3.6.6 break 和 continue 語句
break: 立即退出循環(huán)阶剑,強(qiáng)制繼續(xù)執(zhí)行循環(huán)后的語句;
continue: 立即退出循環(huán)危号,從循環(huán)的頂部繼續(xù)執(zhí)行牧愁;
3.6.7 with語句
with語句作用主要是將代碼的作用域設(shè)置到一個(gè)特定的對象中,定義with語句主要是為了簡化多次編寫同一個(gè)對象的工作外莲;
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;
}
缺點(diǎn):嚴(yán)格模式下不允許使用with語句猪半,否則將會(huì)視為語法錯(cuò)誤
一般情況下,作用域鏈只會(huì)被with和catch語句影響。當(dāng)使創(chuàng)建用with的時(shí)候磨确,函數(shù)會(huì)創(chuàng)建一個(gè)新的活動(dòng)對象沽甥,推到最前端,該對象就是with的對象俐填。這就意味著所有的局部變量都處于第二個(gè)作用域鏈對象中去了安接,這也就是為什么要避免使用with的原因。
由于大量使用with語句會(huì)導(dǎo)致性能下降英融,同時(shí)也會(huì)造成調(diào)試代碼困難,因此不建議使用with
3.6.8 switch語句
省略break關(guān)鍵字,會(huì)導(dǎo)致執(zhí)行完當(dāng)前case后歇式,繼續(xù)執(zhí)行下一個(gè)case
3.7 函數(shù)
3.7.1 理解參數(shù)
ECMAScript不介意傳遞進(jìn)來多少個(gè)參數(shù)驶悟,也不在乎傳進(jìn)來參數(shù)是什么數(shù)據(jù)類型。
在函數(shù)體內(nèi)材失,可以通過arguments對象來訪問這個(gè)參數(shù)數(shù)組痕鳍,從而獲取傳遞給函數(shù)的每一個(gè)參數(shù)
獲取函數(shù)的參數(shù)數(shù)量:arguments.length;
function nums(num1,num2) {
console.log(arguments)
}
nums(1,2,3)
可以看到打印結(jié)果:
3.7.2 沒有重載
其他語言(Java)中龙巨,可以為一個(gè)函數(shù)編寫兩個(gè)定義笼呆,只要這兩個(gè)定義的簽名(接受的參數(shù)的類型和數(shù)量)不同即可,ECMAScript函數(shù)沒有簽名旨别,
因?yàn)槠鋮?shù)是由包含零或多個(gè)值的數(shù)組來表示的诗赌,而沒有函數(shù)簽名,真正的重載是不可能做到的秸弛;
如果在ECMAScript中定義了兩個(gè)名字相同的函數(shù)铭若,則該名字只屬于后定義的函數(shù);