JavaScript基础知识(7)

 内置对象既能保存数据又能操作数据

 内置对象中封装了专门的数据和操作数据常用的API。
 JavaScript内置十个对象列表:String,Boolean,Number,Date,Math,Error,Function,Object,Global

 使用一个没有声明的对象,会出错,不是undefined

 包装类型:专门封装原始类型的数据,并提供对数据常用操作的内置类型。为什么要用包装类型:让原始类型的数据也可以像引用类型一样,拥有方法和属性

 var num=5.678;  //原始类型
 //num=bew Number(num);  包装类型
 console.log(num.toFixed(2));
 //num=null;   释放包装类型对象

 何时使用包装类型:只要用原始类型的数据调用方法或访问属性时,js引擎都会自动创建对应的包装类型对象。方法调用完,包装类型对象自动释放。


 String对象用于处理文本字符串。
 创建字符串:
 var str="...";   //原始类型
 var str=String("...");  //原始类型,并不是定义一个字符串,而是将其他类型转换成字符串,是类型转换,只有通过new才能创建包装类型对象(数组除外)
 var strObj=new String("...");  //包装类型对象

 var stuName='Smith';   //直接量,程序中直接使用的值
 var priceString=String(3355);  //类型转换


 转义字符:1.代替字符串中的非打印字符
           2.如果字符串内容中包含和语法冲突的特殊字符,可用\转为普通字符


 字符串内容一旦创建,不可改变!如果修改,都要创建新新字符串,保存新结果,替换旧字符串
 规律:所有字符串API都需要变量接收返回值,否则无法拿到新值。

 字符串的字符个数:length属性
 字符串类型底层其实全都是用字符数组实现的。!!
 比如:str[i]


 大小写转换:大小写字母一视同仁时,要先转化,再处理。
 比如:重名验证,重复邮箱,验证码

 例:
 var code="5AsD";
 var input="";
 while((input=prompt("输入验证码"+code)).toLowerCase()!=code.toLowerCase()){
 alert("验证码错误");
 }document.write("登录成功");


 获取指定位置的字符:var char=str.charAt(index); //在index位置的char

 例:提取身份证倒数第二位判断性别
 var pid="11012198006282151";
 var char=paid.charAt(pid.length-2);
 console.log(char%2==0?"女":"男");


 获取指定位置字符的Unicode编号:var num=str.charCodeAt(index);

 加密和解密
 input=prompt("输入消息:");
 var result="";    //初始化为字符串
 for(var i=0;i<input.length;i++){
 input.charCodeAt(i);
 result+=input.charCodeAt(i);   //初始化后输入数字也会以字符串形式相加
 }
 document.write(result);

 上述方法用下面来实现更好:
 input=prompt("输入消息:");
 var result=[];
 for(var i=0;i<input.length;i++){
 result.push(input.charCodeAt(i));
 }
 document.write(result.join(""));


 优化定律:
 频繁对字符串+=,要用数组代替:
 step1.每个子字符串放入数组
 step2.join("")拼接数组元素


 只要不足5位前面都要补齐0的案例:
 input=prompt("输入消息:");
 var result=[];
 for(var i=0;i<input.length;i++){
 var num=input.charCodeAt(i);
 if(num<10000){
  var arr=[0,0,0,0,0];     
  var code=num+"";        //转为字符串的一种常用方法
  var start=5-code.length;  //start是确定从哪个地方将编码插进去
  for(var n=0;n<code.length;n++,start++){
  arr[start]=code[n];    //修改arr[]里面元素值
 }
 num=arr.join("");
 }result.push(num);
 }
 document.write(input+"<br/>");
 document.write(result.join(""));


 从性能上来说,将任何类型变成字符串+""这种方式比toString方法要快


 字符串三大操作:任何语言中都有的
 1.查找关键字
 2.替换关键字
 3.获取子字符串

 查找关键字:var index=str.indexOf("关键字");
 返回的是关键字所在位置。如果没找到,返回-1
 indexOf:懒(一段话中可能包含多个关键字,但是永远只找第一个关键字的位置),蠢(默认只能从位置0开始)

 稍微聪明点的方法:
 var index=str.indexOf("关键字",from);
 from:表示开始查找的位置,从from开始向后查找

 例:
 var str="女神说要来,我草草的收拾了房间。结果她又说不来了。我说:我草";
 var index=str.indexOf("我草");
 console.log("位置"+index+"发现关键字");
 index=str.indexOf("我草",index+1);
 console.log("位置"+index+"又发现关键字");


 可用下面方法实现:
 var str="女神说要来,我草草的收拾了房间。结果她又说不来了。我说:我草";
 var index=-1;
 while((index=str.indexOf("我草",index+1))!=-1){
 console.log("位置"+index+"发现关键字");
 }
 //index+1表示从上次找到的位置之后开始

 从最后一个字符向前找:
 var index=str.lastIndexOf("关键字",from);
 from:从开始位置往前找
 今后只要关键字离结尾近,就用lastIndexOf

 var index=str.lastIndexOf("关键字",from);和var index=str.indexOf("关键字",from);虽然查找方向不同,但是二者返回的index完全相同,因为字符在数组中的下标是固定的

 从后向前查找:
 var str="女神说要来,我草草的收拾了房间。结果她又说不来了。我说:我草";
 var index=str.length;
 while((index=str.lastIndexOf("我草",index-1))!=-1){
 console.log("位置"+index+"发现关键字");
 }



 截取子字符串:var subStr=str.slice(start,end+1)
 返回值是子字符串
 str.substring(start,end+1)用法同slice,唯一的差别是这个方法不支持负值作为参数,但是这个方法在其他语言里兼容,slice在其他语言里是没有的。
 str.substr(start,count)这个方法可可以获取子字符串,但是第二个参数是字符个数。
 以上三种获取子字符串的方法,省略第二个参数,都是默认取到结尾

 例:
 var pid="110102198006282151";
 var birth=pid.slice(6,13+1);
 console.log(birth);
 还可以用负数从后往前取:
 var pid="110102198006282151";
 var birth=pid.slice(-4-8,-4);
 console.log(birth);


 回顾:
 var num=str.length:字符个数
 str=str.toLowerCase()/toUpperCase()
 var char=str.charAt(index):指定位置的字符
 var code=str.charCodeAt(index):指定位置的字符的Unicode编码

 查找关键字:
 var index=str.indexOf("关键字"[,from])
 var index=str.lastIndexOf("关键字"[,from])

 获取子字符串:var subStr=str.slice(start,end+1);
                      str.substring(start,end+1);
                      str.substr(start,count);


 只要不足5位前面都要补齐0的案例,可用下述方法实现:
 input=prompt("输入消息:");
 var result=[];
 for(var i=0;i<input.length;i++){
 var num=input.charCodeAt(i);
 if(num<10000){
  num=num+10000+"";     
  num="0"+num.slice(1);
 }result.push(num);
 }
 document.write(input+"<br/>");
 document.write(result.join(""));

 上述案例解码如下:
 var input=prompt("粘贴编码");
 var arr=[];
 for(var i=0;i<input.length;i+=5){
  var code=input.substring(i,i+5);
  arr.push(String.fromCharCode(code));
  var result=arr.join("");
 }
 document.write(input+"<br/>");
 document.write(result);

277842493521531

 按规律分割字符串:
 var subs=str.split("分隔符",count)  =>返回切割后的数组
 count值可有可不有,不加的时候后面的都是
 分隔符在结果中时不包含的
 开头和结尾包含分隔符,会返回空元素

 将每个单词首字母大写:
 var str="no zuo no die";
 var words=str.split(" ");
 for(var i=0;i<words.length;i++){
 words[i]=words[i][0].toUpperCase()+words[i].substring(1);
 }
 str=words.join(" ");
 //取每个单词元素的首字母转大写,拼第二个字母之后的所有字符

 例:
 var str="选购AppleCare+,延保2年";
 var engCount=0;
 var numCount=0;
 var chsCount=0;
 var other=0;
 for(var i=0;i<str.length;i++){
 var num=str.charCodeAt(i);
 if(num>=19968&&num<40869){
 chsCount++;
 }else if((num>=65&&num<=90)||(num>=97&&num<=122)){
 engCount++;
 }else if(num>=48&&num<=57){
 numCount++;
 }else{
 other++;
 }
 }
 document.write("<br/>"+str);
 document.write("<br/>"+"汉字"+chsCount+"个<br/>"+"数字"+numCount+"个<br/>"+"字母"+engCount+"个<br/>"+"其他字符"+other+"个<br/>");


 判断字符的种类:用Unicode范围
 Unicode          字符种类
 48-57:         0-9数字字符
 65-90:        A-Z大写字母
 97-122:       a-z小写字母
 19968-40869:   汉字
 此外的:        其他字符


 什么是模式匹配:可以设置查找或替换的规则
 何时使用模式匹配:要查找的关键字可能发生有规律的变动时

 如何使用模式匹配:
 1.先定义模式:/关键字/模式    ==>斜线里面不要加双引号
   如:var str="No zuo no die";
       var reg=/no/i;    //忽略大小写,其中no是要查找的关键字原文,不加双引号,i表示忽略大小写

 String类型中,提供了专门支持模式匹配的API

 按模式替换关键字:str=str.replace(reg,"新值");  ==>不能修改原字符串的
 默认的replace仅替换第一个关键字,要想全局替换,要在模式中定义"g"
 replace方法也可以使用字符串直接替换,但是一般优先选择带模式转换的替换

 例:
 var str="No zuo no die";
 var reg=/no/i;   /i忽略大小写,g全局查找/替换
 str=str.replace(reg,"**");
 document.write(str);    //只能替换第一个,后面的不管了,但是如果将var reg=/no/ig;  这样的话就能全局替换了


 match方法:获得所有关键字的内容:
 var kwords=str.match(reg);
 只能取得关键字的内容,无法确定每个关键字的位置。如果未找到关键字,返回null。今后只要有可能返回null,在用之前就要先判断是否为null。
 kwords.length:返回的是找到的关键字的个数


 例:
 var str="No zuo no die";
 var reg=/no/ig;   /i忽略大小写,g全局查找/替换
 var kwords=str.match(reg);
 document.write(kwords+"<br/>");
 str=str.replace(reg,"**");
 document.write(str);    //只能替换第一个,后面的不管了,但是如果将var reg=/no/ig;  这样的话就能全局替换了
 document.write("共替换了"+kwords.length+"处");

 上述案例中,如果关键字没找到,那么kwords.length会出错,因为kwords返回值是null

 search方法:
 var index=str.search(reg);用法和indexOf()方法完全相同,但是indexOf不支持模式查找,但是search其实是indexOf的模式查找版,且每次都是从最初位置开始匹配,只有一个参数


 正则表达式:只要在网页中处理格式都要使用正则表达式!
 什么是正则表达式:一个字符串中,字符出现的规律。
 何时使用正则表达式:验证字符串格式,查找关键字,替换关键字
 比如:银行卡查询密码:6位数字
       用户名:字母,数字,下划线的组合

 正则表达式是统一的,和哪种语言无关

 正则表达式中的选择符号:[所有备选字符],这种中括号选择符只能多选一,不能不选,如[去草]
 一个[],只能代表1位字符,无论写多少字符,都只能匹配一个,且必须匹配一个字符。
 可以使用多个[][]来匹配多个字符
 如果在[]里面的第一个位置使用^,[^],表示除了xxx都行
 [^xxx]:^如果放在备选字符中间,就变成普通字符匹配了,必须放在[]中的第一个位置

 -符号:表示字符的范围:备选字符是连续的范围时使用
 如:[1-9][0-9]匹配一个两位数
     [A-D]匹配A~D中的一个,不是进行减法
     [a-zA-z]匹配a~z和A~Z中的一个,横线-可以局部使用
 匹配汉字范围:[\u4e00-\u9fa5]

 如:我[\u4e00-\u9fa5]:匹配“我”后面加任意一个汉字
     [\u4e00-\u9fa5][\u4e00-\u9fa5]:匹配两个汉字

 正则表达式的专用字符:
 \d  匹配一个数字

 预定义字符集:使用简化的符号,来定义常用字符集
 比如:[0-9] -->\d
 [a-zA-z_] -->\w  打印字符,匹配一位字母或者下划线,数字
 空字符-->\s   匹配一切看不到的字符,空字符,空格,制表符等

 86\s1[3578]
 \w\w\w\w\w\w@\w\w\w\w\w\.com   匹配邮箱,后面的点要加\转义
 凡是在正则表达式中的原文不会有颜色的,如这里的@和com

 如果规则正文中出现特殊符号,用\转为原文
 “.”代表一个任意字符,如果不加转义\的话,那个位置随便什么字符都可以

 +86\s1[3578]这里的“+”要转义才行 -->\+86\s1[3578]

 数量词:规定前边一个字符出现次数的量词
 语法:{min,max}
 例:\d{6,8}规定
 {num}:固定长度
 {min,}至少min个,多了不限

 手机号:\+86\s1[3578]\d{9}
 用户名8位以上字母或数字的组合:\w{8,}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值