片的位置搞的差不多了之后再來完善一下。你看這個(gè)Demo里面把鼠標(biāo)挪到圖片這里之后有沒有發(fā)現(xiàn)什么變化?鼠標(biāo)挪到圖片這里,鼠標(biāo)從箭頭變成了一個(gè)手指,這是第一個(gè)。鼠標(biāo)懸浮到圖片上的時(shí)候圖片是會放大的,所以接下來在圖片上加上這兩個(gè)效果。
·第一個(gè)效果也就是鼠標(biāo)挪過來之后從箭頭變成手指。這個(gè)怎么搞?其實(shí)很簡單,有個(gè)CSS的屬性也叫pointer,這個(gè)是光標(biāo)的意思。如果要讓它變成手指就是設(shè)置成pointer,然后保存,把鼠標(biāo)挪過來,挪到圖片范圍里面去就變成手指了,出來就變成箭頭了。
如果想換成別的也可以,比如crosshair,變成十字架了,換成pointer,第一個(gè)效果已經(jīng)實(shí)現(xiàn)了。
·第二個(gè)效果就是挪到圖片上之后會放大。這個(gè)怎么搞?其實(shí)也簡單,可以再加一個(gè)CSS選擇器。首先針對的是這些image元素,所以image要處理的是當(dāng)鼠標(biāo)懸浮到圖片上的時(shí)候是什么效果,所以后面加個(gè)冒號,再加上一個(gè)hover大括號。
hover是什么意思?就是懸停的意思,也就是這里面的一些設(shè)置只會在什么時(shí)候起效?就是當(dāng)鼠標(biāo)懸停到圖片上的時(shí)候可以實(shí)驗(yàn)一下看起不起效果。比如當(dāng)鼠標(biāo)懸停到圖片的時(shí)候讓圖片的邊框顯示出來,那就是border,width,3Pixel,border style,solid,實(shí)實(shí)線。它的顏色border,color,比如白色。
把鼠標(biāo)挪過來,這里的設(shè)置是不是只有在我這個(gè)鼠標(biāo),懸停到了某張圖片上的時(shí)候才會起效果。但是需要的效果不是把邊框顯示出來,是希望坤坤能夠變大,所以可以搞一個(gè)transform,這個(gè)是幾何變換的意思。
想讓坤坤變大肯定是縮放,這里有個(gè)scale是縮放,點(diǎn)一下,這里就可以設(shè)置坤坤到底要縮放成多大。這里可以填一個(gè)系數(shù),比如填個(gè)1.1就相當(dāng)于是會比原來大1.1倍,填個(gè)0.9就會比之前縮小10%。
這里來試一下,比如1.4,保存好移過來,是不是變大了?但是變大不像這邊這么絲滑,像是有一個(gè)過渡圖動畫一樣。這個(gè)怎么搞?也簡單,再加一個(gè)設(shè)置transition,這個(gè)就是變化的意思。
后面可以加上一個(gè)時(shí)間,也就是當(dāng)鼠標(biāo)挪過來之后不是會變大嗎?從原始大小變成這么大,這個(gè)過程需要多長時(shí)間?這個(gè)時(shí)間就可以在這里設(shè)置,比如搞個(gè)一秒鐘,就1S好保存,挪過來是不是一秒鐘的樣子?如果覺得時(shí)間太長了,可以再縮短,比如0.3,快一點(diǎn)了。
sx中大括號內(nèi)可以使用字符串、數(shù)字和其它 JavaScript 表達(dá)式,你甚至可以在 JSX 中傳遞對象
可以在哪里使用大括號:
1.用作JSX標(biāo)簽內(nèi)的文本:
<h1>{ title }Hello Word</h1> 是有效的,但是 <{tag}>這是一個(gè)無效的</{tag}> 無效。
2.用作緊跟在 = 符號后的 屬性
src={url} 會讀取 url 變量,但是 src="{url}" 只會傳一個(gè)字符串 {url}。
、語句
JavaScript 程序的執(zhí)行單位為行(line),也就是一行一行地執(zhí)行。一般情況下,每一行就是一個(gè)語句。
語句(statement)是為了完成某種任務(wù)而進(jìn)行的操作,比如下面就是一行賦值語句。
var a=1 + 3;
這條語句先用var命令,聲明了變量a,然后將1 + 3的運(yùn)算結(jié)果賦值給變量a。
1 + 3叫做表達(dá)式(expression),指一個(gè)為了得到返回值的計(jì)算式。語句和表達(dá)式的區(qū)別在于,前者主要為了進(jìn)行某種操作,一般情況下不需要返回值;后者則是為了得到返回值,一定會返回一個(gè)值。凡是 JavaScript 語言中預(yù)期為值的地方,都可以使用表達(dá)式。比如,賦值語句的等號右邊,預(yù)期是一個(gè)值,因此可以放置各種表達(dá)式。
語句以分號結(jié)尾,一個(gè)分號就表示一個(gè)語句結(jié)束。多個(gè)語句可以寫在一行內(nèi)。
var a=1 + 3 ; var b='abc';
分號前面可以沒有任何內(nèi)容,JavaScript 引擎將其視為空語句。
;;;
上面的代碼就表示3個(gè)空語句。
表達(dá)式不需要分號結(jié)尾。一旦在表達(dá)式后面添加分號,則 JavaScript 引擎就將表達(dá)式視為語句,這樣會產(chǎn)生一些沒有任何意義的語句。
1 + 3;'abc';
上面兩行語句只是單純地產(chǎn)生一個(gè)值,并沒有任何實(shí)際的意義。
2、變量
2.1、概念
變量是對“值”的具名引用。變量就是為“值”起名,然后引用這個(gè)名字,就等同于引用這個(gè)值。變量的名字就是變量名。
var a=1;
上面的代碼先聲明變量a,然后在變量a與數(shù)值1之間建立引用關(guān)系,稱為將數(shù)值1“賦值”給變量a。以后,引用變量名a就會得到數(shù)值1。最前面的var,是變量聲明命令。它表示通知解釋引擎,要?jiǎng)?chuàng)建一個(gè)變量a。
注意,JavaScript 的變量名區(qū)分大小寫,A和a是兩個(gè)不同的變量。
變量的聲明和賦值,是分開的兩個(gè)步驟,上面的代碼將它們合在了一起,實(shí)際的步驟是下面這樣。
var a; a=1;
如果只是聲明變量而沒有賦值,則該變量的值是undefined。undefined是一個(gè) JavaScript 關(guān)鍵字,表示“無定義”。
var a; a // undefined
如果變量賦值的時(shí)候,忘了寫var命令,這條語句也是有效的。
var a=1;// 基本等同a=1;
但是,不寫var的做法,不利于表達(dá)意圖,而且容易不知不覺地創(chuàng)建全局變量,所以建議總是使用var命令聲明變量。
如果一個(gè)變量沒有聲明就直接使用,JavaScript 會報(bào)錯(cuò),告訴你變量未定義。
x// ReferenceError: x is not defined
上面代碼直接使用變量x,系統(tǒng)就報(bào)錯(cuò),告訴你變量x沒有聲明。
可以在同一條var命令中聲明多個(gè)變量。
var a, b;
JavaScript 是一種動態(tài)類型語言,也就是說,變量的類型沒有限制,變量可以隨時(shí)更改類型。
var a=1; a='hello';
上面代碼中,變量a起先被賦值為一個(gè)數(shù)值,后來又被重新賦值為一個(gè)字符串。第二次賦值的時(shí)候,因?yàn)樽兞縜已經(jīng)存在,所以不需要使用var命令。
如果使用var重新聲明一個(gè)已經(jīng)存在的變量,是無效的。
var x=1;var x; x // 1
上面代碼中,變量x聲明了兩次,第二次聲明是無效的。
但是,如果第二次聲明的時(shí)候還進(jìn)行了賦值,則會覆蓋掉前面的值。
var x=1;var x=2;// 等同于var x=1;var x; x=2;
2.2、變量提升
JavaScript 引擎的工作方式是,先解析代碼,獲取所有被聲明的變量,然后再一行一行地運(yùn)行。這造成的結(jié)果,就是所有的變量的聲明語句,都會被提升到代碼的頭部,這就叫做變量提升(hoisting)。
console.log(a);var a=1;
上面代碼首先使用console.log方法,在控制臺(console)顯示變量a的值。這時(shí)變量a還沒有聲明和賦值,所以這是一種錯(cuò)誤的做法,但是實(shí)際上不會報(bào)錯(cuò)。因?yàn)榇嬖谧兞刻嵘嬲\(yùn)行的是下面的代碼。
var a;console.log(a); a=1;
最后的結(jié)果是顯示undefined,表示變量a已聲明,但還未賦值。
3、標(biāo)識符
標(biāo)識符(identifier)指的是用來識別各種值的合法名稱。最常見的標(biāo)識符就是變量名,以及后面要提到的函數(shù)名。JavaScript 語言的標(biāo)識符對大小寫敏感,所以a和A是兩個(gè)不同的標(biāo)識符。
標(biāo)識符有一套命名規(guī)則,不符合規(guī)則的就是非法標(biāo)識符。JavaScript 引擎遇到非法標(biāo)識符,就會報(bào)錯(cuò)。
簡單說,標(biāo)識符命名規(guī)則如下。
下面這些都是合法的標(biāo)識符。
arg0 _tmp $elem π
下面這些則是不合法的標(biāo)識符。
1a // 第一個(gè)字符不能是數(shù)字 23 // 同上 *** // 標(biāo)識符不能包含星號 a+b // 標(biāo)識符不能包含加號 -d // 標(biāo)識符不能包含減號或連詞線
中文是合法的標(biāo)識符,可以用作變量名。
var 臨時(shí)變量=1;
JavaScript 有一些保留字,不能用作標(biāo)識符:arguments、break、case、catch、class、const、continue、debugger、default、delete、do、else、enum、eval、export、extends、false、finally、for、function、if、implements、import、in、instanceof、interface、let、new、null、package、private、protected、public、return、static、super、switch、this、throw、true、try、typeof、var、void、while、with、yield。
4、注釋
源碼中被 JavaScript 引擎忽略的部分就叫做注釋,它的作用是對代碼進(jìn)行解釋。Javascript 提供兩種注釋的寫法:一種是單行注釋,用//起頭;另一種是多行注釋,放在/*和*/之間。
// 這是單行注釋/* 這是 多行 注釋 */
此外,由于歷史上 JavaScript 可以兼容 HTML 代碼的注釋,所以<!--和-->也被視為合法的單行注釋。
x=1; <!-- x=2; --> x=3;
上面代碼中,只有x=1會執(zhí)行,其他的部分都被注釋掉了。
需要注意的是,-->只有在行首,才會被當(dāng)成單行注釋,否則會當(dāng)作正常的運(yùn)算。
function countdown(n) { while (n --> 0) console.log(n); } countdown(3)// 2// 1// 0
上面代碼中,n --> 0實(shí)際上會當(dāng)作n-- > 0,因此輸出2、1、0。
5、區(qū)塊
JavaScript 使用大括號,將多個(gè)相關(guān)的語句組合在一起,稱為“區(qū)塊”(block)。
對于var命令來說,JavaScript 的區(qū)塊不構(gòu)成單獨(dú)的作用域(scope)。
{ var a=1; } a // 1
上面代碼在區(qū)塊內(nèi)部,使用var命令聲明并賦值了變量a,然后在區(qū)塊外部,變量a依然有效,區(qū)塊對于var命令不構(gòu)成單獨(dú)的作用域,與不使用區(qū)塊的情況沒有任何區(qū)別。在 JavaScript 語言中,單獨(dú)使用區(qū)塊并不常見,區(qū)塊往往用來構(gòu)成其他更復(fù)雜的語法結(jié)構(gòu),比如for、if、while、function等。
6、條件語句
JavaScript 提供if結(jié)構(gòu)和switch結(jié)構(gòu),完成條件判斷,即只有滿足預(yù)設(shè)的條件,才會執(zhí)行相應(yīng)的語句。
6.1、if 結(jié)構(gòu)
if結(jié)構(gòu)先判斷一個(gè)表達(dá)式的布爾值,然后根據(jù)布爾值的真?zhèn)危瑘?zhí)行不同的語句。所謂布爾值,指的是 JavaScript 的兩個(gè)特殊值,true表示真,false表示偽。
if (布爾值) 語句; // 或者if (布爾值) 語句;
上面是if結(jié)構(gòu)的基本形式。需要注意的是,“布爾值”往往由一個(gè)條件表達(dá)式產(chǎn)生的,必須放在圓括號中,表示對表達(dá)式求值。如果表達(dá)式的求值結(jié)果為true,就執(zhí)行緊跟在后面的語句;如果結(jié)果為false,則跳過緊跟在后面的語句。
if (m===3) m=m + 1;
上面代碼表示,只有在m等于3時(shí),才會將其值加上1。
這種寫法要求條件表達(dá)式后面只能有一個(gè)語句。如果想執(zhí)行多個(gè)語句,必須在if的條件判斷之后,加上大括號,表示代碼塊(多個(gè)語句合并成一個(gè)語句)。
if (m===3) { m +=1; }
建議總是在if語句中使用大括號,因?yàn)檫@樣方便插入語句。
注意,if后面的表達(dá)式之中,不要混淆賦值表達(dá)式(=)、嚴(yán)格相等運(yùn)算符(===)和相等運(yùn)算符(==)。尤其是賦值表達(dá)式不具有比較作用。
var x=1;var y=2; if (x=y) { console.log(x); }// "2"
上面代碼的原意是,當(dāng)x等于y的時(shí)候,才執(zhí)行相關(guān)語句。但是,不小心將嚴(yán)格相等運(yùn)算符寫成賦值表達(dá)式,結(jié)果變成了將y賦值給變量x,再判斷變量x的值(等于2)的布爾值(結(jié)果為true)。
這種錯(cuò)誤可以正常生成一個(gè)布爾值,因而不會報(bào)錯(cuò)。為了避免這種情況,有些開發(fā)者習(xí)慣將常量寫在運(yùn)算符的左邊,這樣的話,一旦不小心將相等運(yùn)算符寫成賦值運(yùn)算符,就會報(bào)錯(cuò),因?yàn)槌A坎荒鼙毁x值。
if (x=2) { // 不報(bào)錯(cuò) if (2=x) { // 報(bào)錯(cuò)
至于為什么優(yōu)先采用“嚴(yán)格相等運(yùn)算符”(===),而不是“相等運(yùn)算符”(==),請參考《運(yùn)算符》章節(jié)。
6.2、if...else 結(jié)構(gòu)
if代碼塊后面,還可以跟一個(gè)else代碼塊,表示不滿足條件時(shí),所要執(zhí)行的代碼。
if (m===3) { // 滿足條件時(shí),執(zhí)行的語句 } else { // 不滿足條件時(shí),執(zhí)行的語句 }
上面代碼判斷變量m是否等于3,如果等于就執(zhí)行if代碼塊,否則執(zhí)行else代碼塊。
對同一個(gè)變量進(jìn)行多次判斷時(shí),多個(gè)if...else語句可以連寫在一起。
if (m===0) { // ...} else if (m===1) { // ...} else if (m===2) { // ...} else { // ...}
else代碼塊總是與離自己最近的那個(gè)if語句配對。
var m=1; var n=2; if (m !==1) if (n===2) console.log('hello'); else console.log('world');
上面代碼不會有任何輸出,else代碼塊不會得到執(zhí)行,因?yàn)樗氖亲罱哪莻€(gè)if語句,相當(dāng)于下面這樣。
if (m !==1) { if (n===2) { console.log('hello'); } else { console.log('world'); } }
如果想讓else代碼塊跟隨最上面的那個(gè)if語句,就要改變大括號的位置。
if (m !==1) { if (n===2) { console.log('hello'); } } else { console.log('world'); }// world
6.3、switch 結(jié)構(gòu)
多個(gè)if...else連在一起使用的時(shí)候,可以轉(zhuǎn)為使用更方便的switch結(jié)構(gòu)。
switch (fruit) { case "banana": // ... break; case "apple": // ... break; default: // ...}
上面代碼根據(jù)變量fruit的值,選擇執(zhí)行相應(yīng)的case。如果所有case都不符合,則執(zhí)行最后的default部分。需要注意的是,每個(gè)case代碼塊內(nèi)部的break語句不能少,否則會接下去執(zhí)行下一個(gè)case代碼塊,而不是跳出switch結(jié)構(gòu)。
var x=1; switch (x) { case 1: console.log('x 等于1'); case 2: console.log('x 等于2'); default: console.log('x 等于其他值'); }// x等于1// x等于2// x等于其他值
上面代碼中,case代碼塊之中沒有break語句,導(dǎo)致不會跳出switch結(jié)構(gòu),而會一直執(zhí)行下去。正確的寫法是像下面這樣。
switch (x) { case 1: console.log('x 等于1'); break; case 2: console.log('x 等于2'); break; default: console.log('x 等于其他值'); }
switch語句部分和case語句部分,都可以使用表達(dá)式。
switch (1 + 3) { case 2 + 2: f(); break; default: neverHappens(); }
上面代碼的default部分,是永遠(yuǎn)不會執(zhí)行到的。
需要注意的是,switch語句后面的表達(dá)式,與case語句后面的表示式比較運(yùn)行結(jié)果時(shí),采用的是嚴(yán)格相等運(yùn)算符(===),而不是相等運(yùn)算符(==),這意味著比較時(shí)不會發(fā)生類型轉(zhuǎn)換。
var x=1; switch (x) { case true: console.log('x 發(fā)生類型轉(zhuǎn)換'); break; default: console.log('x 沒有發(fā)生類型轉(zhuǎn)換'); }// x 沒有發(fā)生類型轉(zhuǎn)換
上面代碼中,由于變量x沒有發(fā)生類型轉(zhuǎn)換,所以不會執(zhí)行case true的情況。這表明,switch語句內(nèi)部采用的是“嚴(yán)格相等運(yùn)算符”,詳細(xì)解釋請參考《運(yùn)算符》一節(jié)。
6.4、三元運(yùn)算符 ?:
JavaScript 還有一個(gè)三元運(yùn)算符(即該運(yùn)算符需要三個(gè)運(yùn)算子)?:,也可以用于邏輯判斷。
(條件) ? 表達(dá)式1 : 表達(dá)式2
上面代碼中,如果“條件”為true,則返回“表達(dá)式1”的值,否則返回“表達(dá)式2”的值。
var even=(n % 2===0) ? true : false;
上面代碼中,如果n可以被2整除,則even等于true,否則等于false。它等同于下面的形式。
var even;if (n % 2===0) { even=true; } else { even=false; }
這個(gè)三元運(yùn)算符可以被視為if...else...的簡寫形式,因此可以用于多種場合。
var myVar;console.log( myVar ? 'myVar has a value' : 'myVar does not have a value') // myVar does not have a value
上面代碼利用三元運(yùn)算符,輸出相應(yīng)的提示。
var msg='數(shù)字' + n + '是' + (n % 2===0 ? '偶數(shù)' : '奇數(shù)');
上面代碼利用三元運(yùn)算符,在字符串之中插入不同的值。
7、循環(huán)語句
循環(huán)語句用于重復(fù)執(zhí)行某個(gè)操作,它有多種形式。
7.1、while 循環(huán)
While語句包括一個(gè)循環(huán)條件和一段代碼塊,只要條件為真,就不斷循環(huán)執(zhí)行代碼塊。
while (條件) 語句;// 或者while (條件) 語句;
while語句的循環(huán)條件是一個(gè)表達(dá)式,必須放在圓括號中。代碼塊部分,如果只有一條語句,可以省略大括號,否則就必須加上大括號。
while (條件) { 語句; }
下面是while語句的一個(gè)例子。
var i=0;while (i < 100) { console.log('i 當(dāng)前為:' + i); i=i + 1; }
上面的代碼將循環(huán)100次,直到i等于100為止。
下面的例子是一個(gè)無限循環(huán),因?yàn)檠h(huán)條件總是為真。
while (true) { console.log('Hello, world'); }
7.2、for 循環(huán)
for語句是循環(huán)命令的另一種形式,可以指定循環(huán)的起點(diǎn)、終點(diǎn)和終止條件。它的格式如下。
for (初始化表達(dá)式; 條件; 遞增表達(dá)式) 語句// 或者for (初始化表達(dá)式; 條件; 遞增表達(dá)式) { 語句 }
for語句后面的括號里面,有三個(gè)表達(dá)式。
下面是一個(gè)例子。
var x=3;for (var i=0; i < x; i++) { console.log(i); }// 0// 1// 2
上面代碼中,初始化表達(dá)式是var i=0,即初始化一個(gè)變量i;測試表達(dá)式是i < x,即只要i小于x,就會執(zhí)行循環(huán);遞增表達(dá)式是i++,即每次循環(huán)結(jié)束后,i增大1。
所有for循環(huán),都可以改寫成while循環(huán)。上面的例子改為while循環(huán),代碼如下。
var x=3;var i=0;while (i < x) { console.log(i); i++; }
for語句的三個(gè)部分(initialize、test、increment),可以省略任何一個(gè),也可以全部省略。
for ( ; ; ){ console.log('Hello World'); }
上面代碼省略了for語句表達(dá)式的三個(gè)部分,結(jié)果就導(dǎo)致了一個(gè)無限循環(huán)。
7.3、do...while 循環(huán)
do...while循環(huán)與while循環(huán)類似,唯一的區(qū)別就是先運(yùn)行一次循環(huán)體,然后判斷循環(huán)條件。
do 語句while (條件);// 或者do { 語句 } while (條件);
不管條件是否為真,do...while循環(huán)至少運(yùn)行一次,這是這種結(jié)構(gòu)最大的特點(diǎn)。另外,while語句后面的分號注意不要省略。
下面是一個(gè)例子。
var x=3;var i=0;do { console.log(i); i++; } while(i < x);
7.4、break 語句和 continue 語句
break語句和continue語句都具有跳轉(zhuǎn)作用,可以讓代碼不按既有的順序執(zhí)行。
break語句用于跳出代碼塊或循環(huán)。
var i=0;while(i < 100) { console.log('i 當(dāng)前為:' + i); i++; if (i===10) break; }
上面代碼只會執(zhí)行10次循環(huán),一旦i等于10,就會跳出循環(huán)。
for循環(huán)也可以使用break語句跳出循環(huán)。
for (var i=0; i < 5; i++) { console.log(i); if (i===3) break; }// 0// 1// 2// 3
上面代碼執(zhí)行到i等于3,就會跳出循環(huán)。
continue語句用于立即終止本輪循環(huán),返回循環(huán)結(jié)構(gòu)的頭部,開始下一輪循環(huán)。
var i=0;while (i < 100){ i++; if (i % 2===0) continue; console.log('i 當(dāng)前為:' + i); }
上面代碼只有在i為奇數(shù)時(shí),才會輸出i的值。如果i為偶數(shù),則直接進(jìn)入下一輪循環(huán)。
如果存在多重循環(huán),不帶參數(shù)的break語句和continue語句都只針對最內(nèi)層循環(huán)。
7.5、標(biāo)簽(label)
JavaScript 語言允許,語句的前面有標(biāo)簽(label),相當(dāng)于定位符,用于跳轉(zhuǎn)到程序的任意位置,標(biāo)簽的格式如下。
label: 語句
標(biāo)簽可以是任意的標(biāo)識符,但不能是保留字,語句部分可以是任意語句。
標(biāo)簽通常與break語句和continue語句配合使用,跳出特定的循環(huán)。
top: for (var i=0; i < 3; i++){ for (var j=0; j < 3; j++){ if (i===1 && j===1) break top; console.log('i=' + i + ', j=' + j); } }// i=0, j=0// i=0, j=1// i=0, j=2// i=1, j=0
上面代碼為一個(gè)雙重循環(huán)區(qū)塊,break命令后面加上了top標(biāo)簽(注意,top不用加引號),滿足條件時(shí),直接跳出雙層循環(huán)。如果break語句后面不使用標(biāo)簽,則只能跳出內(nèi)層循環(huán),進(jìn)入下一次的外層循環(huán)。
標(biāo)簽也可以用于跳出代碼塊。
foo: { console.log(1); break foo; console.log('本行不會輸出'); }console.log(2);// 1// 2
上面代碼執(zhí)行到break foo,就會跳出區(qū)塊。
continue語句也可以與標(biāo)簽配合使用。
top: for (var i=0; i < 3; i++){ for (var j=0; j < 3; j++){ if (i===1 && j===1) continue top; console.log('i=' + i + ', j=' + j); } } // i=0, j=0 // i=0, j=1 // i=0, j=2 // i=1, j=0 // i=2, j=0 // i=2, j=1 // i=2, j=2
上面代碼中,continue命令后面有一個(gè)標(biāo)簽名,滿足條件時(shí),會跳過當(dāng)前循環(huán),直接進(jìn)入下一輪外層循環(huán)。如果continue語句后面不使用標(biāo)簽,則只能進(jìn)入下一輪的內(nèi)層循環(huán)。
推薦閱讀:
「JavaScript 教程」入門篇-導(dǎo)論
「JavaScript 教程」數(shù)據(jù)類型-數(shù)組
「JavaScript 教程」數(shù)據(jù)類型-對象
詳解 js 閉包(圖文版)
js 中原型和原型鏈深入理解
*請認(rèn)真填寫需求信息,我們會在24小時(shí)內(nèi)與您取得聯(lián)系。