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

在这里插入图片描述
在这里插入图片描述

特别鸣谢菜鸟教程

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