1.栈和队列
js 中没有真正的栈和队列的类型,一切都是用数组对象模拟的
(1)栈:一端进出的数组;FILO(first in last out)
1.末尾出入栈:已入栈元素的下标不再改变
入栈:arr.push();
出栈:var last = arr.pop();
2.开头出入栈:每次入栈新元素时,已入栈元素的位置都会向后顺移
入栈:arr.unshift();
出栈:var first = arr.shift();
(2)队列:末尾进入数组,开头出;FIFO
末尾入队列:arr.push();
开头出队列:var first = arr.shift();
2.二维数组中,行下表不能越界。
3.String对象
定义:多个字符组成的一个只读的集合(数组)。字符串的API都不能修改字符串本身。
凡是数组对象中,不修改原对象的API,字符串都能用;如:.length、可用 [i] 访问每个字符等。
凡是数组对象中,直接修改原对象的API,字符串都不能用。
(1)内置对象
就是ECMAScript标准中定义好的,有浏览器厂商已经实现的标准对象。
内置对象中封装了专门的数据和操作数据常用的API。
JavaScript包含11个内置对象:
String、Number、Boolean(原始类型的对象)
Array、Date、Math、RegExp(正则表达式对象)(引用类型对象)
Error(出错信息对象)
Function(所有函数对象的祖宗)、Object(所有对象的祖宗)
Global(全局,页面中等同于window)
(2)包装类型
临时封装原始类型数据,并提供对原始类型数据的操作方法。
何时使用:自动使用。
为什么使用:原始类型的数据(String、Number、Boolean)本来没有任何方法,当程序中使用原始类型数据调用方法时,程序会自动创建包装类型对象,封装该数据。
函数调用完,包装类型自动释放。
4.String的API
(1)获取子字符串
1.var subStr = str.slice(starti [, endi + 1]);支持负参数(倒着数)
2.var subStr = str.substring(starti [, endi + 1]);不支持负参数
3.var subStr = str.substr(starti , n);n—取几个
(2)大小写转换
1. str.toUpperCase();
2. str.toLowerCase();
(3)获取指定位置字符
1. str[i]; 倒数第二个:str[str.length - 2];
2. str.charAt(i);
3. str.charCodeAt(i);返回字符的Unicode号
(4)查找关键字位置
1. var i = str.indexOf("keyword" [ , starti ]);找不到返回 -1。
2. var i = str.lastIndexOf("keyword" [ , starti ]);在左侧查找,左侧只要包含关键字的首个字符就可以找出。
(5)分割字符串
var arr = str.split("分隔符");arr中以数组形式保存每段字符串。
固定套路:将字符串切割为字符数组:var chars = str.split("");
(6)模式匹配:按照规则查找或替换字符串中的内容
查找:
1. var i = str.search(/keyword/ i);只能从开始位置,找第一个匹配的关键字。“i”不区分大小写
何时使用:仅判断有没有关键字时
与indexOf比较,search可以不区分大小写,indexOf区分大小写。
2. var arr = str.match(/keyword/ ig);
获得所有关键字的内容;arr.length 表示匹配的关键字个数;如果没有返回 null;无法获得关键字下标位置;
替换:var newStr = str.replace(模式,"替换内容");
5.正则表达式
1.手机号:
(1)+86或0086 可有可无,最多一次;
(2)空字符可有可无,数量不限;
(3)第一位必须是:1;
(4)第二位从3,4,5,7,8中选一个;
(5)最后必须是9位数字。
正则表达式:(\+86|0086)?\s*1[34578]\d{9}
2.身份证号:
(1)首先15位数字;
(2)2位数字 + 最后一位是:数字或 x,X;
(3)最后3位可有可无,最多出现1次。
正则表达式:\d{15}(\d{2}[0-9xX])?
6.RegExp对象(正则表达式API)
封装了正则表达式,提供了利用正则表达式执行验证和查找的API。
(1)创建:
1. var reg = / 正则表达式 / ig;正则表达式在运行时不会改变时使用。
2. var reg = new RegExp("正则表达式","ig");运行时正则可能被改变时使用。(正则中的 \ 都要改为 \\ 。)
(2)应用:格式验证 + 查找
1.格式验证:var bool = reg.test(str);
验证:要求从头到尾必须完整匹配。
问题:test方法默认只要部分匹配即可。
解决:在正则表达式前加 ^(表示开头位置),后加 $(表示结尾位置)。
^ 和 $ 联用表示从头到尾必须完整匹配。
例子:密码强度要求:
(1)6位密码,只能是字母、数字的组合;
(2)至少包含一位大写字母;
(3)至少包含一位数字。
预判:1.不全由小写字母或数字组成;(可能包含大写或符号)—> (?![a-z0-9]*$)
2.不全由小写字母或小写组成;(可能包含数字或符号)—> (?![a-zA-Z]*$)
正式规则:只能是字母数字的组合 —> 屏蔽了符号 —> [a-zA-Z0-9]{6}
完整的正则表达式:(?![a-z0-9]*$) (?![a-zA-Z]*$) [a-zA-Z0-9]{6}
2.查找API:var arr = reg.exec(str);在str中查找所有符合reg的关键字。(要加g)
每次查找arr中只保存一个查找结果,故需要循环exec()方法,其中:
(1)arr[0]:保存了当前关键字的内容;(因为只保存一个结果,所以在 0 的位置)
(2)arr.index:保存了当前关键字的位置;
(3)reg.lastIndex:保存下次开始查找的位置。
何时使用:只要既查找内容,有查找位置,只能用该方法。
7.查找总结
(1)var i = str.search(reg) ;—> 判断有没有;缺:不能指定开始位置。
(2)var arr = str.match(reg) ;—> 获得所有关键字内容、个数;缺:不能反悔位置 。
(3)var i = str.indexOf("keyWord" [,starti]) ;—> 从指定位置开始查找下一个关键字位置;缺:不支持正则。
(4)var arr = reg.exec(str);—> 即获得内容,又获得位置;缺:复杂。
8.String中的正则API(将正则与String对象中的方法结合)(略~没看)