1、JavaScript簡介javascript
一、JavaScript歷史背景css
布蘭登 • 艾奇(Brendan Eich,1961年~),1995年在網景公司,發明的JavaScript。html
剛開始JavaScript叫作LiveScript,可是因爲當時Java這個語言特別火,因此爲了傍大牌,就更名爲JavaScript。如同「北大」和「北大青鳥」的關係。「北大青鳥」就是傍「北大」大牌。前端
同時期還有其餘的網頁語言,好比VBScript、JScript等等,可是後來都被JavaScript戰勝了,因此如今的瀏覽器中,只運行一種腳本語言就是JavaScript。java
二、JavaScript和ECMAScript的關係程序員
ECMAScript是一種由Ecma國際(前身爲歐洲計算機制造商協會,英文名稱是European Computer Manufacturers Association)制定的標準。es6
JavaScript是由公司開發而成的,問題是不便於其餘的公司拓展和使用。因此歐洲的這個ECMA的組織,牽頭制定JavaScript的標準,取名爲ECMAScript。web
簡單來講,ECMAScript不是一門語言,而是一個標準。符合這個標準的比較常見的有:JavaScript、Action Script(Flash中用的語言)。就是說,你JavaScript學完了,Flash中的程序也就垂手可得了。正則表達式
ECMAScript在2015年6月,發佈了ECMAScript 6版本,語言的能力更強(也包含了不少新特性)。可是,瀏覽器的廠商不能那麼快去追上這個標準。數據庫
《ECMAScript 6 入門》 – 阮一峯 http://es6.ruanyifeng.com/
三、JavaScript的發展:蒸蒸日上
http://2004.sina.com.cn/
http://2008.sina.com.cn/
http://2012.sina.com.cn/
上面三個網站能夠感覺一下網頁技術的發展。
2003年以前,JavaScript被認爲「牛皮鮮」,用來製做頁面上的廣告,彈窗、漂浮的廣告。什麼東西讓人煩,什麼東西就是JavaScript開發的。因此瀏覽器就推出了屏蔽廣告功能。
2004年,JavaScript命運開始改變,那一年,谷歌公司開始帶頭使用Ajax技術,Ajax技術就是JavaScript的一個應用。而且,那時候人們逐漸開始提高用戶體驗了。Ajax有一些應用場景,好比,當咱們在百度搜索框搜文字時,輸入框下方的智能提示,能夠經過Ajax實現。好比,當咱們註冊網易郵箱時,可以及時發現用戶名是否被佔用,而不用調到另一個頁面。
2007年喬布斯發佈了第一款iPhone,這一年開始,用戶就多了上網的途徑,就是用移動設備上網。
JavaScript在移動頁面中,也是不可或缺的。而且這一年,互聯網開始標準化,按照W3C規則三層分離,JavaScript愈來愈被重視。
2010年,人們更加了解HTML5技術,HTML5推出了一個東西叫作Canvas(畫布),工程師能夠在Canvas上進行遊戲製做,利用的就是JavaScript。
2011年,Node.js誕生,使JavaScript可以開發服務器程序了。
現在,WebApp已經很是流行,就是用網頁技術開發手機應用。手機系統有iOS、安卓。好比公司要開發一個「攜程網」App,就須要招聘三隊人馬,好比iOS工程師10人,安卓工程師10人,前端工程師10人。共30人,開發成本大;並且若是要改版,要改3個版本。如今,假設公司都用web技術,用html+css+javascript技術就能夠開發App。也易於迭代(網頁一改變,全部的終端都變了)。
雖然目前WebApp在功能和性能上的體驗遠不如Native App,可是「WebApp慢慢取代Native App」頗有多是將來的趨勢。
四、JavaScript入門易學性
JavaScript對初學者比較友好。
JavaScript是有界面效果的(好比C語言只有白底黑字)。
JavaScript是弱變量類型的語言,變量只須要用var來聲明。而Java中變量的聲明,要根據變量的類型來定義。
好比Java中須要定義以下變量:
int a; float a; double a; boolean a;
而JavaScript中,只用定義一個變量:
var a;
JavaScript不用關心其餘的一些事情(好比內存的釋放、指針等),更關心本身的業務。
五、JavaScript是前臺語言
JavaScript是前臺語言,而不是後臺語言。
JavaScript運行在用戶的終端網頁上,而不是服務器上,因此咱們稱爲「前臺語言」。JavaScript就是一個簡單的製做頁面效果的語言,就是服務於頁面的交互效果、美化、絢麗、不能操做數據庫。
後臺語言是運行在服務器上的,好比PHP、ASP、JSP等等,這些語言都可以操做數據庫,都可以對數據庫進行「增刪改查」操做。Node.js除外。
六、JavaScript的組成
JavaScript基礎分爲三個部分:
ECMAScript:JavaScript的語法標準。包括變量、表達式、運算符、函數、if語句、for語句等。
DOM:操做網頁上的元素的API。好比讓盒子移動、變色、輪播圖等。
BOM:操做瀏覽器部分功能的API。好比讓瀏覽器自動滾動。
PS:JS機械重複性的勞動幾乎爲0,基本都是創造性的勞動。而不像HTML、CSS中margin、padding都是機械重複勞動。
七、JavaScript的特色
(1)簡單易用:可使用任何文本編輯工具編寫,只須要瀏覽器就能夠執行程序。
(2)解釋執行(解釋語言):事先不編譯、逐行執行、無需進行嚴格的變量聲明。
(3)基於對象:內置大量現成對象,編寫少許程序能夠完成目標。
2、第一個JavaScript代碼
一、js引入
a、在頁面中,咱們能夠在body標籤中放入以下標籤對兒:
<script type="text/javascript"> //js代碼段 </script>
b、引入js文件:
<script type="text/javascript" src="demo.js"></script>
二、語法規則
學習程序,是有規律可循的,程序要遵循必定的準則,這個準則就是:語法。
(1)JavaScript對換行、縮進、空格不敏感;
注意:每一條語句末尾都要加上分號,雖然分號不是必須加的,但爲了程序從此要壓縮,若是不加分號,壓縮以後將不能運行。
(2)全部的符號,都是英語的,好比括號、引號、分號;
(3)JavaScript的註釋:
a、單行註釋: // 我是註釋
b、多行註釋: /* 多行註釋 */
注意:sublime中,單行註釋的快捷鍵是ctrl+/,多行註釋的快捷鍵是ctrl+shift+/。
三、JavaScript中輸出信息的寫法
(1)彈出警告框:alert語句
<script type="text/javascript"> alert("娃哈哈"); </script>
(2)控制檯輸出:console.log()
console表示「控制檯」,log表示「輸出」,控制檯在Chrome瀏覽器的F12中,控制檯是程序員調試程序的地方,程序員常用這條語句輸出一些東西,來測試程序是否正確。
(3)用戶輸入:prompt()語句
prompt()就是專門用來彈出可以讓用戶輸入對話框,代碼以下:
<script type="text/javascript"> var a = prompt('今天是什麼天氣?'); console.log(a); </script>
上方代碼中,用戶輸入的內容,將被傳遞給變量a。
prompt()語句中,用戶無論輸入什麼內容,都是字符串類型。
(4)alert和prompt的區別:
alert(「從前有座山」); // 直接使用,不須要變量 var a = prompt(「請輸入一個數字」); // 必須用一個變量來接收用戶輸入的值
四、變量
(1)變量的聲明和賦值
var a = 100;
var是英語「variant」變量的縮寫。後面要加一個空格,空格後面的東西就是「變量名」。
定義變量:var就是一個關鍵字,用來定義變量。所謂關鍵字,就是有特殊功能的小詞語。關鍵字後面必定要有空格隔開。
變量的賦值:等號表示賦值,將等號右邊的值,賦給左邊的變量。
變量名:咱們能夠給變量取的名字。
注意:
a、在JavaScript中,永遠都是用var來聲明變量,這和C、Java等語言不一樣(有興趣的同窗能夠看一下es6);
b、變量要先定義,才能使用,好比,咱們不設置變量,直接輸出的話,控制檯將會報錯,通常有經驗的程序員,會把聲明和賦值寫在一塊兒,好比:var a = 10; // 聲明,而且賦值10
(2)變量的命名規範
a、變量名有命名規範:只能由英語字母、數字、下劃線、美圓符號$構成,且不能以數字開頭,而且不能是JavaScript保留字。
b、下列的單詞,叫作保留字,就是說不容許當作變量名,不用記:
abstract、boolean、byte、char、class、const、debugger、double、enum、export、extends、final、float、goto、
implements、import、int、interface、long、native、package、private、protected、public、short、static、super、
synchronized、throws、transient、volatile
c、大寫字母是可使用的,而且大小寫敏感,也就是說A和a是兩個變量。
(3)變量的類型
變量裏面可以存儲數字、字符串等。變量會自動的根據存儲內容的類型不一樣,來決定本身的類型。
a、數值型:number
若是一個變量中存放了數字,那麼這個變量就是數值型的,以下示例:
var a = 100; // 定義了一個變量,而且賦值100
console.log(typeof a); // 輸出a變量的類型,typeof()表示「獲取變量的類型」
PS:在JavaScript中,只要是數,就是數值型(number)的。不管整浮、浮點數(即小數)、不管大小、不管正負,都是number類型的。
b、字符串型:string
用單引號或者雙引號括起來的字符,以下示例:
var a = "abcde"; var b = '路飛'; var c = "123123"; var d = ""; // 空字符串 console.log(typeof a,typeof b,typeof c,typeof d); // string string string string
c、連字符和加號的區別
鍵盤上的「+」多是連字符,也多是數字的加號,以下:
console.log("我" + "愛" + "你"); // 連字符,把漢字連在一塊兒,輸出:我愛你 console.log("我+愛+你"); // 原樣輸出:我+愛+你 console.log("我"+512) // 輸出:我512 console.log(1+2+3); // 先計算並輸出結果,輸出:6
總結:若是加號兩邊都是數值,此時是加。不然就是連字符(用來鏈接字符串)。
(4)變量值的傳遞(賦值)
語句:a = b; // 把b的值賦給a,b值不變
(5)變量格式的轉換
parseInt()能夠將字符串轉成數字,例如:parseInt(「5」);
parseInt()還具備如下特性:
a、帶有自動淨化的功能:只保留字符串最開頭的數字,後面的中文自動消失,例如:
console.log(parseInt("2018你真帥!!")); // 輸出:2018
b、帶有自動截斷小數的功能:取整,不是四捨五入,例如:
var a = parseInt(5.8) + parseInt(4.7); console.log(a); // 輸出:9 var a = parseInt(5.8 + 4.7); console.log(a); // 輸出:10
3、數據類型
數據類型包括:基本數據類型 和 引用數據類型;
基本數據類型指的是簡單的數據段,引用數據類型指的是有多個值構成的對象;
當咱們把值賦值給一個變量時,解析器首先要確認的就是這個值是基本類型值仍是引用類型值;
一、基本數據類型
a、number
var a = 123; console.log(typeof a) // 輸出:number // 特殊狀況:Infinity(無限大)是 number類型 var a1 = 5/0; console.log(a1) // Infinity console.log(typeof a1) // number
b、string
var str = '123' console.log(typeof str) // string
c、boolean
var b1 = false; console.log(typeof b1) // boolean
d、null
var c1 = null; // 空對象 console.log(typeof c1) // object
e、undefined
var d1; // 只聲明未賦值表示變量未定義 console.log(typeof d1) // undefined
二、引用數據類型
引用數據類型有如下幾種,後面再來介紹。
Function
Object
Arrray
String
Date
4、運算符
一、賦值運算符
=、+=、-=、*=、/=、%=
二、算數運算符
+、-、*、/、%、++、--
三、比較運算符
==、===(等同於:值和類型均相等)、!=、!==、>、<、>=、<=
注意:==(!=)比較的是值, ===(!==)比較的是值和數據類型,例如:
var s = '1'; var n = 1; console.log(s == n); // true console.log(s === n); // false
四、字符串拼接和字符串運算的特殊狀況
a、字符串類型的數值 和 數值類型相減 結果是數值,例如:
var a = "3"; var b = 2; console.log(a - b); // 1
b、NaN(not a number)是一個number類型
var b1 = 'one'; var b2 = 'two'; ret = b1 * b2 console.log(ret, typeof(ret)) // NaN number
c、字符串拼接
var name = '伊拉克'; var am = '美軍'; // 字符串拼接 var str = "3月20日,"+name+"戰爭爆發,以"+am+"爲主的聯合部隊擊潰了軍隊。"; console.log(str); // es6的模塊字符串,tab鍵上面的反引號``, 添加變量使用${變量名} var str1 = `3月20日,${name}戰爭爆發,以${am}爲主的聯合部隊擊潰了軍隊。`; console.log(str1);
5、數據類型轉換
語言中咱們的數據類型有不少,在某個頁面中展現的數據類型也不一樣,好比說電話號碼就要求number類型,而姓名就要求string類型的。那麼在適當的狀況下咱們能夠將數據類型進行轉換。
一、將數值類型轉換成字符串類型
a、隱式轉換
var n1 = 123; var n2 = '123'; var n3 = n1 + n2; console.log(n3) // 123123 console.log(typeof n3); // string
b、強制類型轉換:String()、.toString()
var n1 = 123; var str1 = String(n1); console.log(str1, typeof str1); // 123 string var num = 234; str2 = num.toString() console.log(str2, typeof str2) // 234 string
二、將字符串類型轉換成數值類型:Number()、parseInt()、parseFloat()
var stringNum = '789.123wadjhkd'; var str = '666' console.log(Number(stringNum), Number(str)) // NaN 666 console.log(parseInt(stringNum)) // 789 console.log(parseFloat(stringNum)); // 789.123
三、任何數據類型均可以轉換爲boolean類型
// 非0既真 var b1 = '123'; // true var b2 = 0; // false var b3 = -123; // true var b4 = Infinity; // true var b5 = NaN; // false var b6; // false var b7 = null; // false
6、流程控制
一、if、if-else、if-else if-else
a、if語句,例如:
var ji = 20; if(ji >= 10){ console.log('恭喜你,吃雞成功,大吉大利') } console.log('hello world'); // 這裏的代碼還會執行
b、if-else,例如:
var ji = 20; if(ji >= 10){ console.log('恭喜你,吃雞成功,大吉大利') }else{ console.log('很遺憾,下次繼續努力') // 這裏的代碼不會執行 }
c、if-else if-else,例如:
if(true){ // 知足條件執行這段代碼 }else if(true){ // 知足條件執行這段代碼 }else if(true){ // 知足條件執行這段代碼 }else{ // 知足條件執行這段代碼 }
二、邏輯與(&&)、邏輯或(||)
a、模擬:若是總分 > 400分 而且 數學成績 > 89分 被清華大學錄取,例如:
var sum = 405; var math = 91; if(sum > 400 && math > 90){ console.log('清華大學錄取成功') }else{ alert('高考失利') }
b、模擬:若是總分 > 500分 或者 英語大於85分 被複旦大學錄取,例如:
if(sum > 500 || english > 85){ console.log('被複旦大學錄取') }else{ alert('高考又失利了') }
三、switch語句
var gameScore = 'better'; switch(gameScore){ case 'good': console.log('玩的很好') break; // break表示退出,若不寫則直到下一個break才退出(break穿透) case 'better': console.log('玩的老牛逼了') break; case 'best': console.log('恭喜你 吃雞成功') break; default: console.log('很遺憾') }
四、while循環、do-while循環
a、while循環,例如:
var i = 1; // 初始化循環變量 while(i <= 9){ // 判斷循環條件 console.log(i); i = i+1; // 改變循環條件 }
練習:將1-100全部是2的倍數在控制檯中打印,以下代碼:
var i = 1; while(i <= 100){ if(i%2 == 0){ console.log(i) } i++; }
b、do-while循環,例如:
// 無論有沒有知足while中的條件do裏面的代碼都會先執行一次 var i = 3;// 初始化循環變量 do{ console.log(i) i++;// 改變循環條件 }while (i < 10) // 判斷循環條件
五、for循環
for(var i = 1; i <= 10; i++){ console.log(i) }
練習:將1-100之間的全部偶數打印在控制檯,以下代碼:
for(var i = 1; i <= 100; i++){ if(i%2 == 0){ console.log(i) } }
練習:將1-100之間全部數之和打印在控制檯,以下代碼:
sum = 0 for(var i = 1; i <= 100; i++){ sum += i; } console.log(sum);
練習:在瀏覽器中輸出直角三角形,以下代碼:
for(var i = 1; i <= 6; i++){ for(var j = 1;j <= i; j++){ document.write("*"); } document.write('<br>'); }
練習:在瀏覽器中輸出等腰直角三角形,以下代碼:
for(var i = 1; i <= 6; i++){ // 控制行數 // 控制空格數 for(var s = i; s < 6; s++){ document.write(' ') } for(var j = 1; j <= 2*i-1; j++){ document.write('*') } document.write('<br>') }
7、經常使用內置對象
JavaScript 中的全部事物都是對象:字符串、數值、數組、函數...,此外,JavaScript 容許自定義對象。
JavaScript 提供多個內建對象,好比 String、Date、Array 等等。對象只是帶有屬性和方法的特殊數據類型。
一、Array(數組)對象
(1)數組的建立有兩種方式
a、字面量方式,推薦使用這種方式,簡單粗暴,例如:
var colors = ['red','green','yellow'];
b、構造函數 (後面會介紹) 的方式,使用new關鍵詞對構建函數進行建立對象,例如:
var colors = new Array();
(2)數組的賦值
var arr = []; // 經過下標進行一一賦值 arr[0] = 123; arr[1] = '嘿嘿'; arr[2] = '哈哈';
(3)數組的經常使用方法和示例
方法或屬性 |
描述 |
concat() |
鏈接兩個或更多的數組,並返回結果 |
join() |
把數組的全部元素放入一個字符串 |
toString() |
把數組轉換爲字符串,並返回結果 |
slice(start,end) |
選取數組的的一部分,並返回一個新數組 |
pop() |
刪除數組的最後一個元素並返回刪除的元素 |
push() |
向數組的末尾添加一個或更多元素,並返回新的長度 |
reverse() |
反轉數組的元素順序 |
sort() |
對數組的元素進行排序 |
shift() |
刪除並返回數組的第一個元素 |
unshift() |
向數組的開頭添加一個或更多元素,並返回新的長度 |
Array.isArray(待測) |
判斷對象是否爲數組 |
length |
數組的一個屬性,設置或返回數組元素的個數 |
var north = ['北京','山東','天津']; var south = ['東莞','深圳','上海']; var newCity = north.concat(south); console.log(newCity); // ["北京", "山東", "天津", "東莞", "深圳", "上海"] var score = [98,78,76,100,0]; var str = score.join('|'); console.log(str); // 98|78|76|100|0 str1 = score.toString(); console.log(str1); // "98,78,76,100,0" var arr = ['張三','李四','王文','趙六']; var newArr = arr.slice(1,3); console.log(newArr); // ["李四", "王文"] arr.pop(); console.log(arr); // ["張三", "李四", "王文"] arr.push('小馬哥'); console.log(arr); // ["張三", "李四", "王文", "小馬哥"] var names = ['alex','wusir','xiaoma','angle']; names.reverse(); console.log(names); // ["angle", "xiaoma", "wusir", "alex"] var names = ['alex','wusir','xiaoma','angle']; names.sort(names); console.log(names) // ["alex", "angle", "wusir", "xiaoma"] var arr = ['張三','李四','王文','趙六']; arr.shift(); console.log(arr); // ["李四", "王文", "趙六"] arr.unshift('小馬哥'); console.log(arr); // ["小馬哥", "李四", "王文", "趙六"] var arr = [1]; console.log(Array.isArray(arr)); // true
二、String(字符串)對象
方法 |
含義 |
charAt() |
返回指定索引的字符 |
concat() |
返回字符串值,表示兩個或多個字符串的拼接 |
replace(a,b) |
字符串b替換了a |
indexOf() |
返回某個指定的字符串值在字符串中首次出現的位置,沒有則返回-1 |
slice() |
返回start到end-1之間的字符串,索引從0開始 |
split() |
把字符串分割爲字符串數組 |
substr(start,end) |
字符串截取,顧頭不顧尾 |
toLowerCase() |
返回一個新的字符串,該字符串字母都變成了小寫 |
toUpperCase() |
返回一個新的字符串,該字符串的字母都變成了大寫 |
match() |
查找找到一個或多個正則表達式的匹配 |
search() |
查找與正則表達式相匹配的值 |
var str = 'hello'; var charset = str.charAt(1); console.log(charset); // e var str1 = 'al'; var str2 = 'ex'; console.log(str1.concat(str2,str1)); // alexal var a = '1234567755'; var newStr = a.replace('4567','****'); console.log(newStr); // 123****755 var str = 'world'; console.log(str.indexOf('o')); // 1 console.log(str.indexOf('a')); // -1 var str = '正能量'; console.log(str.slice(1,2)); // 能 var str = '個人天呢,a你在說什麼呢?a哈哈哈'; console.log(str.split('a')); // ["個人天呢,", "你在說什麼呢?", "哈哈哈"] var str = '個人天呢,a是嘛,你在說什麼呢?a哈哈哈'; console.log(str.substr(0,4)); // 個人天呢 var str = 'XIAOMAGE'; console.log(str.toLowerCase()); // xiaomage var str = 'xiaomage'; console.log(str.toUpperCase()); // XIAOMAGE
三、Date(日期)對象
建立日期對象只有構造函數一種方式,使用new關鍵字,例如:
var myDate = new Date(); // 建立了一個Date對象
經常使用方法和示例:
方法 |
含義 |
Date() |
根據本地時間返回當天的日期和時間 |
getFullYear() |
根據本地時間返回指定日期對象的年份(四位數年份時返回四位數字) |
getMonth() |
根據本地時間返回指定日期對象的月份(0-11) |
getDate() |
根據本地時間返回指定日期對象的月份中的第幾天(1-31) |
getDay() |
根據本地時間返回指定日期對象的星期中的第幾天(0-6) |
getHours() |
根據本地時間返回指定日期對象的小時(0-23) |
getMinutes() |
根據本地時間返回指定日期對象的分鐘(0-59) |
getSeconds() |
根據本地時間返回指定日期對象的秒數(0-59) |
toLocaleString() |
據本地時間格式,把Date對象轉換爲字符串 |
var myDate = new Date(); console.log(Date()); console.log(myDate.getFullYear()); console.log(myDate.getMonth()); console.log(myDate.getDate()); console.log(myDate.getDay()); console.log(myDate.getHours()); console.log(myDate.getMinutes()); console.log(myDate.getSeconds()); console.log(myDate.toLocaleString());
四、Math(算數)對象
方法 |
含義 |
Math.ceil() |
向上取整,稱爲「天花板函數」 |
Math.floor() |
向下取整,稱爲「地板函數」 |
Math.min(a,b) |
求a和b中的最小值 |
Math.max(a,b) |
求a和b中的最大值 |
Math.random() |
隨機數,默認0-1之間(包括0,不包括1)的隨機數, 公式min+Math.random()*(max-min)表示min~max之間的數 |
var x = 1.234; var a = Math.ceil(x); var b = Math.floor(x); console.log(a, b); // 2 1 console.log(Math.min(3,8)); // 3 console.log(Math.max(3,8)); // 8 var ran = Math.random(); console.log(ran); // 大於等於0 小於1 的數 ran2 = 100 + Math.random() * 100; // min + Math.random() * (max - min) console.log(ran2); // 100-200之間的隨機數
8、函數
函數就是將一些語句進行封裝,而後經過調用的形式,執行這些語句。
做用:
將大量重複的語句寫在函數裏,之後須要這些語句的時候,能夠直接調用函數,避免重複勞動;
簡化編程,讓編程模塊化;
一、函數的定義
function 函數名(){ // 函數體 }
function:是一個關鍵字,中文是「函數」、「功能」;
函數名:命名規定和變量的命名規定同樣。只能是字母、數字、下劃線、美圓符號,不能以數字開頭;
參數:後面有一對小括號,裏面是放參數用的;
函數體:大括號裏面,是這個函數的語句;
二、函數的調用
函數名();
三、函數的參數
函數的參數包括形參和實參(實際參數和形式參數的個數要相同),例如:
sum(3,4); sum("3",4); sum("Hello","World"); // 函數:求和 function sum(a, b){ console.log(a + b); }
四、函數的返回值
console.log(sum(3, 4)); // 函數:求和 function sum(a, b) { return a + b; }