javascript中的数据类型

原始数据类型:

undefined:

声明变量后为赋值则为undefined类型

一般为计算机默认

null:

声明变量后赋值为空

一般人为设置

number:

包括整型,浮点型都可以,占8byte,会有舍入误差,一般需要四舍五入

例如:

var s=1.7;
var t=2;
var c=t-s;
document.write(c);

结果为: 0.30000000000000004

解决方法:调用函数.toFixed(),来实现保留两位小数

document.write(c.toFixed(2));

结果为:0.30

string:

一个英文字母占1byte

一个汉字占2byte

Boolean:

false

true

引用数据类型:

引用数据类型如:

number型:如电话号码   身份号   

不用于计算比较,由数字构成的字符串

数组:引用类型的对象

数组:一组连续的变量组成的集合----统一起一个名字(批量管理多个数据)

程序=数据结构+算法

         好的数据结构,可极大提高程序的执行效率

        相关的多个数据应集中存储,集中管理

       分类  和   排序

创建数组

**1.var 变量名=[ ];-->创建一个空数组对象

**2.var 变量名=[值1,值2,```````]-->创建数组同时为数组指定初始元素(数组中的值)

对象只有唯一的地址,变量有名字

3.var arr=new Array(  );//new创建一个新对象,Array是js中的数组类型

new Array()-->创建一个数组类型的新对象,并返回新对象的地址

4.var arr=new Array( n );-->创建n个元素的数组

var arr=new Array(值1,值2······);

使用数组:使用变量等效于直接使用变量引用的数组对象

数组对象中,每个元素都有一个下标,从零到元素个数-1结束

数组变量[i]-->获得i位置元素中的值

数组赋值

数组变量[i]=新值;

数组取值 

数组变量[i]

null和undefined:

undefined:是所有没有赋值的变量的默认值;

null:主动释放一个变量引用的对象;

何时使用null:当使用完一个较大的对象时,主动释放对象总是好的习惯;

垃圾回收器:专门释放对象内存的一个程序       //    在底层,后台,伴随当前程序同时运行

                      引擎会定时自动调用垃圾回收器(总有一个变量不会被调用时)

js数组与其他语言数组的区别:

1.JavaScript中的数组越界不会报错;

2.为不存在的位置赋值:不会出错!会自动创建指定下标的新元素。

  从不存在的位置取值:不会出错,也不会增加新元素,而是返回Undefined

数组的属性:

.length属性:获得任意数组中的元素个数(包括数组中空元素)!=实际的元素个数

何时使用:

1.arr[arr.length-1]:获得任意长度数组中的最后一个元素;

2.arr[arr.length]=新值:数组末尾追加一个新元素;

3.改小length的值,可删除末尾元素

例子:输入员工名字

 var nam=[];
var input="";
while((input=prompt("please input name:"))!="exit"){
    nam[nam.length]=input;//总是在末尾追加新元素
}
console.log(nam+nam.length);

数组遍历(索引数组):

三要素:

1.循环条件:下标<arr.length

2.循环变量:小标,从零开始,每次增1,直到arr.length-1结束

3.循环体:xxx

例子1:求数组最大值

function getMax(a){   	
    for(var i=1,max=a[0];i<a.length;i++){
      max<a[i]&&(max=a[i]);
    } 
    return max;
}
console.log(getMax([3,7,5,2]));
例子2:查找指定值在数组中的位置下标

var nam=['Jack','Tom','Ruth','Rose','Scott'];
//indexof:在a中查找ename的位置;没找到返回-1;
//indexOf(keyword,starti) 返回要查找关键字第一个字符所在数组的下标
 function indexof(a,ename){
    for(var i=0;i<a.length;i++){
        if(a[i]==ename){
             return i;
         }
    }
    return -1;
}
console.log(indexof(nam,"Ruth"));
console.log(indexof(nam,"Rose"));
console.log(indexof(nam,"John"));

关联数组:

关联数组:可以自己定义下标名称的数组
例如:["rythy",  91,   65,   95]

            sname shx yuw eng

如何定义关联数组:var fbb=[];

                         fbb["sname"]="ruthy";

                                    key         value

                         fbb["shx"]       =    91;

                                    key         value

如何访问关联数组中的元素:fbb ["sname"];

关联数组中的.length属性失效!

关联数组(hash)数组:下标不能重复

        优势:利用hash算法,精确定位某个下标,不用遍历

索引数组:缺点:下标自动分配,无意义,要想按内容查找元素,只能从头开始遍历。

遍历关联数组:

for(var key in arr){

key,仅得到当前元素的下标

arr[key],得到当前元素的值!

}

例子:

var fbb=[];
fbb["sname"]="ruthy";
fbb["shx"]=91;
fbb["yuw"]=51;
fbb["eng"]=91;
for(var key in fbb){
    console.log(key+":"+fbb[key]);
}

数组API:

API:应用程序编程接口

      已经实现的,现成的对象和方法-----提高开发效率

拼接  

           arr to String:
            var str=arr.toString()-->自动,逗号分隔
            var str=arr.join("连接符")-->自定义连接符

固定套路:1.将字符拼接为单词:arr.join("")

     2.将单词拼接为句子:arr.join(" ")

*优化*:问题:频繁字符串拼接,造成内存浪费

var str=“a”;

str+="b";//3

str+="c";//5

str+="d";//7   

解决:先将要拼接的字符串放入数组

        最后,arr.join("")

var arr=["a"];

arr[arr.length]="b";

arr[arr.length]="c";

arr[arr.length]="d";                   

["a","b","c","d"]

例子:arr.join()使用方法

<html>
<head>
<title>JavaScript Array join Method</title>
</head>
<body>
    <script type="text/javascript">
         var arr = new Array("First","Second","Third");
         var str = arr.join();
         document.write("str : " + str );
         var str = arr.join(", ");
         document.write("<br />str : " + str );
         var str = arr.join(" + ");
         document.write("<br />str : " + str );
     </script>
</body>
</html>
程序结果:
str : First,Second,Third
str : First, Second, Third
str : First + Second + Third 

例子:用数组拼接9*9乘法表
<html>
	<head>
		<meta charset="UTF-8">
		<title>hanxi</title>
		<script type="text/javascript">
            for(var r=1;r<=9;r++){
            	for(var i=1,arr=[];i<=r;i++){
            	     arr[arr.length]=[i,"x",r,"=",i*r,(i*r<10?" ":" ")].join("");
                }
            	console.log(arr.join(""));
            }	
		</script>
	</head>
	<body>
	</body>
</html>


拼接和截取

1.拼接和截取:原对象保持不变,返回新对象

var newArr=arr.concat(新值1,另一数组,新值2····)//拼接

var hege = ["Cecilie", "Lone"];
var stale = ["Emil", "Tobias", "Linus"];
var kai = ["Robin"];
var children = hege.concat(stale,kai); 
结果:
Cecilie,Lone,Emil,Tobias,Linus,Robin 

2.**var subArr=arr.slice(starti,[endi+1]);//截取

第二个参数可省略,如果省略表示从start一直取到结尾,两个参数都可以取负值

var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
var citrus = fruits.slice(1,3); 
结果:
Orange,Lemon
例子:取身份证中的出生日期
var pid="110102198312262111";
var birth=pid.slice(6,-5+1);
console.log(birth);
3.**arr.splice:删除   插入  替换

arrayObject.splice(index,howmany,element1,.....,elementX)

例子:http://www.jb51.net/w3school/js/jsref_splice.htm

4.arr.reverse();

reverse() 方法用于颠倒数组中元素的顺序。

例子:

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.reverse(); 
结果:
Mango,Apple,Orange,Banana

数组排序

数组排序:arr.sort();

问题:默认将所有元素转为字符串升序排列

****比较器函数:专门比较任意两数字大小的函数

特点:

1. 2个参数,分别表示要比较的任意两个数字

2. 无论比较逻辑是什么,都要返回一个数字

***函数对象作为参数:

js中函数本质是一个对象,函数名本质是指向函数对象的变量

*改变比较器的正负,可以颠倒排序的顺序

//函数名后加(),表示立即执行,返回函数执行结果

//将函数作为对象传递时,仅适用函数名,不加()

例子:用比较器比较各个类型的数组

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>排序</title>
        <script type="text/javascript">
            var nums=[1,3,5,12,34,23,145,57,78];
            var emps=["smith","john","eric","tom","ruthy","jerry"];
            function bubble(arr,compare){
                for(var n=1;n<arr.length;n++){
                    for(var i=0;i<arr.length-n;i++){
                        if( compare(arr[i],arr[i+1])>0){
                            var temp=arr[i];
                            arr[i]=arr[i+1];
                            arr[i+1]=temp;
                        }
                    }
                }
            }
            /*专门比较任意两数字的大小*/
            function compareNum(a,b){
                return a-b;
            }//数字升序排列
            function compareNumDESC(a,b){
                return -(a-b);
            }//数字降序排列
            /*专门比较任意两字符串的大小*/
            function compareStr(a,b){
                return a>b?1:a<b?-1:0;
//                if(a>b){
//                    return 1;
//                }
//                if(a=b){
//                    return 0;
//                }
//                if(a<b){
//                    return -1;
//                }
            }//字符串升序排列
            function compareStrDESC(a,b){
                return a>b?-1:a<b?1:0;}//字符串降序排列
            bubble(nums,compareNum);
            console.log(nums);
            bubble(nums,compareNumDESC);
            console.log(nums);
            bubble(emps,compareStr);
            console.log(emps);
            bubble(emps,compareStrDESC);
            console.log(emps);
        </script>
    </head>
    <body>
    </body>
</html>

二维数组:

二维数组:数组中的元素,又引用了另一个子数组对象

何时使用二维数组:2种

1.只要保存横行竖列的二维数据

比如:2048游戏

2.保存上下级关系的数据时

二维数组的创建:

1.先创建空数组,在赋值:

var arr=[ ];

arr[0]=["石家庄","保定","唐山"];

arr[1]=["德州","济南","烟台"];

2.创建数组时,同时初始化子数组:

var data=[

               [0,2,3,4],[0,32,45,2],[2,4,6,23]

];

如何访问二维数组中的数据:arr[行下标][列下标]

比如:data中第2行,第3个元素

          data[1][2];

问题:   console.log(data[1][5]);//undefined

           console.log(data[5][1]);//undefined[1]

强调:二维数组中行下标不能越界,列下标越界会出现undefined,不会报错

例子:二维数组查找城市:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>二维数组</title>
		<script type="text/javascript">
			var provs=["beijing","hebei","henan"];
			var cities=[
			   ["chaoyang","haidian","fengtai"],
			   ["shijiazhuang","tanshan","tianjin"],
			   ["luoyang","kaifeng","zhengzhou"]
			];
			function getCities(prov){
				var i=provs.indexOf(prov);
				//indexOf在provs数组中查找prov的值,找到返回下标
				if(i!=-1){
					alert(cities[i]);
				}else{
					alert("not find!");
				}
			}
		</script>
	</head>
	<body>
		<button οnclick="getCities(prompt('input provience:'))">查询城市</button>
	</body>
</html>

二维数组的遍历:
固定套路:外层循环控制行,内层循环控制列

var arr=[[```````],[````````],[``````````]`````]

固定模板:

for(var r=0;r<arr.length;r++){

       for(var c=0;c<arr[r].length;c++){

            

       }

}

栈和队列:

js中没有真正的栈和队列   ,一切都是用数组对象模拟的

栈:

栈:只能从一端进出的数组,另一端封闭  

何时使用:今后只要希望数组只能从一端进出时

如何使用:2种情况

1.末尾出入栈:已入栈的元素下标不再改变

入栈:arr.push(新值1,新值2,······) //尾插法

出栈:var last=arr.pop();

例子:入栈出栈
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>出入栈</title>
        <script type="text/javascript">
            var bus=[];
            for(var i=0;i<5;i++){
                bus.push("乘客"+i);
            }
            console.log(bus);
            while(bus.length!=0){
            var first=bus.pop();
            console.log(first+"下车");
            console.log(bus);
            }
        </script>
    </head>
    <body>
    </body>
</html>

2.开头出入栈:每次入栈新元素,已入栈的位置都会向后顺移

入栈:arr.unshift(新值1,新值2,······) //头插法

出栈:var last=arr.shift();

例子:乘客上下车

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript">
            var bus=[];
            for(var i=0;i<5;i++){
                bus.unshift("乘客"+i);
            }
            console.log(bus);
            while(bus.length!=0){
            var first=bus.shift();
            console.log(first+"下车");
            console.log(bus);
            }
        </script>
    </head>
    <body>
    </body>
</html>

队列:

只允许从末尾进入数组,必须从开头出数组

入栈:arr.push(新值1,新值2,······) //头插法

出栈:var last=arr.shift();

例子:乘客抢手机

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>队列</title>
		<script type="text/javascript">
			var shen=5;
			var queue=[];
			for(var i=0;i<6;i++){
				queue.push("顾客"+i);
			}
			console.log(queue);
			while(shen>0){
				var first=queue.shift();
				console.log(first+"抢到1部;还剩"+(--shen));
                console.log(queue);
			}
			console.log(queue+"没抢上")
		</script>
	</head>
	<body>
	</body>
</html>

String API:

**String 定义:

字符串:多个字符组成的一个集合(数组),凡是数组对象中,不修改原对象的API,字符串都能用!

比如:slice,indexOf

凡是数组对象中,直接修改原对象的API,字符串都不能使用!

比如:push,sort,pop,shift,unshift,splice

例子:获取身份证号的出生日期

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>string</title>
		<script type="text/javascript">
			var pid="110102198312262111";
			var birth=pid.slice(6,-5+1);
			console.log(birth);
			var gender=pid[pid.length-2]%2==0?"女":"男";
			console.log(gender);
		</script>
	</head>
	<body>
	</body>
</html>

内置对象

内置对象:ES标准中已经定义好的,由浏览器厂商已经实现的对象

11个:String Number Boolean Array Date Math RegExp

Error

Function(所有函数的祖宗) Object(所有对象的祖宗) 

Global(全局)

包装类型

包装类型:专门封装原始类型数据,提供对原始类型数据的操作方法

3种:String Number    Boolean(不能new)

何时使用包装类型:自动使用

为何使用包装类型:原始类型的数据本来没有任何方法,当程序中使用原始类型调用方法时,

程序会自动创建包装类型对象封装该数据    函数调用完,包装类型自动释放

例如:

var n=100;
console.log(new Number(n).toString(2));

转义字符

转义字符:当字符串的内容和程序的特殊符号冲突时   或字符串包含功能字符时

var str="js is \"the best language in internet\"";
console.log(str);
str="\\\"可避免引号\n冲突";
console.log(str);

String API:

string API:所有API不可能直接修改原字符串

 1. 大小写转换:

    都转大写:str.toUpperCase();

    都转小写:str.toLowerCase();

例子:模拟验证码

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>验证码</title>
		<script type="text/javascript">
			var code="4eAt";
			var input="";
			while((input=prompt("请输入验证码:").toUpperCase())!=code.toUpperCase()){
				alert("输入错误");
			}
			document.write('<h1 style="color: gold">验证通过</h1>');
		</script>
	</head>
	<body>
	</body>
</html>

2. 获取指定位置字符:

3种:

1.str[i]      倒数第二个:str[str.length-2]

2.str.charAt(i);

3.str.charCodeAt(i);-->返回字符的unicode号

例子:输出一句话的Unicode编码,且位数相同

<!DOCTYPE html>
<html>
     <head>
	<meta charset="UTF-8">
	<title>验证码</title>
	<script type="text/javascript">
            function encode(input){
            	for(var i=0,arr=[];i<input.length;i++){
            		var unicode=input.charCodeAt(i);
            		
            		//如果Unicode<100-->"000"+unicode
            		arr.push((unicode+100000+"").slice(1));
            	}
                return arr.join(" ");
            }     
	</script>
	</head>
	<body>
		<button οnclick="document.write(encode(prompt('输入一句话:')))">编码</button>
	</body>
</html>

3. 查找关键字的位置:

2种:

1.var i=str.indexOf("kword"[,starti])//从前往后找

如果找不到,返回-1

例子:查找关键字

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>查找关键字</title>
		<script type="text/javascript">
			var kword="my";
			function findKword(input){
				var index=-1;
				while((index=input.indexOf(kword,index+1))!=-1){
					alert("在位置"+index+"发现关键字");
				}
			}
			
		</script>
	</head>
	<body>
		<button οnclick="findKword(prompt('please input a centense:'))">查找关键字</button>
	</body>
</html>
2.var i=str.lastIndexOf("kword"[,starti]);//从后往前找

查找starti 位置左侧第一次出现关键字的位置    starti 默认都是0

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>查找关键字</title>
		<script type="text/javascript">
			var kword="my";
			function findKword(input){
				var index=input.length;
				while((index=input.lastIndexOf(kword,index-1))!=-1){
					alert("在位置"+index+"发现关键字");
                                        if(index==0){break;}//防止第一个字符出现关键字出现死循环
                                }
                       }
			
		</script>
	</head>
	<body>
		<button οnclick="findKword(prompt('please input a centense:'))">查找关键字</button>
	</body>
</html>

获取子字符串:

3种:

1.var subStr=str.slice(starti[, endi+1]);

  pid.slice(6,-5+1)

2.var subStr=str.substring( );

pid.substring(6,pid.length-5+1);//不支持负数参数

3.var subsubStr=str.substr(starti,取几个)

pid.substr(6,8);

例子:查找身份证号的出生日期

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>取字符串</title>
        <script type="text/javascript">
            var pid="412702199306023268";
            var year=pid.slice(6,9+1);
            if(parseInt(pid.slice(10,11))==0){
                var month=pid.slice(11,11+1);
            }
            if(parseInt(pid.slice(10,11))!=0){
                var month=pid.slice(10,11+1);
            }
            if(parseInt(pid.slice(12,13))==0){
                var day=pid.slice(13,13+1);
            }
            if(parseInt(pid.slice(12,13))!=0){
                var day=pid.slice(12,13+1);
            }
            console.log(year+"年"+month+"月"+day+"日");
        </script>
    </head>
    <body>
    </body>
</html>
例子:编码解码

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>解码</title>
		<script type="text/javascript">
			function decode(code){
				for(var i=0,arr=[];i<code.length;i+=5){
					var unicode=code.substr(i,5);
            		                var chare=String.fromCharCode(unicode);
            		                arr.push(chare);
            		               //将chare追加到数组arr结尾
            	                }
                        return arr.join("");
			}
		</script>
	</head>
	<body>
		<button οnclick="document.write(decode(prompt('输入一段编码:')))">解码</button>
	</body>
</html>

例子:邮箱查询用户名

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>邮箱查找用户名</title>
		<script type="text/javascript">
			function mail(email){
                var a=email.indexOf("@");
				var username=email.slice(0,a);
				var domail=email.slice(a+1);
				alert("用户名:"+username);
				alert("域名:"+domail);
			}
			
		</script>
	</head>
	<body>
		<button οnclick="mail(prompt('请输入您的邮箱:'))">输入您的邮箱</button>
	</body>
</html>

模式匹配:

模式匹配:按照规则查找或者替换字符串中的子内容 

查找:2种

1.只能从开始位置,找到第一个匹配的关键字

var i=str.search(/kword/i);   //忽略大小写

何时使用:仅判断有没有关键词时

str.search()与str.indexOf()区别:

str.search():支持模式匹配

str.indexOf():不支持模式匹配   区分大小写

2.获得所有关键字的内容,或个数 

var arr=str.match(/kword/ig);

arr.length表示匹配关键字的个数

如果没找到,返回null

* 都要先判断是否为null,在处理,match无法获得关键字的下标位置*

替换:1种

1.var newStr=str.replace(kword,“替换内容”);

固定模式:利用replace格式化数据

    “替换值”中,也可以使用$n,和RegExp.$n的用法完全相同

例子:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>模式匹配</title>
        <script type="text/javascript">
            var kword=/no/ig;
            var reply="No zuo No die,No can nO bibi";
            var arr=reply.match(kword);
            var reply=reply.replace(kword,"**");
//            if(arr){
//                console.log(reply+" 共替换:"+arr.length+"处");    
//            }else{
//                console.log(reply+" 共替换:0 处");    
//            }
            console.log(reply+" 共替换:"+(arr?arr.length:0)+"处");    
        </script>
    </head>
    <body>
    </body>
</html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script type="text/javascript">
            var str="纪委负值对全国党员干部的纪检监察工作";
            var reg=/纪[检委](监察)?/;
            var arr=null;
            var count=0;
            while((arr=reg.exec(str))!=null){
                    str=str.replace(reg,arr[0].length==2?"**":"****");
                    count++;
            }
            console.log(str);
            console.log("共替换:"+count+"处");
        </script>
    </head>
    <body>
    </body>
</html>
//取生日:
var birth="19931002";
var reg=/(\d{4})(\d{2})(\d{2})/;
birth=birth.replace(reg,"$1年$2月$3日");
console.log(birth); 

切割:1种

1.var arr=str.split(separator,howmany);   arr中以数组形式保存每段子字符串

split() 方法用于把一个字符串分割成字符串数组。

何时使用?今后只要分段处理字符串时都要先分隔在遍历

固定套路:将字符串切割为字符数组

例子:

<script type="text/javascript">

var str="How are you doing today?"

document.write(str.split(" ") + "<br />")
document.write(str.split("") + "<br />")
document.write(str.split(" ",3))

</script>
结果:
How,are,you,doing,today?
H,o,w, ,a,r,e, ,y,o,u, ,d,o,i,n,g, ,t,o,d,a,y,?
How,are,you

例子:句子首字母转大写

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>出入栈</title>
        <script type="text/javascript">
          function parseFirst(stmt){
          	var arr=stmt.split(" ");
          	for(var i=0;i<arr.length;i++){
          		arr[i]=arr[i][0].toUpperCase()+arr[i].slice(1);	
          	}
          	return arr.join(" ");
          }
        </script>
    </head>
    <body>
    	<button οnclick="alert(parseFirst(prompt('please input a sentence:')))">首字母转大写</button>
    </body>
</html>

正则表达式: 

正则表达式:专门规定字符串中字符格式规则的表达式

何时使用:只要定义字符串格式规则,都用正则表达式

最简单的正则:一个关键词的原文,就是最简单的正则

正则表达式的规则:

1.备选字符集:规定某一位字符可选的备选文字列表

语法:[备选字符列表]

强调:无论备选字符集中有多少字符

都必须且只能选1个,一个[ ]只代表1个

[^47]^表示除了,只要不是4,7其他任何字符都行

2.-:表示到   [0-9]

3.预定义字符集:专门表示常用的连续的字符集

\d==>[0-9]  :1位数字

\w==>[a-zA-Z] :1位字母或下划线

\s==>[\t\n    空字符]:代表一位空字符:空格,tab符

.:除了 换行外,其他所有的字符

\D,\W,\S-->除了\d\w或\s

4.量词:规定一个字符集出现的次数:2种

明确数量:3种:{min,max}

                           {min,}最少min位

                            {n}:必须n位

不确定数量:3种

?   ==>{0,1}:可有可无,最多1次

*     ==>{0,}:可有可无,数量不限

+    ==>{1,}至少一次,数量不限

身份证号:15位数字

                    2位数字

                   最后一位数字或x X

                  后三位可有可无,但最多出现1次

正则表达式:\d{15}(\d{2}[0-9xX])?

手机号:+86 或0086     可有可无,最多一次

                空字符 可有可无,数量不限

                 1

                  从3,4,5,7,8选一个

                  最后九位数字

正则表达式:(\+86|0086)?\s*[1][3,4,5,7,8]\d{9}

**RegEXp对象:

正则表达式对象:封装了正则表达式,提供了利用 正则表达式执行验证和查找的API

何时使用:只要利用正则表达式执行验证和查找功能时

对象创建:2种

**1.var reg=/正则表达式/ig;

何时使用:正则表达式在运行时不会改变

2.var reg=new RegExp("正则表达式","ig");

何时使用:在运行时正则表达式可能被改变

注意:所有\都要改为\\

var str1="\\d{6}";

var str2="\\d{15}(\\d\\d[0-9xX])?";

var reg=new RegExp(str2,"");

如何使用:2种操作

1.格式验证:var bool=reg.test(str);

验证:要求从头到尾必须完整匹配

问题:test方法默认只要部分匹配即可

解决:都要在正则表达式前加^,后加$

            ^表示开头位置的XXXX

             $表示结尾位置的XXXX

            ^,$连用,必须是

密码强度要求:6-8位密码,只能是字母,数字的组合

                         至少包含一位大写字母

                         至少包含一位数字

预判:1.不全由小写字母或数字组成

               可能包含大写或符号

             (?![a-z0-9]*$)

            2.不全由大写字母或小写字母组成

                 可能包含数字或符号

                 (?![A-Za-z]*$)

正则表达式:只能是字母数字的组合--》屏蔽了符号  [a-zA-Z0-9]{6}

(?![a-z0-9]*$)(?![A-Za-z]*$)[a-zA-Z0-9]{6}

例子:6位密码验证

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>正则密码验证</title>
        <script type="text/javascript">
            var reg=/^(?![a-z0-9]*$)(?![a-zA-Z]*$)[a-zA-Z0-9]{6}$/;
            while(!reg.test(prompt("输入新密码:"))){
                alert("密码格式不符:6-8位密码,只能是字母,数字的组合,至少包含一位大写字母,至少包含一位数字");
            }
            alert("密码输入完毕");
        </script>
    </head>
    <body>
    </body>
</html>

2.查找API

var arr=reg.exec(str):在str中查找所有符合reg规定的关键字   要加g

其中:arr[0]:保存了当前关键字的内容

           arr.index:保存了当前关键字的位置

          reg.lastIndex:保存下次开始查找的位置

何时使用:只要即查找内容,又查找位置,只能用reg.exec();

例子:

var str="明明喜欢我,却不告诉我;别理我,我想静静;静静是谁?你先告诉我明明是谁";
var reg=/明明|静静/g;
var arr=null;
while ((arr=reg.exec(str))!=null){
    console.log("在位置"+arr.index+"发现关键字"+arr[0]);
    console.log("下次从"+reg.lastIndex+"开始找");
}


正则表达式的贪婪模式和懒惰模式:

默认贪婪模式:默认总是匹配最长的符合条件的字符串

原因: .*或 .+引起   .忽略多长 省略

懒惰模式:仅匹配最短的符合条件的字符串

把贪婪-->懒惰:(.*?)

从正则表达式匹配结果中获取子内容:2步

1.正则表达式中,用()包括要获取子内容的步分

2.在程序中,本次查找后:RegExp.$n

            取本次匹配结果中第n个()匹配的内容

           正则中n从1开始

例子:网络爬虫:找a 标签内href的内容

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>正则表达式找HTML的链接</title>
		<script type="text/javascript">
			var html='<h1 class="h1"><a class="curr" href="n++.html">fhftyhyffjj</a><a name="top"></a><div id="main"></div><A href="function.html">rtytyjyu</A><link href="stylesheet"/></h1>';
            var reg=/<[aA]\s(.*?)href\s*=\s*(['"])([^'"]*)(\2)/g;
            //                1               2      3     必须和(2)内容相同
            var arr=[];
            while((arr=reg.exec(html))!=null){
            	console.log(RegExp.$3);
            }
		</script>
	</head>
	<body>
	</body>
</html>
例子:去头尾空格

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
			//去掉str前的空字符
			function ltrim(str){
				var reg=/^\s+/;
				return str.replace(reg,"");
			}
			//去掉str后的空字符
			function rtrim(str){
				var reg=/\s+$/;
				return str.replace(reg,"");
			}
			//去掉str前后的空字符
			function lrtrim(str){
				var reg=/^\s+|\s+$/g;
				return str.replace(reg,"");
			}
			var str="  \tHellow world  ";
		</script>
	</head>
	<body>
		<button οnclick="alert(ltrim(str))">去前空字符</button>
		<button οnclick="alert(rtrim(str))">去后空字符</button>
		<button οnclick="alert(lrtrim(str))">去前后空字符</button>
	</body>
</html>

*Math:专门执行数学计算的对象

math:封装了数学计算中常用的常量                

1.取整:3种

1.上取整     Math.ceil(n);

2.下取整          Math.floor(n)

3.四舍五入取整      Math.round(n)

函数Math.round()与n.toFixed(i小数位数)区别:

round是Math对象    只能取整  返回数字

toFixed Number对象   可以按任意小数位数四舍五入  返回字符

2.乘方/开方:

乘方:Math.pow(n,m):计算n的m次方

开方:Math.sqrt(n):计算n的平方根

3.获得最大值/最小值:

Math.max(a,b,c,d···········);

Math.min(a,b,c,d···········);

固定套路:

Math.max.apply(Math,arr);------->Math.max(arr[0],arr[1]···········)变现实现获取数组中的最大值

Math.min.apply(Math,arr);------->Math.min(arr[0],arr[1]···········)变现实现获取数组中的最小值

4.随机数:Math.random();

0<=n<1

任意min到max之间取一个随机整数

parseInt(Math.random()*(max-min+1)+min);

例子:随机生成验证码,并验证

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>随机城市验证码</title>
		<script type="text/javascript">
			var chars=[];
			//将0-9存入数组
			for(var c=48;c<=57;chars.push(String.fromCharCode(c++)));
			for(var c=65;c<=90;chars.push(String.fromCharCode(c++)));
			for(var c=97;c<=122;chars.push(String.fromCharCode(c++)));
//			console.log(chars.length);//62
			//专门生产一个4位的随机验证码
			function getCode(){
				for(var i=0,arr=[];i<4;i++){
					var n=chars[parseInt(Math.random()*62)];
					arr.push(n);
				}
				return arr.join("");
			}
			function valiCode(){
				var code=getCode();
				var input="";
                while((input=prompt('请输入验证码:'+code).toUpperCase())!=code.toUpperCase()){
				    alert("验证码输入错误"); 
				    code=getCode();
			    }
				document.write('<h1 style="color: green;">验证通过!</h1>');
			}
		</script>
	</head>
	<body>
		<button οnclick="valiCode()">验证码</button>
	</body>
</html>

*Date:

Date:封装了一个时间点,提供了对时间和日期计算的API

Date:封装什么?从1997年1月1日0点0分0秒至今的毫秒数

创建Date对象:4种

1.var now=new Date();  //创建一个新日期对象,同时保持了当前时间点的毫秒数----------获得当前时间

2.var time=new Date("xxxx/xx/xx [xx:xx:xx]");

3.var time=new Date(年,月,日[时,分,秒]);

date.getTime():获得日期对象中的毫秒数

Date  API:

1.每个分量都有一对get/set方法

  getDay()获得星期,没有setDay()

2.命名:年月日星期,不加s

             时分秒毫秒,加s

             get/setFullYear()

3.返回值:月中的日取值范围从1开始到31结束

              其余都是从0开始到减1结束

4.赋值日期时间

var date1=new Date();

var dates=new Date(date1.getTime());

                //new Date(毫秒数)

date2.setXXX(date2.getXXX()+-n);

Date 计算:(2种)

1.两日期对象可直接相减,结果毫秒差

2.对任意分量做加减:先get出来,计算,在set回去

直接修改原日期对象

date.setXXX(date.getXXX()+-n);

例子:计算合同到期时间,合同续签时间

           var hiredtime=new Date("2015/6/30");
            var endtime=new Date(hiredtime.getTime());
            endtime.setFullYear(endtime.getFullYear()+3);
            console.log(endtime.toLocaleDateString());//输出合同到期日期
            var renewal=new Date(endtime.getTime());
            renewal.setMonth(renewal.getMonth()-1);
            if(renewal.getDate()==6){
            	renewal.setDate(renewal.getDate()-1);
            }else if(renewal.getDate()==0){
            	renewal.setDate(renewal.getDate()-2);
            }
            console.log(renewal.toLocaleDateString());//输出合同续签日期--合同到期前一个月
            var remind=new Date(renewal.getTime());
            remind.setDate(remind.getDay()-7);
            console.log(remind.getDay());//续签之前提前一周发通知*/
           //x个工作日之后













  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值