javascript介紹 Web前端有三層: HTML:從語義的角度,描述頁面結構 CSS:從審美的角度,描述樣式(美化頁面) JavaScript:從交互的角度,描述行為(提升用戶體驗) 其中JavaScript基礎又分為三個部分: ECMAScript:JavaScript的語法標準。包括變數、 ...
javascript介紹
Web前端有三層:
-
HTML:從語義的角度,描述頁面結構
-
CSS:從審美的角度,描述樣式(美化頁面)
-
JavaScript:從交互的角度,描述行為(提升用戶體驗)
其中JavaScript基礎又分為三個部分:
-
ECMAScript:JavaScript的語法標準。包括變數、表達式、運算符、函數、if語句、for語句等。
JavaScript歷史背景介紹
布蘭登 • 艾奇(Brendan Eich,1961年~),1995年在網景公司,發明的JavaScript。
一開始JavaScript叫做LiveScript,但是由於當時Java這個語言特別火,所以為了傍大牌,就改名為JavaScript。如同“北大”和“北大青鳥”的關係。“北大青鳥”就是傍“北大”大牌。
同時期還有其他的網頁語言,比如VBScript、JScript等等,但是後來都被JavaScript打敗了,所以現在的瀏覽器中,只運行一種腳本語言就是JavaScript
ECMAScript是一種由Ecma國際(前身為歐洲電腦製造商協會,英文名稱是European Computer Manufacturers Association)制定的標準。
JavaScript是由公司開發而成的,問題是不便於其他的公司拓展和使用。所以歐洲的這個ECMA的組織,牽頭制定JavaScript的標準,取名為ECMAScript。
簡單來說,ECMAScript不是一門語言,而是一個標準。符合這個標準的比較常見的有:JavaScript、Action Script(Flash中用的語言)。就是說,你JavaScript學完了,Flash中的程式也就輕而易舉了。
ECMAScript在2015年6月,發佈了ECMAScript 6版本,語言的能力更強(也包含了很多新特性)。但是,瀏覽器的廠商不能那麼快去追上這個標準。
JavaScript和ECMAScript的關係
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中變數的聲明,要根據變數的類型來定義。
JavaScript的組成
JavaScript基礎分為三個部分:
-
ECMAScript:JavaScript的語法標準。包括變數、表達式、運算符、函數、if語句、for語句等。
-
DOM:操作網頁上的元素的API。比如讓盒子移動、變色、輪播圖等。
-
BOM:操作瀏覽器部分功能的API。比如讓瀏覽器自動滾動。
PS:JS機械重覆性的勞動幾乎為0,基本都是創造性的勞動。而不像HTML、CSS中margin、padding都是機械重覆勞動。
JavaScript的特點
(1)簡單易用:可以使用任何文本編輯工具編寫,只需要瀏覽器就可以執行程式。
(2)解釋執行(解釋語言):事先不編譯、逐行執行、無需進行嚴格的變數聲明。
(3)基於對象:內置大量現成對象,編寫少量程式可以完成目標
javascript語法
學習程式,是有規律可循的,就是程式是有相同的部分,這些部分就是一種規定,不能更改,我們成為:語法。
(1)JavaScript對換行、縮進、空格不敏感。
備註:每一條語句末尾要加上分號,雖然分號不是必須加的,但是為了程式今後要壓縮,如果不加分號,壓縮之後將不能運行。
(2)所有的符號,都是英語的。比如括弧、引號、分號。
js代碼的引入
在頁面中,我們可以在body標簽中放入<script type=”text/javascript”></script>
標簽對兒,<script type=”text/javascript”></script>
標簽對兒
<script type="text/javascript"> </script>
變數和賦值
變數
var a = 100; //變數的定義和賦值
var是英語“variant”變數的縮寫。後面要加一個空格,空格後面的東西就是“變數名”,
定義變數:var就是一個關鍵字,用來定義變數。所謂關鍵字,就是有特殊功能的小詞語。關鍵字後面一定要有空格隔開。
變數的賦值:等號表示賦值,將等號右邊的值,賦給左邊的變數。
變數名:我們可以給變數任意的取名字。
PS:在JavaScript中,永遠都是用var來定義變數,這和C、Java等語言不同
變數說明
變數名有命名規範:只能由英語字母、數字、下劃線、美元符號$構成,且不能以數字開頭,並且不能是JavaScript保留字,變數區分大小寫也就是說A和a是兩個變數。
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、volatilejs保留字
賦值
將等號右邊的值,賦給左邊的變數;等號右邊的變數,值不變。
var a = "3"; var b = 2; a = b console.log(a) console.log(b)
註釋
// 我是單行註釋
/* 多行註釋1 多行註釋2 */
備註:sublime中,單行註釋的快捷鍵是ctrl+/
,多行註釋的快捷鍵是ctrl+shift+/
。
輸入輸出信息
彈出警告框:alert語句
<script type="text/javascript"> alert("小馬哥"); </script>alert(英文翻譯為“警報”)的用途:彈出“警告框”。
控制台輸出console.log("") 和輸入框prompt()
console.log("") 表示在控制臺中輸出。console表示“控制台”,log表示“輸出”。 控制台在Chrome瀏覽器的F12中。控制台是工程師、程式員調試程式的地方。程式員經常使用這條語句輸出一些東西,來測試程式是否正確。 prompt() 實際上是一個輸入框,就是專門用來彈出能夠讓用戶輸入的對話框。prompt()語句中,用戶不管輸入什麼內容,都是字元串。 alert("從前有座山"); //直接使用,不需要變數 var a = prompt("請輸入一個數字"); // 需要用變數,才能接收用戶輸入的值 示例: alert("從前有座山"); //直接使用,不需要變數 var a = prompt("請輸入一個數字"); // 必須用一個變數,來接收用戶輸入的值console.log和prompt
代碼示例:
<script type="text/javascript"> var a = prompt('今天是什麼天氣?'); console.log(a); </script>
上方代碼中,用戶輸入的內容,將被傳遞到變數 a 裡面。效果如下:
基礎數據類型
變數裡面能夠存儲數字、字元串等。和 python一樣,js中定義變數的時候不必指定類型,變數會自動的根據存儲內容的類型不同,來決定自己的類型。查看類型使用typeof方法。
數值類型:number
在JavaScript中,只要是數,就是數值型(number)的。無論整浮、浮點數(即小數)、無論大小、無論正負,都是number類型的。
var a = 100; //定義了一個變數a,並且賦值100 console.log(typeof a); //輸出a變數的類型 console.log(typeof(a)); //輸出a變數的類型
var num = 2.379 var newNum = num.toFixed(2) console.log(newNum)小數的保留
字元串類型:string
1.定義
var a = "abcde"; var b = '路飛'; //不區分單雙引號 console.log(typeof a); console.log(typeof b);
2.常用方法
方法 | 說明 |
.length #不加括弧的是屬性 | 返回長度 |
.trim() #得到一個新值 | 移除空白 |
.trimLeft() | 移除左邊的空白 |
.trimRight() | 移除右邊的空白 |
.concat(value, ...) #s1='hello';s.concat('xx');得到helloxx | 拼接 |
.charAt(n) #n類似索引,從0開始,超過最大值返回''空字元串 | 返回第n個字元 |
.indexOf(substring, start) #這個start是從索引幾開始找,沒有返回-1 | 子序列位置 |
.substring(from, to) #不支持負數,所以一般都不用它,瞭解一下就行了 | 根據索引獲取子序列 |
.slice(start, end) #var s1='helloworld';s1.slice(0,-5)看結果,就用它 | 切片 |
.toLowerCase() #全部變小寫 | 小寫 |
.toUpperCase() #全部變大寫 | 大寫 |
.split(delimiter, limit)#分隔,s1.splite(' '),後面還可以加參數s1.split(' ',2),返回切割後的元素個數 | 分割 |
var str = 'alex'; var charset = str.charAt(1); console.log(charset);//lchartAt() 返回指定索引的位置的字元
var str1 = 'alex'; var str2 = 'sb'; console.log(str1.concat(str2,str2));//alexsbsbconcat 返回字元串值,表示兩個或多個字元串的拼接
var a = 'hello,world' var r = a.match("world") console.log(r) var r = a.match("World") console.log(r) // 正則 var a = 'abcd,dcba' var r = a.match(/\w+/) console.log(r) // g表示匹配多次 var r = a.match(/\w+/g) console.log(r)match() 字元串匹配和正則匹配
var a = '1234567755'; var newStr = a.replace("4567","****"); console.log(newStr);//123****755replace(a,b) 將字元串a替換成字元串b
var str = 'alex'; console.log(str.indexOf('e'));//2 console.log(str.indexOf('p'));//-1 console.log(str.search('e'));//2 console.log(str.search('p'));//-1indexof()/search() 查找字元的下標,如果找到返回字元串的下標,找不到則返回-1 。
var str = '小馬哥'; console.log(str.slice(1,2));//馬slice(start,end) 切片。左閉右開 分割數組 接收負參數
var str = '我的天呢,a是嘛,你在說什麼呢?a哈哈哈'; console.log(str.substr(0,4));//我的天呢 var str = '我的天呢,a是嘛,你在說什麼呢?a哈哈哈'; console.log(str.substr(9,6)); var str = '我的天呢,a是嘛,你在說什麼呢?a哈哈哈'; console.log(str.substr(-3,3));substr(start,length) 返回一個字元串:從指定位置開始,取指定字元數。
如果 indexStart 等於 indexEnd,substring 返回一個空字元串。 如果省略 indexEnd,substring 提取字元一直到字元串末尾。 如果任一參數小於 0 或為 NaN,則被當作 0。 如果任一參數大於 stringName.length,則被當作 stringName.length。 如果 indexStart 大於 indexEnd,則 substring 的執行效果就像兩個參數調換了一樣substring(indexStart,indexEnd) 切子字元串。顧頭不顧尾
var str = '我的天呢,a是嘛,你在說什麼呢?a哈哈哈'; console.log(str.split('a'));//["我的天呢,", "是嘛,你在說什麼呢?", "哈哈哈"] 如果第二個參數沒寫,表示返回整個數組 console.log(str.split('a',2));//["我的天呢,", "是嘛,你在說什麼呢?"] 如果定義了個數,則返回數組的最大長度split('sep',n) 切割,根據n保留切割的數組長度
var str = 'EVA'; console.log(str.toLowerCase());//evatoLowerCase():轉小寫
var str = 'xiaomage'; console.log(str.toUpperCase());toUpperCase():轉大寫
var str = ' 我的天呢 '; console.log(str.trim());//我的天呢trim() 去除字元串兩邊的空白
布爾值:boolean
var b1 = false; console.log(typeof b1)
空元素:null
var c1 = null;//空對象. object console.log(c1)
未定義:undefined
var d1; //表示變數未定義 console.log(typeof d1)
內置對象類型
數組:Array
1.數組的創建
var colors = ['red','color','yellow']; //字面量方式創建(推薦) var colors2 = new Array();//使用構造函數(後面會講)的方式創建 使用new關鍵詞對構造函數進行創建對象
2.數組的賦值
var arr = []; //通過下標進行一一賦值 arr[0] = 123; arr[1] = '哈哈哈'; arr[2] = '嘿嘿嘿'
3.數組的常用方法
方法 | 說明 |
.length | 數組的大小 |
.push(ele) | 尾部追加元素 |
.pop() | 獲取尾部的元素 |
.unshift(ele) | 頭部插入元素 |
.shift() | 頭部移除元素 |
.slice(start, end) | 切片 |
.reverse() #在原數組上改的 | 反轉 |
.join(seq)#a1.join('+'),seq是連接符 | 將數組元素連接成字元串 |
.concat(val, ...) #連個數組合併,得到一個新數組,原數組不變 | 連接數組 |
.sort() | 排序 |
.forEach() #講了函數再說 | 將數組的每個元素傳遞給回調函數 |
.splice() #參數:1.從哪刪(索引), 2.刪幾個 3.刪除位置替換的新元素(可多個元素) | 刪除元素,並向數組添加新元素。 |
.map() #講了函數再說 | 返回一個數組元素調用函數處理後的值的新數組 |
var north = ['北京','山東','天津']; var south = ['東莞','深圳','上海']; var newCity = north.concat(south); console.log(newCity)concat方法:列表的拼接
var score = [98,78,76,100,0]; var str = score.join('|'); console.log(str);//98|78|76|100|0join方法:將數組中的元素使用指定的字元串連接起來,它會形成一個新的字元串
var score = [98,78,76,100,0]; //toString() 直接轉換為字元串 每個元素之間使用逗號隔開 var str = score.toString(); console.log(str);//98,78,76,100,0toString方法:將數組轉換成字元串
var arr = ['張三','李四','王文','趙六']; var newArr = arr.slice(1,3); console.log(newArr);//["李四", "王文"]slice(start,end):切片(左閉右開)
var arr = ['張三','李四','王文','趙六']; var item = arr.pop(); console.log(arr);//["張三", "李四","王文"] console.log(item);//趙六pop方法:刪除尾元素
var arr = ['張三','李四','王文','趙六']; var newLength= arr.push('小馬哥');//可以添加多個,以逗號隔開 console.log(newLength);//5 console.log(arr);//["張三", "李四","王文","趙六","小馬哥"]push方法:向數組末尾添加一個元素或多個元素,並返回新的長度
var names = ['alex','xiaoma','tanhuang','angle']; names.reverse(); console.log(names);reverse()方法:翻轉數組
var names = ['alex','xiaoma','tanhuang','abngel']; names.sort(); console.log(names);// ["alex", "angle", "tanhuang", "xiaoma"]sort()方法:排序
布爾類型值 = Array.isArray(被檢測的值) ;Array.isArray(被檢測的值):判斷是否為數組
var arr = [1,2,3] var n = arr.shift() console.log(arr) console.log(n)shift():刪除並返回數組的第一個元素
var arr = [1,2,3] var n = arr.unshift(0) console.log(arr) console.log(n) var arr = [1,2,3] var n = arr.unshift('alex','wahaha') console.log(arr) console.log(n)unshift():向數組的開頭添加一個或更多元素,並返回新的長度
var array = [1,2,3,4,5,6]; array.splice(0); //方式1:刪除數組中所有項目 array.length = 0; //方式1:length屬性可以賦值,在其它語言中length是只讀 array = []; //方式3:推薦清空數組的幾種方式
關於sort()需要註意: 如果調用該方法時沒有使用參數,將按字母順序對數組中的元素進行排序,說得更精確點,是按照字元編碼的順序進行排序。要實現這一點,首先應把數組的元素都轉換成字元串(如有必要),以便進行比較。 如果想按照其他標準進行排序,就需要提供比較函數,也就是自己提供一個函數提供排序規則,該函數要比較兩個值,然後返回一個用於說明這兩個值的相對順序的數字。比較函數應該具有兩個參數 a 和 b,其返回值如下: 若 a 小於 b,在排序後的數組中 a 應該出現在 b 之前,則返回一個小於 0 的值。 若 a 等於 b,則返回 0。 若 a 大於 b,則返回一個大於 0 的值。 示例: function sortNumber(a,b){ return a - b } var arr1 = [11, 100, 22, 55, 33, 44] arr1.sort(sortNumber)sort的問題
var arr = ['alex','wusir'] arr.forEach(fn) function fn(item,index){ console.log(index,item) }forEach方法,設定每一個元素執行某函數
var arr = ['alex','wusir'] var ret = arr.map(fn) function fn(name,index) { console.log(index,name) return name+'sb' } console.log(ret)map方法,迴圈每一個元素完成某操作返回新的值組成新數組
JSON對象
var str1 = '{"name": "chao", "age": 18}'; var obj1 = {"name": "chao", "age": 18}; // JSON字元串轉換成對象 var obj = JSON.parse(str1); // 對象轉換成JSON字元串 var str = JSON.stringify(obj1);
遍歷對象中的內容:
var a = {"name": "Alex", "age": 18}; for (var i in a){ console.log(i, a[i]); }
日期:Date
1.定義
創建日期對象只有構造函數一種方式,使用new關鍵字
var myDate = new Date(); //創建了一個date對象
2.常用方法
//創建日期對象 var myDate=new Date(); //獲取一個月中的某一天 console.log(myDate.getDate()); //返回本地時間 console.log(myDate().toLocalString());//2018/5/27 下午10:36:23
註意:以上getxxx的方法都是對時間的獲取,如果要設置時間,使用setxxx,請參考鏈接:http://www.runoob.com/jsref/jsref-obj-date.html
RegExp對象
RegExp相關:用的比較多
//RegExp對象 //創建正則對象方式1 // 參數1 正則表達式(不能有空格) // 參數2 匹配模式:常用g(全局匹配;找到所有匹配,而不是在第一個匹配後停止)和i(忽略大小寫) // 用戶名只能是英文字母、數字和_,並且首字母必須是英文字母。長度最短不能少於6位 最長不能超過12位。 // 創建RegExp對象方式(逗號後面不要加空格),假如匹配用戶名是只能字母開頭後面是字母加數字加下劃線的5到11位的 var reg1 = new RegExp("^[a-zA-Z][a-zA-Z0-9_]{5,11}$"); //註意,寫規則的時候,裡面千萬不能有空格,不然匹配不出來你想要的內容,除非你想要的內容本身就想要空格,比如最後這個{5,11},裡面不能有空格 // 匹配響應的字元串 var s1 = "bc123"; //RegExp對象的test方法,測試一個字元串是否符合對應的正則規則,返回值是true或false。 reg1.test(s1); // true // 創建方式2,簡寫的方式 // /填寫正則表達式/匹配模式(逗號後面不要加空格) var reg2 = /^[a-zA-Z][a-zA-Z0-9_]{5,11}$/; reg2.test(s1); // true 註意,此處有坑:如果你直接寫一個reg2.test(),test裡面啥也不傳,直接執行,會返回一個true,用其他的正則規則,可能會返回false,是因為,test裡面什麼也不傳,預設傳的是一個undefined,並且給你變成字元串undefined,所以能夠匹配undefined的規則,就能返回true,不然返回false // String對象與正則結合的4個方法 var s2 = "hello world"; s2.match(/o/g); // ["o", "o"] 查找字元串中 符合正則 的內容 ,/o/g後面這個g的意思是匹配所有的o, s2.search(/h/g); // 0 查找字元串中符合正則表達式的內容位置,返回第一個配到的元素的索引位置,加不加g效果相同 s2.split(/o/g); // ["hell", " w", "rld"] 按照正則表達式對字元串進行切割,得到一個新值,原數據不變 s2.replace(/o/g, "s"); // "hells wsrld" 對字元串按照正則進行替換 // 關於匹配模式:g和i的簡單示例 var s1 = "name:Alex age:18"; s1.replace(/a/, "哈哈哈"); // "n哈哈哈me:Alex age:18" s1.replace(/a/g, "哈哈哈"); // "n哈哈哈me:Alex 哈哈哈ge:18" 全局匹配 s1.replace(/a/gi, "哈哈哈"); // "n哈哈哈me:哈哈哈lex 哈哈哈ge:18" 不區分大小寫 // 註意事項1: // 如果regExpObject帶有全局標誌g,test()函數不是從字元串的開頭開始查找,而是從屬性regExpObject.lastIndex所指定的索引處開始查找。 // 該屬性值預設為0,所以第一次仍然是從字元串的開頭查找。 // 當找到一個匹配時,test()函數會將regExpObject.lastIndex的值改為字元串中本次匹配內容的最後一個字元的下一個索引位置。 // 當再次執行test()函數時,將會從該索引位置處開始查找,從而找到下一個匹配。 // 因此,當我們使用test()函數執行了一次匹配之後,如果想要重新使用test()函數從頭開始查找,則需要手動將regExpObject.lastIndex的值重置為 0。 // 如果test()函數再也找不到可以匹配的文本時,該函數會自動把regExpObject.lastIndex屬性重置為 0。 var reg3 = /foo/g; // 此時 regex.lastIndex=0 reg3.test('foo'); // 返回true // 此時 regex.lastIndex=3 reg3.test('xxxfoo'); // 還是返回true // 所以我們在使用test()方法校驗一個字元串是否完全匹配時,一定要加上^和$符號,把匹配規則寫的確定一些,儘量不用上面這種的寫法/xxx/。 // 註意事項2(說出來你可能不信系列): // 當我們不加參數調用RegExpObj.test()方法時, 相當於執行RegExpObj.test(undefined),然後將這個undefined又轉為字元串"undefined",去進行匹配了, 並且/undefined/.test()預設返回true。 var reg4 = /^undefined$/; reg4.test(); // 返回true reg4.test(undefined); // 返回true reg4.test("undefined"); // 返回trueRegExp相關