一.初識JavaScript
1.JavaScript簡介
JavaScript是什麼?
html是超文本標籤語言,CSS樣式語言,JavaScript屬性編程語言
JavaScript是一門運行在瀏覽器端的腳本語言。
編程語言:C語言, C++語言, PHP, Java, C#,
通常我們把JavaScript簡稱爲JS
對比:
1,和HTML,CSS一樣,都可以在瀏覽器中解析。
2,和HTML, CSS不一樣,JavaScript是一門編程語言,html, css不是編程語言。
歷史...
http://www.ruanyifeng.com/blog/2011/06/birth_of_javascript.html
JavaScript和java有何關係?
基本上沒有任何關係。
雷鋒和雷鋒塔。
事實上,還是有一點小關係,從商業角度來說。
早期名字是livescript,後來改名成JavaScipt
JavaScript可以做什麼?
現在你去打開任何一個頁面,都可以看到js的身影
可以做什麼?
1,可以更好的組織我們的頁面的內容,讓內容更加有條理
2,提供了用戶體驗
3,遊戲編程
2.如何學習JavaScript
a.內容
瀏覽器端的JavaScript。有三部分組成:
1,ECMAScript: 是js語言的一個標準。是歐洲計算機制造協會制定一套標準。
2,BOM:(Brower Object Model)瀏覽器對象模型,js訪問瀏覽器的一個接口。
3,DOM:(Document Object Model)(客戶端JavaScript)文檔對象模型,js訪問頁面內容的接口。
b.版本
95年js誕生, 97年ECMAScript標準確立,99年ES3出現,09年ES5出來了,15年時,出現ECMAScript2015,通常叫它ES6。
我們暫時學習ES5,後期會接觸一點ES6。
c.心態
由於JS的比較靈活,導致我們學習時,總會和傳統和C,C++搞混,學習時要多思考。
如果有其它編程語言基礎,學習時,會容易。
d.參考書
3.頁面引入JavaScript
JS是一門運行在瀏覽器端的腳本語言。
類似於CSS,需要在頁面中引入JavaScrpit.
有如下四種方式
ü 行內(內聯)
ü 內部
ü 外部
ü JavaScript協議
a.行內:
作爲元素的屬性,寫在開始標籤中,如下:
b.內部:
需要通過script標籤來引入
注意細節:
1,使用script標籤的時候,script標籤可以放在頁面中任何地方。
2,scrpt標籤裏面有一個type屬性,值是text/javascript, 表示當前方本是純文本js, 在ES5,script是一個默認的屬性,它的默認值就是text/javascript
3,script還有一個屬性,叫charset,用來聲明文本的字符集,通常不需要。
4,JS代碼需要放在script標籤中纔可以,不放在裏面,運行不了
c.外部
引入CSS時,內部:style標籤,外部:link標籤
引入JS時,內部:scritp標籤,外部:script標籤
首先外部引入js,需要先寫一個js文件, 如:
其次,需要在頁面中通過script標籤來引入外部的js,如下圖:
執行後,如下:
注意細節:
1,仍然使用script標籤,在標籤裏面使用src屬性來引入js文件
2,引入了外部js,在script標籤中的代碼就不再執行
3,scrpt標籤可以引入多次,意思就是在一個html中,可以有多個script標籤。
最佳實踐:使用外部引入js/位置放在底部
二.JavaScript基本語法
1.JavaScript詞法結構
所謂詞法結構是指一套基礎性規則,用來描述如何使用這門語言來編寫程序,包括如下幾項:
ü 字符集unicode
ü 區分大小寫(true和TRUE)
ü 忽略空白字符(空格、製表符和換行符)
ü 註釋
ü 標識符和關鍵字(保留字)
字符集unicode
unicode介紹:
js在發明時,使用的是unicode字符集,但是我們在寫js程序時,要儘量使用英文,特別是在給文件命名時,儘量使用英文。
區分大小寫 (true和TRUE)
我們在寫js代碼時,一定要注意大小寫,如果不區分大小寫,很容易出錯。
忽略空白字符(空格、製表符和換行符)
由於js會忽略空白字符,那麼我們在寫代碼時,就要好好利用這些空白符,使代碼更加清晰。
註釋
註釋非常重要,註釋在代碼中的比重一般是50%。
在js中, 註釋分爲兩種:
單行註釋 //
多行註釋 /* */
注意細節:
1,註釋的內容不會執行,是給開發人員看的,不是給計算機看的
2,對於多行註釋, 不允許嵌套,如下:
標識符和關鍵字(保留字)
我們在寫代碼時,會起各種各樣的名字,那麼就些名字就是標識符,還有一些名字是人家發明js時,就起好的名字,這些名字,我們統稱爲關鍵字,還有一種,也是人家起好的名字,但是現在沒有使用它,而是保留着以後使用,這類名字,我們叫它保留字。
我們在定js代碼時,當我們需要起名字時,不要使用人家事先定義好的關鍵字或保留字。比如:var alert .......
關鍵字如下:
在js中,當我們去起一個名字時,通常這個名字我們中它標識符,使用小駝峯命名法。
小駝峯:標識符首字母小寫,後面如果還有其它的單詞,每個單詞的首字母大寫。如:
toString
最佳實踐:標識符(如變量、函數)命名採用小駝峯式命名方法
2.變量和值
(1).變量概念(變量名和值)
電腦(計算機)剛產生的目的?
電算機剛產生的目的是純粹爲了計算,計算的目的是爲了滿足某些需要。
學編程的目的?
切實解決生活中的問題。
現在我有一個生活中的問題:計算一個1+2=?,對於這個問題,我們使用計算機該如何解決?
首先需要讓計算機中有兩個“容器”,一個保存1, 一個保存2,計算機把這兩個容器的值取出來,取出來後,進行一個相加的操作,加完之後,將結果輸出。
這個容器在編程語言中叫變量。變量是用於存儲信息的"容器"。
代碼如下:
變量是用來保存某個值的,便於後續使用。最終是爲了解決現實中實際的問題。
變量有兩部分組成:
變量的名稱:一般來說,在賦值符號左邊。
變量的值:一般來說,出現在賦值運算符的右邊。
還有些書上說,還有變量類型,變量的地地址等.....
(2).如何聲明變量
在js中,聲明變量是使用var這個關鍵字。
var是variable(變化)的簡寫。
a.單獨聲明
一次性聲明一個變量,每個變量都使用var
b.一次性聲明多個
只需要一個var關鍵字,然後可以聲明多個變量
c.重複聲明(瞭解)
在js中,是允許重複聲明變量的,不會出錯,如下:
如果重複聲明瞭,後面的值會覆蓋前面的值。
實際開發中,一定要避免重複聲明。
注意,我可以藉助console來調試代碼,如下:
百度首頁,通過console.log來發招聘信息:
d.遺漏聲明(瞭解)
在js中,是允許遺漏聲明,不會出錯,如下:
對於這種寫法,我們同樣也要避免!
(3).全局變量、局部變量
全局和局部是指變量的生效範圍,在哪個地方能夠起作用。是以函數爲界。
數學中有函數
編程中的函數也是模擬數學中的函數,可以這樣理解,編程中的函數就是一個功能塊。給這個功能塊一個[輸入], 這個功能塊給你一個[輸入]
打一個比方:
普通話和方言
全局和局部是以函數作爲分界線。
全局的變量在函數內部和函數外部都能訪問,局部的只能在函數內部訪問,不能在函數訪問。
小結:全局在函數內外都能訪問,局部變量只能在函數內訪問。
注意:在js中是沒有常量
在js中,變量的值是可以改變的,就是它的值是可以變化,如下:
常量則是值不能改變的。在js不支持常量。
最佳實踐:
ü 總是使用var來聲明一個變量
ü 變量要先聲明後使用
3.數據類型
變量是一個容器,存儲一些信息,信息又分成不同類型的信息。如
姓名, string
年齡,數字
......
現實生活中,有很多信息,一定有很多單位,個,條,只, 天,月,年,時, 分........
(1).什麼是數據類型
在日常生活中,描述不同的東西,有不同的單位。實際上,編程也是爲了解決生活中的問題的,在程序中,是如何描述這些內容?
針對不同的內容,根據其特性,需要添加上不同的單位(類型)加以描述,這就是數據類型的概念。
在js, 它的數據類型如下:
(2).數值類型(number)
作用:用來表示數字的,任何數字都可以用數值類型。比如:商品價格,年份,年齡等
在C語言中,數值類型分爲單精度和雙精度。在js,是不區分整數和小數。
我們可以使用typeof運算符來判斷,一個變量的數據類型:
注意細節:
ü 不區分整數值和浮點數值,都是浮點數
ü 最大值和最小值(Number.MAX_VALUE,Number.MIN_VALUE)
ü 整型的多種表示(十進制、十六進制、八進制)
ü 浮點數的多種寫法(3.14,.33333,6.02e3)
ü JavaScript算術運算的特殊性(溢出、被零整除都不會報錯)
ü 特殊的NaN
ü 運算的不精確性
不區分整數值和浮點數值,都是浮點數
浮點數就是小數, js是不區分整數和小數。
最大值和最小值(Number.MAX_VALUE,Number.MIN_VALUE)
整型的多種表示(十進制、十六進制、八進制)
浮點數的多種寫法 (3.14,.33333,6.02e3)
JavaScript算術運算的特殊性(溢出、被零整除都不會報錯)
特殊的NaN
NaN: Not a Number 不是一個數值
運算的不精確性
針對小數,運算具有不確定性
在js中,千萬不要去比較兩個小數,也就是說,不要去比較兩個運算之後是否相等。
如何去解決這個不確定性?
先轉化成整數後,再判斷,如下;
最佳實踐:
ü 不要使用八進制
ü 不要試圖用==判斷兩個浮點數是否相等
(3).字符串類型(string)
由一系列的字符構成的數據
描述某個名稱,用戶名,密碼,籍貫等。
在使用字符串類型數據時,需要使用引號:
雙引號: “”
單引號: ‘’
基本使用:
如果沒有使用引號,那麼js會把它當作變量來對待,如下:
雙引號和單引號要配對使用,不能混合使用,如下:
當我們的js代碼本身被引號引起來時,怎麼辦?
錯誤如下:
該怎麼解決:
外雙內單,或, 外單內雙
當雙引號嵌套時,會發生錯誤:
有時候,需要輸入一些符號,js 爲我們提供了轉義字符,用法如下:
js中,常用的轉義字符如下:
例如:換行的使用
還有兩個小問題:
在js, 標識符(變量名和函數名)的名稱,不能以數字打頭,結合字符串來理解:
數字可以作爲數值類型,也可以作爲字符串類型:
字符串可以以數組的形式來使用:
如果需要獲取字符串的類型,使用typeof運算符,如下:
(4).布爾類型
前面說了,數值類型,它所對應的值有無數個,又說了字符串類型,它所對應的值也有無數個。接着我們學習的布爾類型,它對應的值沒有那麼多,只有兩個,一個是true, 一個是false.
true表示真,false表示假
在js中嚴格區分大小寫,true, 和Ture,TRUE不一樣。
布爾類型一般會在判斷等語句中使用。
嚴格區分大小寫:
我們可以使用typeof來判斷布爾數據的數據類型,如下:
注意細節:
1,在實際開發中,直接使用true和false的情況不多。
2,有一些值會默認轉化成false, 其它值都轉化成true
ü undefined
ü null
ü 0/-0
ü NaN
ü “”
(5).undefined和null
在日常生活中,有0這個數字,表示沒有。
undefined
undefined: un前綴 + defined defined是定義的意思, undefined未定義的意思
表示一個變量在聲明的時候沒有賦初值。它的值就是undefined
數值類型:對應無數個值 1, 2, 3...
字符串類型:對應無數個值 “hello”, “h1”....
布爾類開:對應兩個值true false
undefined: 對應一個值,這個值也叫undefined
用法:
對於聲明一個變量,只要聲明瞭,它就存在了,就看有沒有賦值,如果賦值了,這個容器裏面就是對應的值,如果沒有賦值,也是有值的,只是這個值是undefined,它的類型也是undefined,換句話說,undefined在js是一種數據類型,它只有一個值,這個值就是undefined.
null
null是英文是空的意思
在使用時,需要顯式是給它賦爲null,纔可以。
實際上,null在js是用於對象的,如果對象的初始值什麼都沒有,可以賦爲null.或者當你想銷燬一個對象時,也可以給它賦nulll.
undefined和null有什麼區別?
ü undefined是針對普通變量而言的
ü null是針對對象而言
undefined和null的幾乎一樣,對它們比較後的結果如下:
爲什麼會有兩個東西表示“無”?
答:歷史原因(瞭解)
下去看一看:http://www.ruanyifeng.com/blog/2014/03/undefined-vs-null.html
(6).引用類型
引用類型就是對象,既:object
首先,看兩個對象:
ü 數組:array
ü 函數:function
除了,array和function之外,其餘的對象我們大致可以分爲3類:
ü 內置對象,ECMAScrpt本身提供的對象
ü 宿主對象,BOM和DOM提供對象
ü 自定義對象
基本的使用:
(7).類型轉換
4.運算符
(1).認識運算符
什麼是運算符?
表示某種功能的符號,運算符是用於執行程序代碼運算的,會針對一個以上的操作數來進行運算。
JS都提供了哪些運算符?
(2).如何理解運算符
ü 根據操作數的個數進行分類:一元運算符,二元運算符,三元運算符
ü 優先級:當多個運算符同時進行運算時,優先算哪一個,這就是運算符優先級
ü 結合性:左結合性,右結合性
ü 左值:(瞭解)
如果一個運算符的操作數只有一個,稱爲一元運算符,或叫單目運算符
如果一個運算符的操作數只有兩個,稱爲兩元運算符,或叫雙目運算符, 是最多的
如果一個運算符的操作數只有三個,稱爲三元運算符,或叫三目運算符,js中只有一個
使用如下:
優先級的說明:
當多個運算符同時進行運算時,優先算哪一個,這就是運算符優先級
代碼如下:
如果需要改變優先級,或對於優先級不確定時,可以使用():
結合性的說明:
根據運算符的順序,可以分成兩種:
左結合性:自左至右
右結合性:自右至左
代碼如下:
左值的說明:
以賦值符號 = 爲分界點,能夠出現在左邊的,稱爲左值。
一般而言,變量可以作左值,字面量(100,‘hello’, true)是不能作左值
(3).算術運算符
ü +
ü -
ü *
ü /
ü %
ü ++
ü --
+ - * /
代碼如下:
* / 的優先級是高於+ -
如果優先級相同,具有左結合性。
%
取模,取餘
++ 分爲前置++ 和 後置++
表示自增
首先,看一個需求,需要將一個數加1,然後賦給其它地方使用:
在js中有很多類似這個的情況,所以js提供了一個++的運算符,專門用來實現+1的操作,如下:
對於++,它只需要一個操作數,所以它是一元運算符,也叫單目運算符。
但是++並沒有那麼簡單:
++在前,整體表達式的值是一個新值,++在後,整體表達式的值是一箇舊值
--
表示自減, 和++類似, 道理不多說了。
在實際開發中,++和--用的非常多,尤其在循環中用的最多。
最後補充:
+ 和 - 除了可以作爲二元運算外,還可以作爲一元運算符。
-作爲一元運算符時,表示取反操作
+作爲一元運算符時,轉換成數字
對於一元的+和-,用的不多,但是在某些場合下,也可以使用。
(4).賦值運算符
在js中,賦值運算符,用=。
大家在讀代碼時,儘量讀作賦值操作,不要讀成等於操作
注意:等於用==表示,=表示賦值操作
賦值運算符是一個二元運算符,需要有兩個操作數,賦值運算符的優先級非常低,基本上是最低的。
ü =
ü +=
ü -=
ü *=
ü /=
ü %=
解釋一下,+=,-=等是什麼意思 ?
重點:
ü =具備右結合性
ü =的優先級比較低
ü =和==的區別
ü +=可以用於數字或字符串,視情況而定
解釋一下,i=j=k=10?
有兩層含義:
其一,賦值運算符具有右結合性,首先就是將10賦給了k,這個時候k就等於了10;
其二,賦值運算符有副作用,副作用是這個賦值的表達式本身也具備一個值,也就是意味着,k = 10, 這個賦值表達式,本身也有值,這個值就是10
代碼的理解相當於:
第一步:i=j=k=10,此時k的值爲10, 將k=10整個替換成10
第二步:i=j=10,此時j的值是10,將j=10整個替換成10
第三步:i=10
(5).關係運算符
作用:用來進行比較的。比較的結果通常是布爾值。
== ===
!= !==
> >=
< <=
== 相等運算符,使用兩個==表示
要判斷兩個變量的值,是否相等,如果相等,返回真,否則返回假
在使用==運算符時,是不需要考慮類型的,只要兩個變量的值是相等的,就返回true:
如果我們想判斷兩個變量的值相等,數據類型也相等,這個時候,我們就可以使用全等:===
小結:
ü =表示賦值運算符,右結合性
ü ==表示相等運算符,只判斷兩個變量的值是否相等
ü ===表示全等運算符,不只判斷兩個變量的值是否相等,還判斷兩個變量的數據類型是否相等
!= 和 !==
!=是==反操作 !== 是===反操作
在實際開發中,== === !=使用比較多, !==使用比較少。
> >= < <=和數學比較是類似的。
注意細節:
1,使用==和!=,可以對所有的類型進行比較
2,但是>, >=,< <=的時候,只是針對數值進行比較。如果要比較字串要使用函數
(6).邏輯運算符
在js中有三個邏輯運算符
ü && 邏輯與
ü || 邏輯或
ü ! 邏輯非
A, &&
邏輯與操作,表示並且的意思,AND,表示兩個或多個條件同時爲真時,整體結果才爲真。
以兩個變量爲例,進行說明:
運算規則如下:
表達式1 |
表達式2 |
結果 |
true |
true |
true |
true |
false |
false |
false |
true |
false |
false |
false |
false |
&&和||是二元運算符
它們的優先級比較低,比賦值的要高,比關係運算符要低
B, ||
邏輯或,或者的意思, OR
對於多個條件,只要有一個條件爲真,那麼結果就爲真,,只有所有的條件都爲假時,結果才爲假。
運算規則如下:
表達式1 |
表達式2 |
結果 |
true |
true |
true |
true |
false |
true |
false |
true |
true |
false |
false |
false |
在兩個操作數中,只要有一個爲true,結果就爲true, 只有當兩個都爲false時,結果才爲false。
C,!
邏輯非,取反操作,NOT
邏輯非是一個單目運算符,只有一個操作數
規則如下:
表達式 |
結果 |
true |
false |
false |
true |
一元運算符的優先級要比二元,三元運算符的優先級都要高。
深入理解邏輯運算符:
先看兩個問題:
第一個:
第二個:
我們應該從三個層次去理解(以&&爲例說明):
ü 第一層理解:操作數都是布爾值的時候,只有二者都爲true的時候,結果才爲true,否則爲false。
ü 第二層理解:&&可以對真值和假值進行運算,如果兩個都是真值,則返回一個真值,否則返回一個假值。但是,真值並不限於true, 假值也並不限於false, 下面這些值會轉換成false(其它值都轉化成true):
undefined
null
0 / -0
NaN
“”
在js中,進行&&操作,結果並不總是true和false, 而是當前的值。當前的值可能是數值,也可以是字符串。
如果第一個表達式爲真,那麼就以第二個表達式的值作爲結果,這個結果不是轉換之後的值,而是它本身。
如果第一個表達式的值爲假,那麼就以第一個表達式的值作爲結果,這個結果也不是轉化之後的值,而是它本身。
ü 第三層理解:運算過程,首先計算左操作數的值,如果計算結果爲假值,則整個表達式結果就爲假值,也就是左操作數的值。同時停止右操作數的求值。如果左操作數的結果爲真值,則整個結果依賴於右操作數的值。
關於短路運算的說明:
在&&和||運算時,如果第一個表達式的值已經能夠確定整個運算結果,那麼第二個表達式就不會執行,類似於比賽中5局3勝,如果一方已經勝了3局,那麼後面的比賽就不必進行了。
好好理解下面代碼:
或和與具有相同的原理,只是運算的規則不太一樣。
對於||而言,
如果第一個表達式的值爲真值,結果就是第一個表達式的值,這個值不是轉化之後的值,而是這個值的本身。
如果第一個表達式的值爲假值,結果就是第二個表達式的值,也不是轉化之後的值,而是這個值的本身。
(7).位運算符(瞭解)
(8).其它運算符
ü 字符串連接運算符 +
ü 三元運算符 ?=
ü 逗號運算符,
ü 獲取類型 typeof
ü 刪除屬性 delte
ü 檢測對象類 instance of
ü 測試屬性是否存在 in
ü 返回空 void
字符串連接運算符 +
使用+表示字符串連接:
字符串連接運算符是一個二元運算符。
如果兩個操作數都是字符串,很簡單,就是將兩個字符串連接在一起。
如果兩個操作數是數值上,也比較簡單,那麼就是將兩個數值進行一個算術的加法運算。
如果有一個操作數是數值,另一個操作數是字符串,怎麼辦?
直接按字符串連接運算符進行操作:
結論:
只要有一個操作數是字符串,那麼就表示進行的就是字符串的鏈接操作。
+=呢?
問一個問題:++x和x = x+1的區別?
++x, 只能是數值
x=x+1, x可以是數值,也可以是字符串
三元運算符
在js中,有且僅有一個元運算符,就是?:
格式:表達式1 ?表達式2 :表達式3
運算規則:如果表達式1的值爲真,那麼結果就是表達式2,否則結果爲表達式3.
三元運算符,能夠簡化我們的代碼,實際上相當於if...else...語句。
?:的優先級較低,並且是右結合性。
typeof
typeof是一個運算符,不是一個函數,也可以加括號
typeof只能區分出原始值(number, string, boolean, undefined)和對象, array返回的是object , null返回也是object, 函數則返回function(特殊)
(9).類型轉換
思考:
在js中,如果是一個二元運算符,有個規則:就是要保證兩邊的操作數的數據類型一至。對於上面的a+s1,兩邊的數據類型沒有保持一至,這個時候就違反了這個規則,如果還要遵循這個規則,就涉及到了js中的類型轉換問題:
對於a+s1,我們要保證兩邊的操作數的數據類型一至,有兩種方式:一種是讓a轉換成字符串,一種是讓s1轉換成數值。
關於類型轉換,有兩種方式:
ü 強制轉換
ü 隱式轉換
一般只是針對基本數據類型進行轉換。
強制轉換
使用Boolean()、Number()、String()或Object函數
在轉換數值的時候,parseInt()和parseFloat()函數更加靈活。
在使用Boolean(),Number(),String()函數時,函數的首字母必須大寫。
如果僅僅對數字進行轉換,我們還可以使用如下兩個函數:
parseInt:轉化成整數, 10進制
parseFloat:轉成小數
注意:Number和parseInt之間有區別?parseInt可以將以數字開頭的字符串轉成數值,轉換規則就是將數字開頭的連續的數字提取出來,直到碰到字符爲止,後面的都被截掉。
隱式轉換
讓變量參與運算,就可以實現隱式轉換。我們大部分人都不會察覺到。
ü 如果 + 運算符的一個操作數是字符串,它將會把另外一個操作數轉換成字符串
ü !運算符將其操作數轉換爲布爾值並取反,故可以使用!!來轉換
ü 對於數值,如果轉換結果無意義,則返回NaN,如var n = 1 - 'x'
== 相等運算符,也會進行一個類型轉換
實際上,undefined和null是不同的數據類型,我們在==比較時,需要進行類型轉換,undefined和null不能互換,這個時候,兩者都轉換爲一箇中間值----false
有一點需要強調:
不管是強制還是隱式轉換,它們都不會去改變原來變量的數據類型。
下面這些值會被轉換成false,其它都轉換成true:
ü undefined
ü null
ü 0 / -0
ü NaN
ü “”
轉換規則表,如下:
5.表達式
(1).什麼是表達式
任何有值的內容都是表達式
一個表達式會產生一個值,它可以放在任何需要一個值的地方,比如a=3中的3就是一個表達式,a=3整體也可以作爲一個表達式。
理解:=的副作用
如果給一個變量或屬性賦值了,那麼使用這個變量或屬性的表達式的值都會發生變化。
i = k = j = 1;
常見的表達式有:
ü 原始表達式
ü 運算符構成的表達式
ü 對象和數組初始化表達式
ü 函數定義表達式
ü 調用表達式
ü 對象創建表達式
只要在能放在 賦值符號 的右邊的內容,通通都是表達式。
(2).原始表達式
原始表達式
ü 它是表達式的最小單位,它們不再包含其他表達式。
常見的原始表達式有:
ü 直接量 (如 1.23"hello")
ü 關鍵字 (如true false null this)
ü 變量 (如i,sum,undefined)
ü
(3).運算符構成的表達式
運算符表達式
由運算符構成的表達式,如:
ü 算術表達式
ü 關係表達式
ü 邏輯表達式
ü 賦值表達式
(4).對象和數組初始化表達式
(5).函數定義表達式
(6).調用表達式
由於調用函數,它會返回一個值,所以它是一個表達式。
(7).對象創建表達式
三.語句
1.什麼是語句
概念:在JS中表達式是短語,語句就是整句或命令。
作用:表達式是用來計算個值的,語句是用來發送某條指令。
特徵:用分號結尾。
js中有哪些語句?
ü 表達式語句
ü 複合語句
ü 聲明語句
ü 條件語句
ü 循環語句
ü 跳轉
2.表達式語句
具有副作用的表達式,就可以形成一個語句,需要我們加上分號。
3.複合語句
注意:
在使用了{}之後,就不需要再添加分號了。
4.聲明語句
var和function都是聲明語句,它們聲明或定義變量和函數。
聲明語句本身什麼也不做,但它有一個重要的意義,通過創建變量或函數,可以更好的組織代碼的語義。
5.條件語句
世間萬物都脫離不了三種結構:
ü 順序結構
ü 選擇結構
ü 循環結構
順序結構,是指我們的代碼書寫順序,自上向下挨個執行。
在實際開發中,只有順序結構,還不能滿足我們的需求,這個時候就有分支結構和循環結構。
分支結構對應到js中,就是分支語句,換句話說,我們是使用條件語句來實現分支結構。
循環結構對應到js中,就是循環語句,換句話說,我們是使用循環語句來實現循環結構。
對於條件語句,是指在執行代碼時,需要根據相應的條件執行。
在js中,提供4種關於條件語句的寫法:
ü if
ü if...else
ü if...else if ... else
ü switch
(1).if語句
格式:
基本使用:
if語句使用細節說明:
1,關鍵字是if, 然後if後面有一個(), 中間有無空格都可以
2,在()中,可以寫各種表達式,可以是原子表達式,也可以是複雜表達。
3,{}可有可無,如果在{}裏面只有一條語句,這個時候有無{}, 沒有區別。
如果在{}裏面有多條語句,那麼沒有{}時,無論條件表達式是真還是假,最終除了第一條語句,後面的語句都會執行。
4,if條件,在沒有{}情況下,它只對後面的一條語句起作用。對後續的語句沒有約束力。
最佳實踐:
我們在寫if語句時,儘量加上{},哪怕只有一條語句,
(2).if...else語句
雙分支,二選一的情況
格式:
基本使用:
在實際開發中,if中的表達式,通常是類似於下面的一些寫法:
關於if...else...雙分支,我們還有一個簡化的寫法:使用三元運算符。?:
(3).if...elseif ...else語句
多分支語句,多選一。
基本使用:
注意點:
1,在js中,else和if要分開寫,不能連寫
2,在js中,else .. if 多分支,本質上是if..else.. 的一個嵌套使用,只不過可以用簡化的寫法,讓程序更簡潔一點。
(4).switch
swidth也是js中針對多分支提供的一種語句。
格式:
在switch中,有四個關鍵字:switch , case, break , default
對應用到了三種符號:() {} :
基本用法
注意的細節:
1,如果滿足某個條件後,後續的都不進行判斷和處理,使用break結束。如果沒有break,當一個case條件成立時,執行當前case中的代碼,然後繼續下一個case。
2,只要寫switch,我們最好添加一個default分支,哪怕空着也行。
3,在switch中,我們在判斷時,使用的是===,不是使用==, 所以需要注意,類型也要相等。如下:
6.循環語句
我有一個需求:我要輸出1到100這100個數。
在JavaScript中,循環語句有如下幾種:
ü while
ü do...while
ü for
(1).while循環
格式:
基本使用:
注意細節:
1,在循環體中,一定要修改循環變量的值,否則將陷入死循環。
2,循環變量的初始化一定要放在while之前。
3,while這個關鍵字之後有一個(), 表示要判斷的一個條件,裏面就是一個條件表達式。
4,循環體,要使用{},也可以不使用{},但是如果不使用{},那麼循環體就只有一條語句,建議大家任何情況下都加上{}。
(2).do...while循環
基本上和while是一至的。
格式:
基本使用:
注意細節:
1,循環變量的初始化要放在do之前
2,在循環體中,需要去修改循環變量的值
3,循環體要使用{}包括起來,形成一個語句塊
思考:while和do...while的區別?
1,do...while的循環體一定會執行一次,while循環體可能一次也不執行
在實際開發中,while的使用頻率要遠遠高於do...while。
(3).for循環
這個非常重要,使用頻率也是最高的。
格式:
基本使用:
流程圖:
從代碼(圖)中可以看出:
1,表達式1就是var i=1; 只執行一次,表達式2執行了101次,表達式3和循環體都執行了100次。
2,由於表達式1只執行了一次,所以經常將變量的定義和初始化工作都放在表達式中。
注意細節:
1,for關鍵字後面有個(),()中有三個表達式,必須要有三個表達式,表達式之間用;隔開,所以必須要有兩個;
2,省略表達式1:
3,省略表達式3:
4,省略表達式2:
儘管三個表達式都可以省略,一般不這樣做。
for循環和while循環如何選用?
大部分情況下,兩者是一樣的。
for循環通常針對循環次數確定的循環,while循環通常是針對循環次數不確定的循環。
(4).多重循環
在實際開發中,經常需要用到多重循環,尤其是二重循環。
不管是for還是while都可以實現二重循環,但是for用的較多:
使用for循環,打印出九九乘法表:
代碼如下:
百錢買百雞:
今有雞翁一,值錢伍;雞母一,值錢三;雞鶵三,值錢一。凡百錢買雞百隻,問雞翁、母、鶵各幾何?
7.跳轉語句
在JavaScript中,跳轉語句有如下幾種:
ü break
ü continue
ü 標籤語句
ü return
其中,標籤語句已經滅絕了,而return語句是在函數中體現的,現在就學習break, continue。
break: 跳出循環(或switch)
continue:繼續
正常情況下跑步,如圖:
中到第6圈時,跑不動了:
在循環中,break可以提前終止循環。
continue的作用:終止當前循環,進行下一次循環。
break和continue有什麼區別?
break(淺嘗輒止)終止循環, continue(鍥而不捨追女孩)終止當次循環,進行下一次循環
一般情況下,我們會在循環語句中使用break和continue,配合if語句來使用。有一個特殊情況,就是在swich語句中使用break, 跳出當前的swithc語句。
四.函數初步
函數在js中,是一等公民,它在js的地位非常重要。
所以在js課程體系中,分成兩塊:
ü 函數初步
ü 函數高級
1.認識函數
回顧一下,我們在前面學習的js中用到了哪些函數?
ü alert();
ü parseInt();
ü parseFolat();
再回顧一下,在初中數學中學過函數。
編程中的函數也是模擬數學中的函數的,數學中的函數能夠揭示一些規律,後續凡是用到了這些規律,可以用一種方法來解決 ---- 重用性
對於一個函數,如y=x2, y=x每給定一個值,經過函數運算後,得到一個結果y
從三個方面來認識函數
ü 函數是一個代碼段
ü 函數是一類數據
ü 函數是一個對象
函數的作用
ü 代碼重用
ü 作爲構造器,用於生成對象
ü 用於組織代碼
2.函數定義
ü 函數聲明
ü 函數表達式
第一種:函數聲明,使用function關鍵字,基本格式:
基本使用:
函數定義完之後,並不會自動的執行,需要調用纔可以執行函數中的代碼。
函數調用也非常簡單:函數名(參數), 核心小是括號。
注意細節:
1,定義函數,需要使用關鍵字function, 關鍵字之後和函數名之間需要空格。
2,函數名稱和定義變量的名稱規則是一樣的:
a, 大小寫區分,在定義普通函數時,首字母小寫,如果有多個單詞,採用小駝峯命名法。
b, 函數名不能以數字打頭, 可以使用一些特殊符號,如_,$
3,函數名稱後面是小括號,必不可少,用來裝載形式參數
第二種:函數表達式
注意細節:
1,將function整體,放在賦值運算符右邊,作爲表達式來使用。
2,通過一個變量來引用當前的function,使用後續使用。
3,函數名可以加上,但是隻對函數內部起作用。如圖:
函數聲明和函數表達式有什麼區別?(重點)
函數聲明:
我們能不能先去調用函數,再去聲明函數:
函數表達式
我們能不能先去調用函數,再去聲明函數:
得出結論:對於函數聲明,我們可以把函數調用放在函數聲明前面,對於函數表達式,我們不能將函數調用放到函數表達式前面。
在js中,我們把使用聲明方式來定義函數的這種用法----函數聲明提前。
可以這麼理解 ,在js中,只有是函數聲明,相當於會把函數聲明相關的代碼放到最前面 。
對於函數表達式這種方式,其實它就是一個變量,只不過我們在賦值的時候,是將函數這種數據類型的數據賦給了這個變量。
既然是一個變量,那麼這就是遵循個規則:變量要先聲明,後使用。
3.函調調用及返回值
關於函數的調用,只需要使用小括號就可以了。
函數名();
js中函數調用四種形式:
ü 作爲函數、
ü 作爲方法、
ü 作爲構造函數、
ü 使用call(apply)間接調用
作爲函數,是最簡單的函數調用方式。
ü 自定義的函數調用:f1()
ü js提供的內置函數:alert(),parseInt(), parseFloat()等
作爲方法來調用
什麼是方法:所謂的方法就是對象中的函數。
什麼是對象:現實中,萬物皆對象。編程語言中的對象是指包含屬性和方法的一個集合。
將函數定義到某個具體的對象上面,然後通過.語法來調用,如:console.log(),window.alert();
關於函數的返回值:
我們前面說了,函數就是一個功能,對於個功能,我們可以給這個功能提供原材料,有時候我們也希望這個功能也能給我們返回一個結果。這個時候就涉及到了函數的返回值。類似於數學中y = x, y = x^2, y = sin(x), 當我們給這個函數提供個x值時,我們就可以得到一個對應的y值。在編程中也有這樣的功能, 這個功能就是return.
在parseInt()函數中,一定有個return語句,返回需要的值。
如果是我們自已定義的函數,該怎麼返回?
當不寫return時,函數會給我返回一個undefined:
對於沒有return的函數,我們可以這樣理解:在一個函數中,最後一定有個return語句, 默認就是return undefined.
return只能出現在函數中,不能出現在函數外:
在一個函數中,執行到return語句時,後續的任何代碼都不會執行:
如果寫了reutrn,但是return後面什麼也沒寫,返回的也是undefined:
4.函數參數
榨汁機:
榨汁機是一臺機器,提供榨汁的功能。
榨汁過程:
首先需要放點東西:蘋果+水, 橘子+水,香蕉+水葡萄+水
啓動開關
得到對應果汁
現在我們模擬這個過程:
在定義函數和調用函數時,涉及到了兩個參數:
ü 形式參數:簡稱爲形參,表示在定義函數時指定的參數,表示在傳入什麼樣的值
ü 實際參數:簡稱爲實參,表示在調用函數時給出的參數,具體的某個值。
案例:定義一個函數,這個函數的功能是求兩個數的和:
正是由於有了參數這個武器, 所以我們的函數才得以重用。
實際上,在js中比較特殊:
在定義和調用函數時,對形參和實參要求的沒有那麼嚴格。
形參和實參的個數,可以不相等,程序不會出錯,但是結果可能出問題:
在js沒,對於形參,沒有數據類型的要求:
實際上,js是一門弱數據類型的語言,具體體現在:
ü 變量在聲明的時候,是不需要指定類型的
ü 函數的中函數,在聲明的時候,也是不需要指定類型
還有一個知識點:arguments,這個知識點,咱們用到的時候再說!
5.作用域
什麼是作用域?
首先,作用域是針對變量而言,要定義一個變量,那麼個變量就有相應的作用域。
換句話說,作用域就是指變量的生效範圍,在程序中,是指在什麼範圍可以訪問,什麼範圍內不能訪問。
在js中,作用域是以函數爲界:
ü 全局作用域--->全局變量
ü 局部作用域--->局部變量
全局變量:指在函數內外都可以訪問
局部變量:指只能在函數內部被訪問
在js中是沒有{}塊作用域。
局部作用域(在函數中):可以訪問全局變量,可以訪問當前作用域中的局部變量
全局作用域(在函數外):是不能訪問局部作用域中的變量的。
五.對象
對象在js,很重要,分兩階段:
ü 對象的初識
ü 面向對象
1.初識對象
什麼是對象?
在js中,一切皆對象。
對象,在生活中是可見和不可見的東西,在世界中, 是指客觀存在的一切物體。如:桌子,電腦,飲水機.......
在生活,我們是怎麼去描述一個對象的?
描述電腦:
靜態的特徵:顏色,屏幕尺寸,CPU, 內存, 硬盤,顯卡, 系統......
動態的特徵:玩遊戲,發信息,上網,拍照.....
描述班長:
靜態特徵:姓名,身高,性別,體重,籍貫...
動態的特徵:跳舞,畫畫,開車....
我們在描述一個對象時,通常會從兩個方面描述:
ü 靜態的特徵
ü 動態的特徵
把靜態的和動態的特徵放在一起,就成了對象。
在js中,靜態的和動態的通通稱爲對象的屬性。
如果是靜態的特徵,就是變量的形式出現
如果是動態的特徵,就以函數的形式出現,那麼這裏的函數,我們習慣上叫它方法。
基本對象:
在調用對象的屬性和方法時,使用點語法
格式如下:對象.屬性() 或 對象.方法()
重新理解:console.log():
console是一個對象,表示開發者工具的控制檯,該對象有多個方法,log就是其中的一個方法,它的作用就是向控制檯輸出信息。
在js中,對象通常會分成三類:
ü 本地對象(Number, String, Boolean, Date)
ü 宿主對象(BOM, DOM)
ü 自定義對象
手冊:
本地對象
宿主對象:
自定義對象,根據我們自己的需要來定義。
2.object
object, 物體, 對象的意思
object是js中所有對象的祖先
如何創建object(兩種方式)
ü 字面量(直接量)
ü 構造器
字面量:
使用第二種方式創建一個對象:
new關鍵字
Object是所有對象的祖先。
其它對象的創建方式和object有類似之處,它們都有兩種方式創建。
Object這個對象裏面有個方法,是toString, 用的比較多, 它會被後代對象所繼承,所以說,它的後代對象裏面有這個方法。
3.date對象
Date對象是js內置的對象
作用:提供關於日期相關操作
實例化格式:
在Date這個對象裏面,有常見屬性和方法:
ü Date()
ü getDate()
ü getDay()
ü getFullYear()
ü getHours()
ü getMinutes()
ü getSeconds()
案例:
4.單體內置對象
和Date對象不太一樣,單體內置對象有一個特殊的地方, 就是不需要實例化,就是不需要new,那麼它就是單體內容對象。
Math:數學的意思
功能:提供了數學相關的一些運算
代碼:
floor:地阪
ceil:天花板
round:周圍
有一個非常重要數學函數, random()
隨機一個小數,範圍[0 , 1), 包括0, 不包括1
需求:隨機一個[0, 50)之間的整數。
需求:隨機個[50, 100)的整數。
爲什麼叫單體內置對象?
那是由於,只要我們的js開始運行時,Math這個對象就常駐內存,可以直接使用,不需要實例化。
5.自定義對象
六.數組
1.什麼是數組
數:數字,數值,數據...
組:一組,多個的,由多個成員構成的一個集體
數組:由多個值構成的有序集合
值就是前面我們講過的這些數據類型(各種數據類型都可以)
在數組中,每一個值都稱爲一個元素。
每一個元素在數組中的位置,我們稱爲索引,用數字來表示,從0開始。
js中數組的一些特性:
1,JavaScript數組是無類型的,數組元素可以是任意類型。
2,數組元素可以是任意值,包括對象和數組。
3,JS中的數組是動態的,根據需要它們會增長或縮減。
4,數組元素的索引不一定是連續的,它們之間可以有空缺。
5,JS中的數組是對象的特殊形式,但是它是經過優化的,效率會更高。
2.創建數組
在js中,創建數組有兩種方式:
ü 直接量(字面量)
ü new的方式
直接量(字面量)
new的方式
注意:
1,數組直接量中的值不一定是常量,也可以是任意的表達式
2,如果省略了某個元素,省略的元素將被賦預undefined
我們在定義一個數組時,要儘量避免這種情況
3,數組直接量允許有可選結尾的逗號
4,new Array()等價於[],創建了個空數組, new Array(n),表示創建指定長度的數組,數組中沒有索引和元素。
當new的時候,只有一個參數時,需要注意參數的數據類型。
如果參數是數值類型,那麼就意味着創建了指定長度爲該值的一個空數組。
3.數組基本操作
說到數組的操作,一般都會涉及到增刪改查。
利用數組的索引,可以進行相關的操作。
如果想獲取指定索引的元素
格式: 數組名[索引]
如:
增加:
修改:
對於添加和刪除,我們還有一些其它的方式,重點撐握:
添加元素:push(推)和unshift(shift是去掉,unshift是增加)
刪除元素:pop和shift
添加:
push, 在數組後面追加新的元素,如下:
push追加多個元素:
unshift, 在數組的前面插入新的元素,如下:
unshift追加多個元素,如下:
刪除:
pop:刪除數組中最後一個元素
shift:刪除數組中第一個元素
刪除操作和添加操作不太一樣:
pop和shift沒有參數,每一次只能刪除一個
pop和shift方法返回的是被刪除的元素。push和unshift返回的是一個新的數組的長度:
4.數組長度
每一個數組都有一個length屬性,用來表示數組的元素個數(長度)
在數組中肯定找不到一個元素的索引值大於或等於數組的長度
如何理解?
在數組中肯定找不到一個元素的索引值大於或等於數組的長度,爲了維持此規則不變,數組有兩個特殊的行爲:
ü 如果爲一個數組元素賦值,它的索引i大於或等於現有長度時,length的值將設置爲i+1
ü 當設置length屬性爲一個小於當前長度的非負整數n時,當前數組中的那些索引值大於或等於n的元素將從中刪除
第一句話的理解:
第二句話的理解:
5.數組遍歷
遍歷:把數組中的所有元素,挨個取出來,然後進行相應的操作,那麼這個獲取每一個元素的過程,就是遍歷,也叫做一個遍歷的過程。
在js中遍歷數組有兩個方法:
ü for循環 --- 傳統的遍歷方法,用的最多
ü forEach方法 --- ES5中新增的方法
for循環遍歷:
需要結合哪幾個條件,才能完成數組的遍歷?
ü fo循環
ü 數組的長度, length屬性
ü 使用數組名[索引值]獲取每一個元素
注意:不要使用for ... in去遍歷數組,因爲for ... in是遍歷對象的
6.多維數組
前面我們學習的都是一維數組。
在實際開發中,經常會使用二維數組或多維數組。
但是,js中,並不存在真正的多維多維數組,多維數組是通過一維數組和一些特性模擬出來的。
js中元素可以是任意數據類型。
如果我們在數組中存在了一個元素,這個元素剛好是一個數組,那麼就得到了二維數組。
問題1:如何去訪問這些元素?
問題2:如何去遍歷這個二維數組?
7.數組方法
查看W3C, 大至有如下方法:
常見方法如下:
ü join
ü reverse
ü concat
ü sort
ü slice
ü push和pop
ü unshift和shift
ü toString
join
將數組中的元素,使用某種符號連接起來,形成一個字符串。
注意,可以省略join中的參數,如果省略,默認就是使用逗號連接。
reverse
將數組中的元素,順序倒置:
使用reverse,數組是立即發生變量。
concat
連接多個數組,形成一個新的數組,可以理解成合並
注意:如果數組中的元素,又是一個數組,它不會展開。
sort
排序, 用於對數組中的元素進行排序
sort方法,默認情況下,是按照ascii來排序的,從小到大進行排序。
在具體排序時,是一個字符一個字符進行比較,如果第一個字符能夠分出勝負,就是它爲準,如果第一個字符相同,那麼就進行後續的比較,依次類推。
sort方法,允許我們傳遞一個參數,這個參數是一個函數,我們只可以通過這個函數來定義排序規則。
解釋:這個自定義函數是如何編寫的?
在定義這個規則時,我們需要兩個參數。
兩個數字在排序時,比如:6,5,如何排序?需要從低到高排,判斷兩者的大小,以決定是否需要交換位置。
a-b,如果a-b, 則返回true, 些時二者就需要交換順序,結果就是大的排在後面,小的排在前面。所以這種情況,就是從小到大的一種排序。
反之,就是從大到小的排序。
slice
切割的意思,用來截取數組中的片段
格式:arr.slice(start, end)
返回一個新的數組,包含從start到end(不包含這個end元素)
start, end是索引值
練習:
注意細節:
1,在使用slice時,必須要確保start<end,否則結果就是空數組。
2,如果我們省略了end, 那麼就表示截取到最後一個元素。
3,start和end可以爲負值,負數表示從後向前截取。如果是負數,只需要使用負數+length轉成正數
-4+6=2 -2+6=4 slice(2,4);
toString
是從object繼承過來的,意思是將數組轉化成字符串,如下:
使用數組相關的知識,完成如下案例:
分析:
當點擊下一張時:
結構和樣式代碼如下:
js代碼如下:
七.字符串
1.創建字符串
ü 字面量
ü new方式
字面量方式:
直接使用引號就可以,單引號,還是雙引號都可以:
new方式:
2.字符串常見操作
ü 獲取字符串長度 -- length屬性
ü 字符串連接 -- concat
ü 查找 -- charAt、charCodeAt、indexOf、lastIndexOf、search
ü 截取 -- substr、substring、slice
ü 大小寫轉換 -- toLowerCase、toUpperCase、
ü 替換 -- replace
ü 轉數組 -- split
length屬性
字符串的長度,字符的個數
concat
字符串連接,和+差不多
charAt
char是字符的意思, at表示在某個位置
可以將字符串看作字符數組,是有索引的,可以通過charAt(索引)獲取其中的某個字符
charCodeAt
和charAt類似,但是它不是獲取這個字符本身,而是獲取這個字符對應的ascii碼
indexOf
根據字符,獲取索引位置,和charAt剛好反過來
注意:indexOf, 自左至右, 找到的是對應的第一個字符的位置。
lastIndexOf
和indexOf類似,它是自右向左來查找第一個字符出現的位置
注意:是從右向左,但是索引值仍然是自左向右的
search
search真正強大的地方是正則表達式。
substr
substr(start, length), 第一個參數表示開始位置,第二個參數表示截取的長度
substring
substring(start, stop), 第一個參數表示開始位置,第二個參數表示結束位置
slice
toLowerCase, toUpperCase
大小寫轉換
replace
可以實現字符串的替換操作
注意:默認情況下,replace只替換一次, 真正強大的地方,也是在正規表達式中
split
轉數組
注意:字符串得有一定規律才能轉換成數組。
數組和字符串是可以互換的。
實際上,字符串本身就可以作爲一個數組來使用