JavaScript筆記

一.初識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

轉數組

注意:字符串得有一定規律才能轉換成數組。

 

數組和字符串是可以互換的。

 

實際上,字符串本身就可以作爲一個數組來使用

發佈了63 篇原創文章 · 獲贊 115 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章