函數進階
日期
數學計算
正則表達式進階
一、函數進階
1 箭頭函數
ES6標準新增了一種新的函數:Arrow Function(箭頭函數)
語法
(參數1, 參數2, …, 參數N) => { 函數聲明 }
(參數1, 參數2, …, 參數N) => 表達式(單一)
實例
//(x,y)爲函數的參數,x*y爲函數執行語句
(x, y) => x * y;
x => x*x+1;
(x) => x*x+1;
(x,y) => {
if (x > 0) {
return x * y;
}
else {
return - x * y;
}
}
總結:
箭頭函數有兩種形式:
(1)函數體爲簡單的表達式,可省略{}
和return
(2)函數體有多條語句,不能省
(3)箭頭函數相當於匿名函數
當使用箭頭函數的時候,箭頭函數會默認幫我們綁定外層 this 的值,所以在箭頭函數中 this 的值和外層的 this 是一樣的。
2 自調用函數
首先需要了解“創建一個匿名函數並立刻執行”的語法:(IIFE) Immediately Invoked Function Expression – 立即執行函數,立即執行函數不會當做函數聲明處理而是當做函數表達式處理
//需要將函數體使用()將其包裹起來,否則會報SyntaxError錯誤
(function (x) {
return x * x;
})
形如(function(){})();
,是自執行函數
// 1.第一種方式: 兩個()() ,function寫在第一個()裏面
(function(){})()
// 2.第二種方式: 一個() ,裏面寫 function(){}() ,推薦使用這種方式
(function(){}())
//相當於先聲明,在調用
var b=function () {
}
b()
//自執行函數傳參
function b(i){
console.log(i)
}(5)
爲什麼需要自調用函數,因爲在實際的開發當中,函數的返回值可能需要調用另一個子函數,也就是下面要學習的閉包。我們想使一個函數聲明調用一步到位,就需要用到自調用函數。
3. 函數閉包
《JavaScript高級程序設計》中寫道:“閉包是指有權訪問另一個函數作用域中的變量的函數”。
3.1 閉包產生的需求:
由於作用域的原因,我們無法在函數外訪問函數裏面定義的變量,但有時候我們又會有這樣的需求,這個時候我們就需要使用閉包了。
3.2 閉包:
在函數A內部再定義一個子函數a,然後子函數a控制父函數中的變量v1,然後在父函數A中把這個子函數a返回給調用方,這個就叫做閉包。
3.3 用途:
(1)可以讀取整個父級作用域函數內部的變量。
(2)讓這些變量的值始終保持在內存中。
3.4 實例
//每次點擊一次將會加1,結果依次爲:1、2、3、4、5、6.....
<button type="button" onclick="myFunction()">計數!</button>
<p id="demo">0</p>
<script>
var counter = 0;
var add = function () {
return counter += 1;
}
function myFunction(){
document.getElementById("demo").innerHTML = add();
}
</script>
//當counter爲局部變量,每點擊一次都會重新聲明變量,所以結果爲:1、1、1、1、1......
<script>
var add = function () {
var counter = 0;
return counter += 1;
}
function myFunction(){
document.getElementById("demo").innerHTML = add();
}
</script>
那麼,當變量處於函數體內作爲局部變量時,如何實現第一個需求呢?我們知道閉包可以實現將變量始終保存在內存中,所以可以藉助閉包實現。
如何實現閉包?
閉包是子函數被當做返回值通過父函數返回給外界。
//先構造匿名的子函數,並且
<script>
var add = (function () {
var counter = 0;
return function(){
return counter += 1
}
}());
function myFunction(){
document.getElementById("demo").innerHTML = add();
}
</script>
二、日期
日期對象用於處理日期和時間。
1.日期處理方法
(1)Date()
獲取當前時間
var d=new Date();
alert(d)
//初始化方式
new Date() // 當前日期和時間
new Date(milliseconds) //返回從 1970 年 1 月 1 日至今的毫秒數
new Date(dateString)
new Date(year, month, day, hours, minutes, seconds, milliseconds)
(2)Date對象方法
//先聲明日期對象
var d = new Date();
var n = d.getDate(); //3 今天幾號
var n = d.getDay(); //2 今天星期幾
var n = d.getFullYear() //2020 今天年份
var n = d.getHours() //15 現在幾點鐘
var n = d.getMilliseconds() //當前毫秒數
d.setDate(15); //設置今天爲15號
(3)日期比較
var x=new Date();
x.setFullYear(2100,0,14);
var today = new Date();
if (x>today)
{
alert("今天是2100年1月14日之前");
}
else
{
alert("今天是2100年1月14日之後");
}
(4)格式化日期
Date.prototype.format = function(fmt){
var o = {
"M+" : this.getMonth()+1, //月份
"d+" : this.getDate(), //日
"h+" : this.getHours(), //小時
"m+" : this.getMinutes(), //分
"s+" : this.getSeconds(), //秒
"q+" : Math.floor((this.getMonth()+3)/3), //季度
"S" : this.getMilliseconds() //毫秒
};
if(/(y+)/.test(fmt)){
fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
}
for(var k in o){
if(new RegExp("("+ k +")").test(fmt)){
fmt = fmt.replace(
RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
}
}
return fmt;
}
document.getElementById("demo1").innerHTML=new Date(79,5,24,11,33,0).format("MM月dd日");
var now = new Date();
var nowStr = now.format("yyyy-MM-dd hh:mm:ss");
document.getElementById("demo2").innerHTML=new Date().format("yyyy年MM月dd日");
var nowStr = now.format("yyyy-MM-dd hh:mm:ss");
document.getElementById("demo3").innerHTML=new Date().format("yyyy年MM月dd日hh小時mm分ss秒");
三、Math算數
Math(算數)對象的作用是:執行常見的算數任務,Math 對象並不像 Date 和 String 那樣是對象的類,因此沒有構造函數 Math()。
1. Math對象屬性
var x = Math.PI //x等於圓周率
2. Math對象方法
var x=Math.abs(-5) //-5的絕對值
var x=Math.random() //0~1隨機數
四、正則表達式
1. 語法
正則表達式是一個RegExp對象
//兩種聲明方法
//pattern描述了表達式的模式
//modifiers修飾符,用於指定全局匹配、區分大小寫的匹配和多行匹配
var patt=new RegExp(pattern,modifiers);
var patt=/pattern/modifiers;
//例子
var re = new RegExp("\\w+");
var re = /\w+/;
2. 方法
2.1 方括號
var str="hello,world i like html"
var patt1=/[a-h]/g; //匹配a-h的字母
str.match(patt1)
var patt1=/[^a-h]/g; //匹配不在a-h範圍的字母
str.match(patt1)
2.2 元字符
(1) .
//院子
var str="That's hot!";
var patt1=/./g; //所有單個字符
str.match(patt1); //T,h,a,t,',s, ,h,o,t,!
var patt1=/.h/g; //h之前的單個字符加h
str.match(patt1); //Th, h
var patt1=/h./g; //h之後的單個字符加h
str.match(patt1); //ha, ho
var patt1=/h.t/g; // 匹配 h{?}t
str.match(patt1); //hat,hot
(2)\w
元字符用於查找單詞字符。\W
元字符用於查找非單詞字符
單詞字符包括:a-z
、A-Z
、0-9
,以及下劃線
, 包含 _ (下劃線)
字符。
var str="Give 100%hhh!";
var patt1=/\w/g;
var patt2=/\w/g
str.match(patt1) //G,i,v,e,1,0,0,h,h,h
str.match(patt2) // ,%,!
(3)\d
元字符用於查找數字字符。\D
元字符用於查找非數字字符。
var str="Give 100%!";
var patt1=/\d/g;
var patt2=/\D/g;
str.match(patt1); //1,0,0
str.match(patt2); //G,i,v,e, ,%,!
(4)\s
元字符用於查找空白字符。\S
元字符用於查找非空白字符。
空白字符可以是:
空格符 (space character)
製表符 (tab character)
回車符 (carriage return character)
換行符 (new line character)
垂直換行符 (vertical tab character)
換頁符 (form feed character)
(5)其他
2.3 量詞
(1)n+
量詞匹配包含至少一個 n 的任何字符串。n*
量詞匹配包含零個或多個 n 的任何字符串,n?
量詞匹配任何包含零個或一個 n 的字符串。。
//對至少一個 "o" 進行全局搜索:
var str="Hellooo World! Hello Runoob!";
var patt1=/o+/g; // ooo,o,o,oo
//對至少一個單詞字符進行全局搜索:
var patt1=/\w+/g; //Hellooo,World,Hello,Runoob
//對 "1" 進行全局搜索,包括其後緊跟的一個或多個 "0":
var str="1, 100 or 1000?";
var patt1=/10*/g; //1,100,1000
//對 "1" 進行全局搜索,包括其後緊跟的零個或一個 "0":
var str="1, 100 or 1000?";
var patt1=/10?/g; //1,10,10
(2)
n{X}
量詞匹配包含 X 個 n 的序列的字符串。X 必須是數字。
n{X,}
量詞匹配包含至少 X 個 n 的序列的字符串
n{X,Y}
量詞匹配包含至少 X 最多Y 個 n 的序列的字符串
//匹配四個數字
var str="100, 1000 or 10000?";
var patt1=/\d{4}/g; //1000,1000
//匹配至少3個數字
var patt1=/\d{3,}/g; //100,1000,1000
(3)
n$
匹配任何結尾爲 n 的字符串。
^n
匹配任何開頭爲 n 的字符串。
?=n
匹配任何其後緊接指定字符串 n 的字符串。
?!n
量詞匹配其後沒有緊接指定字符串 n 的任何字符串。
// 對其後緊跟 "all" 的 "is" 進行全局搜索:
var str="Is this all there is";
var patt1=/is(?= all)/g; //is
//對字符串結尾的 "is" 進行全局搜索::
var str="Is this his";
var patt1=/is$/g; //is
//對字符串開始的 "Is" 進行全局搜索::
var str="Is this his";
var patt1=/Is$/g; //Is
2.4
(1)search()
方法用於檢索字符串中指定的子字符串,或檢索與正則表達式相匹配的子字符串。如果沒有找到任何匹配的子串,則返回 -1。
var str="Mr. Blue has a blue house";
str.search("blue"); //15
(2)match()
返回匹配的字符串
//全局查找字符串 "ain",且不區分大小寫:
var str="The rain in SPAIN stays mainly in the plain";
var n=str.match(/ain/gi);
//ain,AIN,ain,ain
Emmmmmmm…頭有點大!!!
先來一個小小的總結:
1: / ...... /
2: / ^ ...... $/
3: / ^x ......$/
以x開頭
4: / ^x ......y$/
以y結尾
5: / ^x{4} ......$/
以4個x開頭
6: / ^x+ ......$/
以大於或等於1個x開頭
7: / ^\d ......$/
以1個任意數字開頭
8: / ^\d{4} ......$/
以4個任意數字開頭
9: / ^((1{6})|(0{4})) ......$/
以4個0開頭或者6個1開頭
10:[a-zA-Z0-9]
匹配任何字母和數字
特別鳴謝菜鳥教程