Python全棧開發學習--javascript--進階--Day10

函數進階

日期

數學計算

正則表達式進階

一、函數進階

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-zA-Z0-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]匹配任何字母和數字

在這裏插入圖片描述
在這裏插入圖片描述

特別鳴謝菜鳥教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章