本章內容:
- 簡介
- 定義
- 註釋
- 引入文件
- 變量
- 運算符
- 算術運算符
- 比較運算符
- 邏輯運算符
- 數據類型
-
- 數字
- 字符串
- 布爾類型
- 數組
- Math
- 語句
-
- 條件語句(if、switch)
- 循環語句(for、for in、while、do-while)
- label語句
- 異常處理
- 函數
-
- 定義函數3種方式
- 函數參數(arguments)
- 作用域與作用鏈
- 閉包
- 面向對象(特性,構造模式,原型模式prototype)
- prototype 驗證方法(isPrototypeOf、hasOwnProperty、in)
- 其它
-
- 序列化
- 轉義
- eval
- 正則表達式
- 時間處理
簡介
定義
JavaScript是一門動態弱類型的解釋型編程語言,增強頁面動態效果,實現頁面與用戶之間的實時動態的交互。
javascript是由三部分組成:ECMAScript、DOM、BOM
- ECMAScript由ECMA-262定義,提供核心語言功能(ECMA是歐洲計算機製造商協會)
- DOM(Document Object Model)文檔對象模型,提供訪問和操作網頁內容的方法和接口
- BOM(Browser Object Model)瀏覽器對象模型,提供與瀏覽器交互的方法和接口
註釋
JavaScript中代碼註釋:
- 單行 //
- 多行 /* */
引入文件
1. 引入外部文件
1
|
< script type"text/javascript"
src="JS文件"></ script > |
2. 存放在HTML的<head>或<body>中
1
2
3
|
< script type"text/javascript"> Js代碼內容 </ script > |
- HTML的head中
- HTML的body代碼塊底部(推薦)
3. 爲什麼要放在<body>代碼塊底部?
- HTML代碼從上到下執行,先加載CSS,避免html出現無樣式狀態;
- 將JavaScript代碼塊放在<body>最後,可以讓網頁儘快的呈現給用戶,減少瀏覽者的等待時間,避免因爲JS代碼塊阻塞網頁的呈現。
變量
需要注意的是:局部變量必須以 var 開頭申明,如果不寫 var 則爲全局變量
1
2
3
4
5
6
7
8
9
10
11
12
13
|
< script type="text/javascript"> //
全局變量 name
= 'nick'; function
func(){ //
局部變量 var
age = 18; //
全局變量 gender
= "man" } </ script > |
注:需要注意變量提升,就是把變量位置放到函數體的最上方
運算符
1. 算術運算符
一元算術 | |
+ 一元加,數值不會產生影響 | 對非數值應用一元加運算時,會調用Number()轉型函數對這個值進行轉換 |
- 一元減,轉換爲負數 | ~ |
++ 遞增1 | 通過Number()轉型爲數字,再加1,再重新賦值給操作數值 |
-- 遞減1 | ~ |
二元算術 | |
+ 加法 | |
- 減法 | |
* 乘法 | |
/ 除法 | |
% 取模 |
2. 比較運算符
=== 嚴格運算符 | 比較過程沒有任何類型轉換 |
!== 嚴格運算符 | ===的結果取反 |
== 相等運算符 | 如果兩個操作值不是同一類型,相等運算符會嘗試進行一些類型轉換,然後再進行比較 |
!= 不相等運算符 | ==的結果取反 |
> 大於運算符 | |
>= 大於等於運算符 | |
< 小於運算符 | |
<= 小於等於運算符 |
3. 邏輯運算符
! 非(兩個!!表示Boolean()轉型函數) |
返回一個布爾值 |
&& 與 | 兩個操作都爲true時返回true,否則返回false(返回值不一定是布爾值),可以多個連用(..&&..&&..) |
|| 或 | 兩個操作都是false時返回false,否則返回true(返回值不一定是布爾值),可以多個連用(..||..||..) |
1
2
3
4
5
6
7
8
9
10
11
|
//七個假值: console.log(!!undefined);//false console.log(!!null);//false console.log(!!0);//false console.log(!!-0);//false console.log(!!NaN);//false console.log(!!'');//false console.log(!!false);//false console.log(!!{});//true console.log(!![]);//true |
1> 取代if語句 //前面條件成立則運行後面操作 (a == b) && dosomething(); 2> 用於回調函數 //若沒有給參數a傳值,則a默認爲undefined假值,所以不執行a()。 function fn(a){ a && a(); }
1> 變量設置爲默認值 //如果沒有向參數a傳入任何參數,則將該參數設置爲空對象 function func(a){ a = a || {}; }
數據類型
特殊值:
- null 表示一個空對象指針,常用來描述"空值";
- undefined 表示變量未定義。
1、數字(Number)
JavaScript中不區分整數和浮點數,所有數字均用浮點數值表示。
轉換:
- parseInt(..) 將某值轉換成整數,不成功則NaN
- parseFloat(..) 將某值轉換成浮點數,不成功則NaN
特殊值:
- NaN,非數字。可以使用 isNaN(num) 來判斷。
- Infinity,無窮大。可以使用 isFinite(num) 來判斷。
Number | 對數字的支持 |
Number.MAX_VALUE | 最大數值 |
Number.MIN_VALUE | 最小數值 |
Number.NaN | 非數字 |
Number.NEGATIVE_INFINITY | 負無窮大 |
Number.POSITIVE_INFINITY | 正無窮大 |
Number.toExponential( ) | 返回四捨五入的科學計數法,加參數爲保留幾位 |
Number.toFixed( ) | 小數點後面的數字四捨五入,加參數爲保留幾位 |
Number.toPrecision( ) | 四捨五入,自動調用toFixed()或toExponential() |
Number.toLocaleString( ) | 把數字轉換成本地格式的字符串 |
Number.toString( ) | 將數字轉換成字符串 |
Number.valueOf( ) | 返回原始數值 |
2、字符串(String)
String.length | 字符串的長度 |
String.trim() | 移除空白 |
String.trimLeft() | 移除左側空白 |
String.trimRight() | 移除右側空白 |
String.concat(value, ...) | 拼接 |
String.slice(start, end) | 切片 |
String.split( ) | 分割 |
String.search( ) | 從頭開始匹配,返回匹配成功的第一個位置(g無效) |
String.match( ) | 全局搜索,如果正則中有g表示找到全部,否則只找到第一個 |
String.replace( ) |
替換,正則中有g則替換所有,否則只替換第一個匹配項;
$數字:匹配的第n個組內容;
$&:當前匹配的內容;
$`:位於匹配子串左側的文本;
$':位於匹配子串右側的文本
$$:直接量$符號 |
String.charAt( ) | 返回字符串中的第n個字符 |
String.charCodeAt( ) | 返回字符串中的第n個字符的代碼 |
String.fromCharCode( ) | 從字符編碼創建—個字符串 |
String.indexOf( ) | 查找子字符串位置 |
String.lastIndexOf( ) | 查找子字符串位置 |
String.localeCompare( ) | 用本地特定的順序來比較兩個字符串 |
String.substr( ) | 抽取一個子串 |
String.substring( ) | 返回字符串的一個子串 |
String.toLocaleLowerCase( ) | 把字符串轉換小寫(針對地區,在不知道程序在哪個語言環境中運行時用) |
String.toLocaleUpperCase( ) | 將字符串轉換成大寫(針對地區) |
String.toLowerCase( ) | 小寫 |
String.toUpperCase( ) | 大寫 |
String.toString( ) | 返回原始字符串值 |
String.toString() | 返回原始字符串值 |
String.valueOf( ) | 返回原始字符串值 |
\0 空字節 \n 換行 \t 製表 \b 空格 \r 回車 \f 進紙 \\ 斜槓 \' 單引號 \" 雙引號
3、布爾類型(Boolean)
true(真)和false(假)
toString() | 返回Boolean的字符串值('true'或'false') |
toLocaleString() | 返回Boolean的字符串值('true'或'false') |
valueOf() | 返回Boolean的原始布爾值(true或false) |
4、數組(Array)
1
2
|
var name
= Array( "nick" , "jenny" ); var name
= [ "nick" , "jenny" ]; |
Array.length | 數組的大小 |
Array.push() | 尾部添加元素 |
Array.pop() | 刪除並返回數組的最後一個元素 |
Array.unshift() | 在數組頭部插入一個元素 |
Array.shift( ) | 在數組頭部移除一個元素 |
Array.slice( ) | 切片 |
Array.reverse( ) | 反轉 |
Array.join( ) | 將數組元素連接起來以構建一個字符串 |
Array.concat( ) | 拼接 |
Array.sort( ) | 排序 |
Array | 對數組的內部支持 |
Array.splice( start, deleteCount, value, ...) |
插入、刪除或替換數組的元素 obj.splice(n, 0 ,val)
指定位置插入元素
obj.splice(n, 1 ,val)
指定位置替換元素
obj.splice(n, 1 )
指定位置刪除元素 |
Array.toLocaleString( ) | 把數組轉換成局部字符串 |
Array.toString( ) | 將數組轉換成一個字符串 |
5. Math
Math對象是一個靜態對象,而不是構造函數。實際上,Math只是一個由Javascript設置的對象命名空間,用於存儲數學函數。
作用是執行普通的算數任務。
常量 Math.E 常量e,自然對數的底數。 Math.LN10 10的自然對數。 Math.LN2 2的自然對數。 Math.LOG10E 以10爲底的e的對數。 Math.LOG2E 以2爲底的e的對數。 Math.PI 常量figs/U03C0.gif。 Math.SQRT1_2 2的平方根除以1。 Math.SQRT2 2的平方根。 靜態函數 Math.abs( ) 計算絕對值。 Math.acos( ) 計算反餘弦值。 Math.asin( ) 計算反正弦值。 Math.atan( ) 計算反正切值。 Math.atan2( ) 計算從X軸到一個點的角度。 Math.ceil( ) 對一個數上舍入。 Math.cos( ) 計算餘弦值。 Math.exp( ) 計算e的指數。 Math.floor( ) 對一個數下舍人。 Math.log( ) 計算自然對數。 Math.max( ) 返回兩個數中較大的一個。 Math.min( ) 返回兩個數中較小的一個。 Math.pow( ) 計算xy。 Math.random( ) 計算一個隨機數。 Math.round( ) 舍入爲最接近的整數。 Math.sin( ) 計算正弦值。 Math.sqrt( ) 計算平方根。 Math.tan( ) 計算正切值。
語句
1、條件語句
JavaScript中支持兩個條件語句,分別是:if 和 switch。
if 語句:
1
2
3
4
5
6
7
8
9
|
//if語句 if(條件){ }else
if(條件){ }else{ } |
Switch 語句:
1
2
3
4
5
6
7
8
9
10
11
12
|
//switch語句,name等於nick是執行第一個case,等於第二個執行第二個case,其它執行default. switch(name){ case
'nick': age
= 18; break; case
'jenny': age
= 21; break; default
: age
= 0; } |
2、循環語句
JavaScript中支持四種循環語句,分別是:for、for in、while、do-while
for 循環:
1
2
3
4
5
6
|
var
names = ["nick", "jenny"]; for(var
i=0;i<names.length;i++){ console.log(i);
//索引 console.log(names[i]); } |
for in 循環:
1
2
3
4
5
6
|
var
names = ["nick", "jenny"]; for(var
index in names){ console.log(index); console.log(names[index]); } |
while 循環:
1
2
3
4
|
while(條件){ //
break; //
continue; } |
do-while 循環:
1
2
3
4
5
6
|
//循環的代碼至少執行一次,結果爲1 var
num = 0; do
{ num++; }while
(num>10); |
3. label語句
label 語句可以理解爲跳出任意循環
//輸出結果爲95 <script> var num = 0; for (var i=0;i<10;i++) { for (var j=0;j<10;j++) { if (i==5 && j==5) { break; } num++; } } console.log(num); </script>
//輸出結果爲55 //i和j都循環爲到5時,跳出了兩層循環 <script> var num = 0; outPoint: for (var i=0;i<10;i++) { for (var j=0;j<10;j++) { if (i==5 && j==5) { break outPoint; } num++; } } console.log(num); </script>
4. 異常處理
主動跑出異常 throw Error('xxxx')
1
2
3
4
5
6
7
8
9
10
|
try { //這段代碼從上往下運行,其中任何一個語句拋出異常該代碼塊就結束運行 } catch (e)
{ //
如果try代碼塊中拋出了異常,catch代碼塊中的代碼就會被執行。 //e是一個局部變量,用來指向Error對象或者其他拋出的對象 } finally
{ //無論上述代碼怎麼,finally代碼塊始終會執行 } |
函數Function
函數定義的三種方式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//
普通函數 function func(arg){ return true ; } //
匿名函數 var func
= function (arg){ return "nick" ; } //
自執行函數 ( function (arg){ console.log(arg); })( 'nick' ) |
函數參數:
函數傳參的個數可以小於實際需傳參的個數,沒傳參的默認爲undefined
參數傳多默認不起作用
1
2
3
4
5
6
|
function man(name,age)
{ console.log(name,age); } man( "nick" ,18); //nick
18 man( "nick" ); //nick
undefined man( "nick" ,18,19); //nick
18 |
arguments 可接收所有參數,返回一個數組
1
2
3
4
5
6
|
function man()
{ console.log(arguments); } man( "nick" ,18); //["nick",
18] man( "nick" ); //["nick"] man( "nick" ,18,19); //["nick",
18, 19] |
函數的作用域與作用域鏈:
JavaScript中沒有塊級作用域
1
2
3
4
5
6
7
8
9
10
11
12
|
var name
= 'nick' ; ( function Main(){ console.log(name); //undefined if (1){ var name
= 'jenny' ; } console.log(name); //jenny })(); console.log(name); //nick //輸出結果第一個爲undefined //聲明需提前(Hoisting),在JavaScript引擎“預編譯”時進行,函數在被執行之前,會將其中的變量全部聲明,而不賦值 |
作用域鏈
每個構造函數都有一個內部對象指針,指向原型對象,而原型對象也包含一個指向構造函數的指針。如此層層遞進,形成作用域鏈條
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
var name
= 'nick' ; function Main()
{ function F1(){ var name
= 'jenny' ; console.log(name); //jenny } function F2()
{ console.log(name); //nick } F1(); F2(); } Main(); //
從內到外的優先級尋找 //
F2() 的作用域鏈爲 F2()-->Main() |
閉包:
閉包就是能夠讀取其他函數內部變量的函數。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
function f1(){ var n=1; Add= function (){ n++; }; function f2(){ console.log(n); } return f2;
} var result=f1(); result(); //1 Add(); result(); //2 //result就是閉包f2函數 //函數f1中的局部變量n一直保存在內存中,並沒有在f1調用後被自動清除 |
閉包使函數中的變量都被保存在內存中,內存消耗大,所以少用閉包,否則會造成網頁的性能低,在IE中可能導致內存泄露。
所以在退出函數之前,將不使用的局部變量全部刪除。
面向對象
面向對象的三大特性:
封裝:隱藏代碼實現的細節,實現代碼的模塊化
繼承:擴展已經存在的代碼模塊,實現代碼重用
多態:接口的不同實現方式,實現接口重用
關鍵字:
this 代指此時的對象
new 創建對象時必須使用
構造函數模式:
1
2
3
4
5
6
7
8
9
10
11
|
function Foo
(name,age) { this .Name
= name; this .age
= age; this .Func
= function ()
{ return this .Name
+ this .age } } var obj
= new Foo( "nick" ,18); var ret
= obj.Func(); console.log(ret); var obj2
= new Foo( "jenny" ,21); |
上述模式把同樣的函數封裝到了不同對象,造成了內存浪費。
原型模式(prototype):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
function Foo(name,age)
{ this .Name
= name; this .Age
= age; } Foo.prototype
= { GetInfo: function ()
{ var str
= "
is good" ; return this .Name
+ str; }, Func: function ()
{ return this .Name
+ this .Age; } }; var obj
= new Foo( "nick" ,18); console.log(obj.Name); //nick console.log(obj.Age); //18 var ret
= obj.GetInfo(); console.log(ret); //nick
is good var ret2
= obj.Func(); console.log(ret2); //nick18 var obj2
= new Foo( "nick" ,18); |
所有的構造函數的prototype屬性都指向另一個對象(同一塊內存地址),這個對象的所有屬性和方法,都會被構造函數的實例繼承。
Prototype模式的驗證方法
1. isPrototypeOf()
用來判斷一個對象是否存在於另一個對象的原型鏈中
1
2
3
4
|
Foo.prototype.isPrototypeOf(obj) true Foo.prototype.isPrototypeOf(obj2) true |
2. hasOwnProperty()
用來判斷某一個對象(不包括原型鏈)是否具有指定屬性。
1
2
3
4
|
obj.hasOwnProperty( 'Name' ) true obj.hasOwnProperty( 'Age' ) true |
3. in運算符
判斷某個實例是否具有某個屬性
1
2
3
4
|
'Name' in obj true 'Age' in obj true |
其它
1、序列化
- JSON.stringify(obj) 序列化
- JSON.parse(str) 反序列化
2、轉義
- decodeURI( ) URl中未轉義的字符
- decodeURIComponent( ) URI組件中的未轉義字符
- encodeURI( ) URI中的轉義字符
- encodeURIComponent( ) 轉義URI組件中的字符
- escape( ) 對字符串轉義
- unescape( ) 給轉義字符串解碼
- URIError 由URl的編碼和解碼方法拋出
3、eval
JavaScript中的eval既可以運行代碼也可以獲取返回值
1
2
|
a
= eval( '1+1' ); console.log(a); //2 |
- eval()
- EvalError 執行字符串中的JavaScript代碼
4、正則表達式
1
2
3
|
var p
= /nick/g; console.log(p.test( 'nickjennynick' )); //
true console.log(p.exec( 'nickjennynick' )); //
["nick", index: 0, input: "nickjennynick"] |
JavaScript中支持正則表達式,其主要提供了兩個功能:
- test(string) 用於檢測正則是否匹配
- exec(string) 用於獲取正則匹配的內容
匹配模式:
g:表示全局(global)模式,匹配所有字符串,不會匹配到第一項時停止
i:表示不區分大小寫(case-insensitive)模式
m:表示多行(multiline)模式,到達一行文本末尾時還會繼續查找下一行中是否存在匹配的項
括號分組:
1
2
|
console.log(/(n)(i)ck/.exec( 'nickjenny' )); //
console.log(/(n)(i)ck/.exec('nickjenny')) console.log(/(n)(i)ck{2}/.exec( 'nickkjenny' )); //
["nickk", "n", "i", index: 0, input: "nickkjenny"] |
元字符 名稱 匹配對象 . 點號 單個任意字符(除回車\r、換行\n、行分隔符\u2028和段分隔符\u2029外) [] 字符組 列出的單個任意字符 [^] 排除型字符組 未列出的單個任意字符 ? 問號 匹配0次或1次 * 星號 匹配0交或多次 + 加號 匹配1次或多次 {min,max} 區間量詞 匹配至少min次,最多max次 ^ 脫字符 行的起始位置 $ 美元符 行的結束位置 | 豎線 分隔兩邊的任意一個表達式 () 括號 限制多選結構的範圍,標註量詞作用的元素,爲反向引用捕獲文本 \1,\2... 反向引用 匹配之前的第一、第二...組括號內的表達式匹配的文本
\d 數字,等同於[0-9] \D 非數字,等同於[^0-9] \s 空白字符 \S 非空白字符 \w 字母、數字、下劃線,等同於[0-9A-Za-z_](漢字不屬於\w) \W 非字母、數字、下劃線,等同於[^0-9A-Za-z_]
5、時間處理
時間操作中有兩種時間:
- 時間統一時間
- 本地時間(東8區)
Date 操作日期和時間的對象 Date.getDate( ) 返回一個月中的某一天 Date.getDay( ) 返回一週中的某一天 Date.getFullYear( ) 返回Date對象的年份字段 Date.getHours( ) 返回Date對象的小時字段 Date.getMilliseconds( ) 返回Date對象的毫秒字段 Date.getMinutes( ) 返回Date對象的分鐘字段 Date.getMonth( ) 返回Date對象的月份字段 Date.getSeconds( ) 返回Date對象的秒字段 Date.getTime( ) 返回Date對象的毫秒錶示 Date.getTimezoneOffset( ) 判斷與GMT的時間差 Date.getUTCDate( ) 返回該天是一個月的哪一天(世界時) Date.getUTCDay( ) 返回該天是星期幾(世界時) Date.getUTCFullYear( ) 返回年份(世界時) Date.getUTCHours( ) 返回Date對象的小時字段(世界時) Date.getUTCMilliseconds( ) 返回Date對象的毫秒字段(世界時) Date.getUTCMinutes( ) 返回Date對象的分鐘字段(世界時) Date.getUTCMonth( ) 返回Date對象的月份(世界時) Date.getUTCSeconds( ) 返回Date對象的秒字段(世界時) Date.getYear( ) 返回Date對象的年份字段(世界時) Date.parse( ) 解析日期/時間字符串 Date.setDate( ) 設置一個月的某一天 Date.setFullYear( ) 設置年份,也可以設置月份和天 Date.setHours( ) 設置Date對象的小時字段、分鐘字段、秒字段和毫秒字段 Date.setMilliseconds( ) 設置Date對象的毫秒字段 Date.setMinutes( ) 設置Date對象的分鐘字段和秒字段 Date.setMonth( ) 設置Date對象的月份字段和天字段 Date.setSeconds( ) 設置Date對象的秒字段和毫秒字段 Date.setTime( ) 以毫秒設置Date對象 Date.setUTCDate( ) 設置一個月中的某一天(世界時) Date.setUTCFullYear( ) 設置年份、月份和天(世界時) Date.setUTCHours( ) 設置Date對象的小時字段、分鐘字段、秒字段和毫秒字段(世界時) Date.setUTCMilliseconds( ) 設置Date對象的毫秒字段(世界時) Date.setUTCMinutes( ) 設置Date對象的分鐘字段和秒字段(世界時) Date.setUTCMonth( ) 設置Date對象的月份字段和天數字段(世界時) Date.setUTCSeconds( ) 設置Date對象的秒字段和毫秒字段(世界時) Date.setYear( ) 設置Date對象的年份字段 Date.toDateString( ) 返回Date對象日期部分作爲字符串 Date.toGMTString( ) 將Date轉換爲世界時字符串 Date.toLocaleDateString( ) 回Date對象的日期部分作爲本地已格式化的字符串 Date.toLocaleString( ) 將Date轉換爲本地已格式化的字符串 Date.toLocaleTimeString( ) 返回Date對象的時間部分作爲本地已格式化的字符串 Date.toString( ) 將Date轉換爲字符串 Date.toTimeString( ) 返回Date對象日期部分作爲字符串 Date.toUTCString( ) 將Date轉換爲字符串(世界時) Date.UTC( ) 將Date規範轉換成毫秒數 Date.valueOf( ) 將Date轉換成毫秒錶示