、語句
JavaScript 程序的執(zhí)行單位為行(line),也就是一行一行地執(zhí)行。一般情況下,每一行就是一個語句。
語句(statement)是為了完成某種任務而進行的操作,比如下面就是一行賦值語句。
var a=1 + 3;
這條語句先用var命令,聲明了變量a,然后將1 + 3的運算結(jié)果賦值給變量a。
1 + 3叫做表達式(expression),指一個為了得到返回值的計算式。語句和表達式的區(qū)別在于,前者主要為了進行某種操作,一般情況下不需要返回值;后者則是為了得到返回值,一定會返回一個值。凡是 JavaScript 語言中預期為值的地方,都可以使用表達式。比如,賦值語句的等號右邊,預期是一個值,因此可以放置各種表達式。
語句以分號結(jié)尾,一個分號就表示一個語句結(jié)束。多個語句可以寫在一行內(nèi)。
var a=1 + 3 ; var b='abc';
分號前面可以沒有任何內(nèi)容,JavaScript 引擎將其視為空語句。
;;;
上面的代碼就表示3個空語句。
表達式不需要分號結(jié)尾。一旦在表達式后面添加分號,則 JavaScript 引擎就將表達式視為語句,這樣會產(chǎn)生一些沒有任何意義的語句。
1 + 3;'abc';
上面兩行語句只是單純地產(chǎn)生一個值,并沒有任何實際的意義。
2、變量
2.1、概念
變量是對“值”的具名引用。變量就是為“值”起名,然后引用這個名字,就等同于引用這個值。變量的名字就是變量名。
var a=1;
上面的代碼先聲明變量a,然后在變量a與數(shù)值1之間建立引用關系,稱為將數(shù)值1“賦值”給變量a。以后,引用變量名a就會得到數(shù)值1。最前面的var,是變量聲明命令。它表示通知解釋引擎,要創(chuàng)建一個變量a。
注意,JavaScript 的變量名區(qū)分大小寫,A和a是兩個不同的變量。
變量的聲明和賦值,是分開的兩個步驟,上面的代碼將它們合在了一起,實際的步驟是下面這樣。
var a; a=1;
如果只是聲明變量而沒有賦值,則該變量的值是undefined。undefined是一個 JavaScript 關鍵字,表示“無定義”。
var a; a // undefined
如果變量賦值的時候,忘了寫var命令,這條語句也是有效的。
var a=1;// 基本等同a=1;
但是,不寫var的做法,不利于表達意圖,而且容易不知不覺地創(chuàng)建全局變量,所以建議總是使用var命令聲明變量。
如果一個變量沒有聲明就直接使用,JavaScript 會報錯,告訴你變量未定義。
x// ReferenceError: x is not defined
上面代碼直接使用變量x,系統(tǒng)就報錯,告訴你變量x沒有聲明。
可以在同一條var命令中聲明多個變量。
var a, b;
JavaScript 是一種動態(tài)類型語言,也就是說,變量的類型沒有限制,變量可以隨時更改類型。
var a=1; a='hello';
上面代碼中,變量a起先被賦值為一個數(shù)值,后來又被重新賦值為一個字符串。第二次賦值的時候,因為變量a已經(jīng)存在,所以不需要使用var命令。
如果使用var重新聲明一個已經(jīng)存在的變量,是無效的。
var x=1;var x; x // 1
上面代碼中,變量x聲明了兩次,第二次聲明是無效的。
但是,如果第二次聲明的時候還進行了賦值,則會覆蓋掉前面的值。
var x=1;var x=2;// 等同于var x=1;var x; x=2;
2.2、變量提升
JavaScript 引擎的工作方式是,先解析代碼,獲取所有被聲明的變量,然后再一行一行地運行。這造成的結(jié)果,就是所有的變量的聲明語句,都會被提升到代碼的頭部,這就叫做變量提升(hoisting)。
console.log(a);var a=1;
上面代碼首先使用console.log方法,在控制臺(console)顯示變量a的值。這時變量a還沒有聲明和賦值,所以這是一種錯誤的做法,但是實際上不會報錯。因為存在變量提升,真正運行的是下面的代碼。
var a;console.log(a); a=1;
最后的結(jié)果是顯示undefined,表示變量a已聲明,但還未賦值。
3、標識符
標識符(identifier)指的是用來識別各種值的合法名稱。最常見的標識符就是變量名,以及后面要提到的函數(shù)名。JavaScript 語言的標識符對大小寫敏感,所以a和A是兩個不同的標識符。
標識符有一套命名規(guī)則,不符合規(guī)則的就是非法標識符。JavaScript 引擎遇到非法標識符,就會報錯。
簡單說,標識符命名規(guī)則如下。
下面這些都是合法的標識符。
arg0 _tmp $elem π
下面這些則是不合法的標識符。
1a // 第一個字符不能是數(shù)字 23 // 同上 *** // 標識符不能包含星號 a+b // 標識符不能包含加號 -d // 標識符不能包含減號或連詞線
中文是合法的標識符,可以用作變量名。
var 臨時變量=1;
JavaScript 有一些保留字,不能用作標識符: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 引擎忽略的部分就叫做注釋,它的作用是對代碼進行解釋。Javascript 提供兩種注釋的寫法:一種是單行注釋,用//起頭;另一種是多行注釋,放在/*和*/之間。
// 這是單行注釋/* 這是 多行 注釋 */
此外,由于歷史上 JavaScript 可以兼容 HTML 代碼的注釋,所以<!--和-->也被視為合法的單行注釋。
x=1; <!-- x=2; --> x=3;
上面代碼中,只有x=1會執(zhí)行,其他的部分都被注釋掉了。
需要注意的是,-->只有在行首,才會被當成單行注釋,否則會當作正常的運算。
function countdown(n) { while (n --> 0) console.log(n); } countdown(3)// 2// 1// 0
上面代碼中,n --> 0實際上會當作n-- > 0,因此輸出2、1、0。
5、區(qū)塊
JavaScript 使用大括號,將多個相關的語句組合在一起,稱為“區(qū)塊”(block)。
對于var命令來說,JavaScript 的區(qū)塊不構成單獨的作用域(scope)。
{ var a=1; } a // 1
上面代碼在區(qū)塊內(nèi)部,使用var命令聲明并賦值了變量a,然后在區(qū)塊外部,變量a依然有效,區(qū)塊對于var命令不構成單獨的作用域,與不使用區(qū)塊的情況沒有任何區(qū)別。在 JavaScript 語言中,單獨使用區(qū)塊并不常見,區(qū)塊往往用來構成其他更復雜的語法結(jié)構,比如for、if、while、function等。
6、條件語句
JavaScript 提供if結(jié)構和switch結(jié)構,完成條件判斷,即只有滿足預設的條件,才會執(zhí)行相應的語句。
6.1、if 結(jié)構
if結(jié)構先判斷一個表達式的布爾值,然后根據(jù)布爾值的真?zhèn)危瑘?zhí)行不同的語句。所謂布爾值,指的是 JavaScript 的兩個特殊值,true表示真,false表示偽。
if (布爾值) 語句; // 或者if (布爾值) 語句;
上面是if結(jié)構的基本形式。需要注意的是,“布爾值”往往由一個條件表達式產(chǎn)生的,必須放在圓括號中,表示對表達式求值。如果表達式的求值結(jié)果為true,就執(zhí)行緊跟在后面的語句;如果結(jié)果為false,則跳過緊跟在后面的語句。
if (m===3) m=m + 1;
上面代碼表示,只有在m等于3時,才會將其值加上1。
這種寫法要求條件表達式后面只能有一個語句。如果想執(zhí)行多個語句,必須在if的條件判斷之后,加上大括號,表示代碼塊(多個語句合并成一個語句)。
if (m===3) { m +=1; }
建議總是在if語句中使用大括號,因為這樣方便插入語句。
注意,if后面的表達式之中,不要混淆賦值表達式(=)、嚴格相等運算符(===)和相等運算符(==)。尤其是賦值表達式不具有比較作用。
var x=1;var y=2; if (x=y) { console.log(x); }// "2"
上面代碼的原意是,當x等于y的時候,才執(zhí)行相關語句。但是,不小心將嚴格相等運算符寫成賦值表達式,結(jié)果變成了將y賦值給變量x,再判斷變量x的值(等于2)的布爾值(結(jié)果為true)。
這種錯誤可以正常生成一個布爾值,因而不會報錯。為了避免這種情況,有些開發(fā)者習慣將常量寫在運算符的左邊,這樣的話,一旦不小心將相等運算符寫成賦值運算符,就會報錯,因為常量不能被賦值。
if (x=2) { // 不報錯 if (2=x) { // 報錯
至于為什么優(yōu)先采用“嚴格相等運算符”(===),而不是“相等運算符”(==),請參考《運算符》章節(jié)。
6.2、if...else 結(jié)構
if代碼塊后面,還可以跟一個else代碼塊,表示不滿足條件時,所要執(zhí)行的代碼。
if (m===3) { // 滿足條件時,執(zhí)行的語句 } else { // 不滿足條件時,執(zhí)行的語句 }
上面代碼判斷變量m是否等于3,如果等于就執(zhí)行if代碼塊,否則執(zhí)行else代碼塊。
對同一個變量進行多次判斷時,多個if...else語句可以連寫在一起。
if (m===0) { // ...} else if (m===1) { // ...} else if (m===2) { // ...} else { // ...}
else代碼塊總是與離自己最近的那個if語句配對。
var m=1; var n=2; if (m !==1) if (n===2) console.log('hello'); else console.log('world');
上面代碼不會有任何輸出,else代碼塊不會得到執(zhí)行,因為它跟著的是最近的那個if語句,相當于下面這樣。
if (m !==1) { if (n===2) { console.log('hello'); } else { console.log('world'); } }
如果想讓else代碼塊跟隨最上面的那個if語句,就要改變大括號的位置。
if (m !==1) { if (n===2) { console.log('hello'); } } else { console.log('world'); }// world
6.3、switch 結(jié)構
多個if...else連在一起使用的時候,可以轉(zhuǎn)為使用更方便的switch結(jié)構。
switch (fruit) { case "banana": // ... break; case "apple": // ... break; default: // ...}
上面代碼根據(jù)變量fruit的值,選擇執(zhí)行相應的case。如果所有case都不符合,則執(zhí)行最后的default部分。需要注意的是,每個case代碼塊內(nèi)部的break語句不能少,否則會接下去執(zhí)行下一個case代碼塊,而不是跳出switch結(jié)構。
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語句,導致不會跳出switch結(jié)構,而會一直執(zhí)行下去。正確的寫法是像下面這樣。
switch (x) { case 1: console.log('x 等于1'); break; case 2: console.log('x 等于2'); break; default: console.log('x 等于其他值'); }
switch語句部分和case語句部分,都可以使用表達式。
switch (1 + 3) { case 2 + 2: f(); break; default: neverHappens(); }
上面代碼的default部分,是永遠不會執(zhí)行到的。
需要注意的是,switch語句后面的表達式,與case語句后面的表示式比較運行結(jié)果時,采用的是嚴格相等運算符(===),而不是相等運算符(==),這意味著比較時不會發(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)部采用的是“嚴格相等運算符”,詳細解釋請參考《運算符》一節(jié)。
6.4、三元運算符 ?:
JavaScript 還有一個三元運算符(即該運算符需要三個運算子)?:,也可以用于邏輯判斷。
(條件) ? 表達式1 : 表達式2
上面代碼中,如果“條件”為true,則返回“表達式1”的值,否則返回“表達式2”的值。
var even=(n % 2===0) ? true : false;
上面代碼中,如果n可以被2整除,則even等于true,否則等于false。它等同于下面的形式。
var even;if (n % 2===0) { even=true; } else { even=false; }
這個三元運算符可以被視為if...else...的簡寫形式,因此可以用于多種場合。
var myVar;console.log( myVar ? 'myVar has a value' : 'myVar does not have a value') // myVar does not have a value
上面代碼利用三元運算符,輸出相應的提示。
var msg='數(shù)字' + n + '是' + (n % 2===0 ? '偶數(shù)' : '奇數(shù)');
上面代碼利用三元運算符,在字符串之中插入不同的值。
7、循環(huán)語句
循環(huán)語句用于重復執(zhí)行某個操作,它有多種形式。
7.1、while 循環(huán)
While語句包括一個循環(huán)條件和一段代碼塊,只要條件為真,就不斷循環(huán)執(zhí)行代碼塊。
while (條件) 語句;// 或者while (條件) 語句;
while語句的循環(huán)條件是一個表達式,必須放在圓括號中。代碼塊部分,如果只有一條語句,可以省略大括號,否則就必須加上大括號。
while (條件) { 語句; }
下面是while語句的一個例子。
var i=0;while (i < 100) { console.log('i 當前為:' + i); i=i + 1; }
上面的代碼將循環(huán)100次,直到i等于100為止。
下面的例子是一個無限循環(huán),因為循環(huán)條件總是為真。
while (true) { console.log('Hello, world'); }
7.2、for 循環(huán)
for語句是循環(huán)命令的另一種形式,可以指定循環(huán)的起點、終點和終止條件。它的格式如下。
for (初始化表達式; 條件; 遞增表達式) 語句// 或者for (初始化表達式; 條件; 遞增表達式) { 語句 }
for語句后面的括號里面,有三個表達式。
下面是一個例子。
var x=3;for (var i=0; i < x; i++) { console.log(i); }// 0// 1// 2
上面代碼中,初始化表達式是var i=0,即初始化一個變量i;測試表達式是i < x,即只要i小于x,就會執(zhí)行循環(huán);遞增表達式是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語句的三個部分(initialize、test、increment),可以省略任何一個,也可以全部省略。
for ( ; ; ){ console.log('Hello World'); }
上面代碼省略了for語句表達式的三個部分,結(jié)果就導致了一個無限循環(huán)。
7.3、do...while 循環(huán)
do...while循環(huán)與while循環(huán)類似,唯一的區(qū)別就是先運行一次循環(huán)體,然后判斷循環(huán)條件。
do 語句while (條件);// 或者do { 語句 } while (條件);
不管條件是否為真,do...while循環(huán)至少運行一次,這是這種結(jié)構最大的特點。另外,while語句后面的分號注意不要省略。
下面是一個例子。
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 當前為:' + 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é)構的頭部,開始下一輪循環(huán)。
var i=0;while (i < 100){ i++; if (i % 2===0) continue; console.log('i 當前為:' + i); }
上面代碼只有在i為奇數(shù)時,才會輸出i的值。如果i為偶數(shù),則直接進入下一輪循環(huán)。
如果存在多重循環(huán),不帶參數(shù)的break語句和continue語句都只針對最內(nèi)層循環(huán)。
7.5、標簽(label)
JavaScript 語言允許,語句的前面有標簽(label),相當于定位符,用于跳轉(zhuǎn)到程序的任意位置,標簽的格式如下。
label: 語句
標簽可以是任意的標識符,但不能是保留字,語句部分可以是任意語句。
標簽通常與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
上面代碼為一個雙重循環(huán)區(qū)塊,break命令后面加上了top標簽(注意,top不用加引號),滿足條件時,直接跳出雙層循環(huán)。如果break語句后面不使用標簽,則只能跳出內(nèi)層循環(huán),進入下一次的外層循環(huán)。
標簽也可以用于跳出代碼塊。
foo: { console.log(1); break foo; console.log('本行不會輸出'); }console.log(2);// 1// 2
上面代碼執(zhí)行到break foo,就會跳出區(qū)塊。
continue語句也可以與標簽配合使用。
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命令后面有一個標簽名,滿足條件時,會跳過當前循環(huán),直接進入下一輪外層循環(huán)。如果continue語句后面不使用標簽,則只能進入下一輪的內(nèi)層循環(huán)。
推薦閱讀:
「JavaScript 教程」入門篇-導論
「JavaScript 教程」數(shù)據(jù)類型-數(shù)組
「JavaScript 教程」數(shù)據(jù)類型-對象
詳解 js 閉包(圖文版)
js 中原型和原型鏈深入理解
讀本文約需要10分鐘,您可以先關注我們,避免下次無法找到。
本篇文章成哥繼續(xù)帶大家來學習前端教程之VUE,它是一個前端框架具有高效、簡單及易用等特點。下面我們就一起來學習內(nèi)容吧!
Vue (讀音 /vju?/,類似于 view) 是一套用于構建用戶界面的漸進式框架。
與其它大型框架不同的是,Vue 被設計為可以自底向上逐層應用。
Vue 的核心庫只關注視圖層,不僅易于上手,還便于與第三方庫或既有項目整合。
另一方面,當與現(xiàn)代化的工具鏈以及各種支持類庫結(jié)合使用時,Vue 也完全能夠為復雜的單頁應用提供驅(qū)動。
該框架的作者是一位中國人叫尤雨溪,畢業(yè)于上海復旦附中,在美國完成大學學業(yè),本科畢業(yè)于上 Colgate University,后在 Parsons 設計學院獲得 Design & Technology 藝術碩士學位,任職于紐約 Google Creative Lab。
目前作者以技術顧問的身份加入了阿里巴巴的 Weex 團隊來做 Vue 和 Weex 的 JavaScript runtime 整合,目標是讓大家能用 Vue 的語法跨三端。
VUE可以像我們之前jQuery教程一樣將VUE.js下載下來進行引用,也可以通過CDN方式引用,還可以通過VUE-CLI來安裝(VUE-CLI需要通過NPM安裝,在后面的教程中成哥將專門推出一篇NPM入門教程,在這邊就不詳細講解了),在這邊我們登陸到VUE官網(wǎng)來下載VUE.js然后進行引用,具體操作如下:
1.登陸VUE官網(wǎng)下載vue.js文件
2.在HTML文件中引用vue.js文件
1. <!DOCTYPE html>
2. <html>
3. <head>
4. <meta charset="UTF-8">
5. <title>VUE基礎教程</title>
6. <!-- 引用vue.js文件 -->
7. <script src="vue.js"></script>
8. </head>
9. <body>
10.
11. </body>
12. </html>
(1)VUE實例
每個 Vue 應用都是通過用 Vue 函數(shù)創(chuàng)建一個新的 Vue 實例開始的
1. var vm = new Vue({
2. // 選項
3. })
當創(chuàng)建一個 Vue 實例時,你可以傳入一個選項對象,下面我們就來看看怎么通過實例將選項對象渲染在頁面的
1. <!DOCTYPE html>
2. <html>
3. <head>
4. <meta charset="UTF-8">
5. <title>VUE基礎教程</title>
6. <!-- 引用vue.js文件 -->
7. <script src="vue.js"></script>
8. </head>
9. <body>
10. <!-- 這邊的{{msg}}中的msg就是變量,vue會根據(jù)變量名到data數(shù)據(jù)對象中找到其對應的值然后渲染 -->
11. <div id="app">{{msg}}</div>
12. <script>
13. var vm = new Vue({
14. el: '#app', // dom的掛載點,這邊將dom掛載到id為app的標簽上
15. data: { // 數(shù)據(jù)對象
16. msg: "hello vue" // 定義變量值
17. }
18. })
19. </script>
20. </body>
21. </html>
上述代碼渲染結(jié)果如下
每個 Vue 實例在被創(chuàng)建時都要經(jīng)過一系列的初始化過程——例如,需要設置數(shù)據(jù)監(jiān)聽、編譯模板、將實例掛載到 DOM 并在數(shù)據(jù)變化時更新 DOM 等。同時在這個過程中也會運行一些叫做生命周期鉤子的函數(shù),這給了用戶在不同階段添加自己的代碼的機會。比如 created 鉤子可以用來在一個實例被創(chuàng)建之后執(zhí)行代碼
1. new Vue({
2. data: {
3. a: 1
4. },
5. created: function () {
6. // `this` 指向 vm 實例
7. console.log('a is: ' + this.a)
8. }
9. })
10. // 在實例創(chuàng)建后會輸出"a is: 1"
也有一些其它的鉤子,在實例生命周期的不同階段被調(diào)用,如 mounted、updated 和 destroyed。生命周期鉤子的 this 上下文指向調(diào)用它的 Vue 實例。VUE實例的整個生命周期如下圖所示
(2)模板語法
Vue.js 使用了基于 HTML 的模板語法,允許開發(fā)者聲明式地將 DOM 綁定至底層 Vue 實例的數(shù)據(jù)。所有 Vue.js 的模板都是合法的 HTML,所以能被遵循規(guī)范的瀏覽器和 HTML 解析器解析。在底層的實現(xiàn)上,Vue 將模板編譯成虛擬 DOM 渲染函數(shù)。結(jié)合響應系統(tǒng),Vue 能夠智能地計算出最少需要重新渲染多少組件,并把 DOM 操作次數(shù)減到最少。
1)插值
a.文本
數(shù)據(jù)綁定最常見的形式就是使用"Mustache"語法 (雙大括號) 的文本插值:
1. <span>Message: {{ msg }}</span>
Mustache 標簽將會被替代為對應數(shù)據(jù)對象上 msg對應的值。無論何時,綁定的數(shù)據(jù)對象上 msg值發(fā)生了改變,插值處的內(nèi)容都會更新。通過使用 v-once 指令,也能執(zhí)行一次性地插值,當數(shù)據(jù)改變時,插值處的內(nèi)容不會更新。但請留心這會影響到該節(jié)點上的其它數(shù)據(jù)綁定
1. <span v-once>這個將不會改變: {{ msg }}</span>
b.原始HTML
雙大括號會將數(shù)據(jù)解釋為普通文本,而非 HTML 代碼。為了輸出真正的 HTML,你需要使用 v-html 指令,示例如下
1. <!DOCTYPE html>
2. <html>
3. <head>
4. <meta charset="UTF-8">
5. <title>VUE基礎教程</title>
6. <!-- 引用vue.js文件 -->
7. <script src="vue.js"></script>
8. </head>
9. <body>
10. <div id="app">
11. <!-- 這邊沒有用v-html所以標簽渲染出來直接是文本 -->
12. <p>{{msg}}</p>
13. <!-- 這邊使用了v-html所以渲染初始是標簽 -->
14. <p v-html="msg"></p>
15. </div>
16. <script>
17. var vm = new Vue({
18. el: '#app', // dom的掛載點,這邊將dom掛載到id為app的標簽上
19. data: { // 數(shù)據(jù)對象
20. msg: "<h4>我是h4標簽</h4>" // 定義變量值
21. }
22. })
23. </script>
24. </body>
25. </html>
c.屬性
雙大括號語法不能作用在 HTML標簽屬性上,需要對標簽屬性操作,應該使用 v-bind 指令
1. <div v-bind:id="dynamicId"></div>
現(xiàn)在通過v-bind來演示HTML標簽屬性的設置
1. <!DOCTYPE html>
2. <html>
3. <head>
4. <meta charset="UTF-8">
5. <title>VUE基礎教程</title>
6. <!-- 引用vue.js文件 -->
7. <script src="vue.js"></script>
8. </head>
9. <body>
10. <div id="app">
11. <!-- 這邊將button的disabled屬性值綁定到isButtonDisabled變量,如果為true那按鈕將變灰禁止點擊 -->
12. <button v-bind:disabled="isButtonDisabled">點我</button>
13. </div>
14. <script>
15. var vm = new Vue({
16. el: '#app', // dom的掛載點,這邊將dom掛載到id為app的標簽上
17. data: { // 數(shù)據(jù)對象
18. isButtonDisabled: true
19. }
20. })
21. </script>
22. </body>
23. </html>
d. javascript 表達式
上面,我們只進行了綁定簡單的屬性鍵值。但實際上,對于所有的數(shù)據(jù)綁定,Vue.js 都提供了完全的 JavaScript 表達式支持
1. {{ number + 1 }}
2.
3. {{ ok ? 'YES' : 'NO' }}
4.
5. {{ message.split('').reverse().join('') }}
6.
7. <div v-bind:id="'list-' + id"></div>
這些表達式會在所屬 Vue 實例的數(shù)據(jù)作用域下作為 JavaScript 被解析。有個限制就是,每個綁定都只能包含單個表達式,所以下面的例子都不會生效。
1. <!-- 這是語句,不是表達式 -->
2. {{ var a = 1 }}
3.
4. <!-- 流控制也不會生效,請使用三元表達式 -->
5. {{ if (ok) { return message } }}
2)指令
指令 (Directives) 是帶有v-前綴的特殊特性,指令的職責是,當表達式的值改變時,將其產(chǎn)生的連帶影響,響應式地作用于 DOM。
a.參數(shù)
一些指令能夠接收一個"參數(shù)",在指令名稱之后以冒號表示,下面我們通過v-on指令來演示動態(tài)改變DOM中渲染的值
1. <!DOCTYPE html>
2. <html>
3. <head>
4. <meta charset="UTF-8">
5. <title>VUE基礎教程</title>
6. <!-- 引用vue.js文件 -->
7. <script src="vue.js"></script>
8. </head>
9. <body>
10. <div id="app">
11. <p>{{msg}}</p>
12. <button v-on:click="changeContent">點我改變上面頁面內(nèi)容</button>
13. </div>
14. <script>
15. var vm = new Vue({
16. el: '#app', // dom的掛載點,這邊將dom掛載到id為app的標簽上
17. data: { // 數(shù)據(jù)對象
18. msg: "我還沒變"
19. },
20. methods: {
21. // v-on是綁定的方法所以在這邊要創(chuàng)建一個click的方法事件changeContent
22. changeContent(){
23. // 當被點擊后對msg進行重新賦值
24. this.msg = "我被改變了"
25. }
26. }
27. })
28. </script>
29. </body>
30. </html>
b.
JavaScript ( JS ) 是一種具有函數(shù)優(yōu)先的輕量級,解釋型或即時編譯型的編程語言。
函數(shù)優(yōu)先:編程語言中的函數(shù)可以被當作參數(shù)傳遞給其他函數(shù),可以作為另一個函數(shù)的返回值,還可以被賦值給一個變量。
解釋型:對標編譯型語言,編譯型需預先將源碼編成中間碼,再由解釋器解釋運行。解釋型不需要預先編譯,在程序在運行時才由解釋器翻譯運行。
JavaScript 的標準是ECMAScript截至 2012 年,所有的現(xiàn)代瀏覽器都完整的支持 ECMAScript 5.1,舊版本的瀏覽器至少支持 ECMAScript 3 標準。
我們所熟知的ES6是在2015年6月17日,由ECMA國際組織發(fā)布的ECMAScript 的第六版,該版本正式名稱為 ECMAScript 2015。
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Language_Resources
互聯(lián)網(wǎng)的興起,JavaScript的使用范圍已經(jīng)超出了瀏覽器。
變量是對值的引用,JavaScript 的變量名區(qū)分大小寫,A和a是兩個不同的變量。
var total; // 未賦值的變量是 undefined,它是個特殊的值,表示無定義。
total=1;
var a,b; // 一個var后可以聲明多個變量。
變量提升
你可能很奇怪,執(zhí)行下面代碼沒有報錯。由于JavaScript引擎工作方式是先解析代碼,獲取所有被聲明的變量,換句話說就是所有的變量的聲明語句,都被提升到代碼的頭部。
console.log(a);
var a=1;
變量規(guī)則
另外中文也可以聲明變量,下面保留字除外
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。
JavaScript程序的執(zhí)行單位行,一般情況一行就是一條語句,如果一行要寫多個語句我們使用;表示語句結(jié)束。
var total=1 + 1; // 聲明了一個變量total,然后將1+1的運算結(jié)果賦值給它。
注釋
// 這是單行注釋
/*
這是
多行
注釋
*/
區(qū)塊
JavaScript使用大括號將多條語句包裹起來表示一個區(qū)塊,注意var聲明的變量不構成單獨的作用域,這里區(qū)別于java。
{
var a=1;
}
a // 1
條件語句
// if結(jié)構
if (m===1){ // 往往由一個條件表達式產(chǎn)生的
console.log('ok')
}
// 或者
if (bool) console.log('ok');
// if/else結(jié)構
if (m===1){
語句;
}else{
語句;
}
// if/else if.../else 結(jié)構 m==1 m==2 其它
if (m===1) {
} else if(m===2){
}else {
}
switch 結(jié)構
switch (m) {
case 1:
// ...
break;
case 2:
// ...
break;
default:
// ...
}
注意區(qū)別 ==與===
使用==比較兩個變量時,會發(fā)生隱式類型轉(zhuǎn)換,例如,自動將字符串類型轉(zhuǎn)換為數(shù)字類型。
為了避免隱式轉(zhuǎn)換帶來的問題,我們都是用===進行嚴格進行比較。
三元運算符
三元運算符也可以用于邏輯判斷。
(條件) ? 表達式1 : 表達式2
循環(huán)語句
var i=0;
while (i < 100) {
console.log('i 當前為:' + i);
i=i + 1;
}
// 區(qū)別上面,它至少會執(zhí)行一次
var i=0;
do {
console.log('i 當前為:' + i);
} while (i < 100);
for循環(huán)語句
for (初始化表達式; 條件; 遞增表達式) {
語句
}
break 和 continue
break語句用于跳出代碼塊或循環(huán),continue是結(jié)束當前循環(huán),跳到下一次。
null和undefined
● 變量沒有初始化:undefined。
● 變量不可用:null。
數(shù)值
整數(shù)和浮點數(shù),JavaScript 內(nèi)部,所有數(shù)字都是以64位浮點數(shù)形式儲存,即使整數(shù)也是如此。
1===1.0 // true
數(shù)值精度:根據(jù)國際標準 IEEE 754,JavaScript 浮點數(shù)的64個二進制位,從最左邊開始,是這樣組成的。
數(shù)值范圍:64位浮點數(shù)的指數(shù)部分的長度是11個二進制位,意味著指數(shù)部分的最大值是2047(2的11次方減1)超出的范圍不能表示。
數(shù)值進制:
NaN
NaN是 JavaScript 的特殊值,表示“非數(shù)字”(Not a Number),主要出現(xiàn)在將字符串解析成數(shù)字出錯的場合。
字符串
由單雙引號包裹在一起的字符,就是字符串。
單引號字符串的內(nèi)部,可以使用雙引號。雙引號字符串的內(nèi)部,可以使用單引號。
'abc' "abc" "'a'" // 字符串
// 字符串換行
var str='String \
String \
String';
轉(zhuǎn)義符:
字符集:javaScript 使用 Unicode 字符集。JavaScript 引擎內(nèi)部,所有字符都用 Unicode 表示。
對象
var obj={ // 對象聲明
a: '1',
b: '2'
};
// 對象屬性讀取
obj.a
obj['a']
// 刪除對象屬性
delete obj.a
// 判斷屬性是否存在
'a' in obj
//對象遍歷
for (var i in obj) {
console.log('鍵名:', i);
console.log('鍵值:', obj[i]);
}
函數(shù)
function 關鍵字聲明。
function foo(s) {
console.log(s);
}
// 表達式形式
var foo=function(s) {
console.log(s);
};
Function 構造函數(shù)
var add=new Function(
'x',
'y',
'return x + y'
);
// 等同于
function add(x, y) {
return x + y;
}
函數(shù)名提升:JavaScript 引擎將函數(shù)名視同變量名,所以采用function命令聲明函數(shù)時,整個函數(shù)會像變量聲明一樣,被提升到代碼頭部。
foo();
function foo() {console('ok')}
JavaScript函數(shù)知識點還是蠻多的,后面針對函數(shù)這一塊單獨整理。
數(shù)組
數(shù)組屬于一種特殊的對象。
typeof [1, 2, 3] // "object"
length:JavaScript 使用一個32位整數(shù),保存數(shù)組的元素個數(shù)。這意味著,數(shù)組成員最多只有 4294967295 個(2^32 - 1)個,也就是說length屬性的最大值就是 4294967295。
數(shù)組遍歷
var a=[1, 2, 3];
for (var i in a) {
console.log(a[i]);
}
本文要點回顧,歡迎留言交流。
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。