JavaScript高级程序设计(第3版)笔记(五)下

来源:互联网 发布:mysql应用 编辑:程序博客网 时间:2024/06/09 23:59
5.3  Date类型
        (1)创建日期对象,使用new和Date构造函数,在不传参的情况下自动获取当前日期和时间,传参需要是表示该日期的毫秒数
             var now = new Date();
        (2)Date.parse()接收一个表示日期的字符串,返回相应的毫秒数,如果该字符串不能表示日期则返回NaN
            如果向new Date()方法中直接传入字符串,后台也会自动调用date.parse()

            注:Date.parse()可以接收的字符串格式"yyyy/MM/dd hh:mm:ss","yyyy-MM-dd hh:mm:ss",不识别"yyyy年MM月dd日 hh

                时mm分ss秒"."yyyy-MM-dd hh:mm:ss"这个格式在IE中转换应该存在问题,最好去掉后面的时分秒,改成"yyyy-MM-dd"

        (3)Date.UTC()与Date.parse()类似,返回对应的毫秒数,传入的参数分别为年(必传),月(0-11)(必传),日(可选),               时(0-23)(可选),分(可选),秒(可选)。如果向new Date()方法中直接传入对应格式的参数,后台会自动调用                     date.UTC();           
var currentTime = new Date(Date.UTC(2005,4,5,17,55,55))  var currentTime1 = new Date(2005,4,5,17,55,55);  console.log(currentTime);  //Fri May 06 2005 01:55:55 GMT+0800 (中国标准时间)  console.log(currentTime1); // Thu May 05 2005 17:55:55 GMT+0800 (中国标准时间)

              注:因为Date.UTC()读取的是0时区的时间,返回的本地时间,而new Date()返回的是本地时间,东八区的时间,所以产

                     生了区别,相差8小时;0时区加8小时为东八区时间

        (4)Date.now(),返回调用此方法时的时间的毫秒数,IE9+支持
         注:使用在Date对象前加"+",可使日期变毫秒数 如:var t = +new Date(); console.log(t) //1512875829669              
var date1 = new Date(2007,0,1);var date2 = new Date(2007,1,1);alert(date1 < date2 );//true
               时间之间的比较实际上后台调用了valueOf(),返回的毫秒数进行的比较
             3.Date类型转换字符串方法:             
(new Date()).toDateString();//"Sun Dec 10 2017"(new Date()).toTimeString();//"11:29:09 GMT+0800 (中国标准时间)"(new Date()).toLocaleDateString(); //IEedge: "2017年12月10日" chorme: "2017/12/10"(new Date()).toLocaleTimeString(); //IEedge: "11:30:17"       chorme: "上午11:31:46"(new Date()).toUTCString();      // "Sun, 10 Dec 2017 03:34:19 GMT" 显示完整的UTC时间(0时区)
        (5)其他的Date API
           getTime()获取毫秒时间
           单位:FullYear Month Date Day Hours Minutes Seconds Milliseconds
           1.每个单位,都有一对儿getXXX/setXXX方法
             其中getXXX负责获取指定分量的值
             setXXX负责修改指定分量的值
             特殊: Day星期  没有setXXX
           2.命名: 年月日星期 没有s 时分秒毫秒 有s
             计算: 
             1. 两个日期可相减,结果是毫秒差
             2. 对任意分量做加减:   
                1. 取分量: var n=date.getXXX();
                2. 做加减: n+/-=?
                3. 放回去: date.setXXX(n)
                   setXXX可自动调整进制 
             简写: date.setXXX(date.getXXX()+n)      
        相关推荐:https://www.cnblogs.com/polk6/p/4156595.html       
      5.4  RegExp类型 
         (1)字面量形式定义的正则表达式:             
             var expression = /pattern/flags;
             pattern表示正则表达式,flags表示匹配模式:
             g:表示全局,应用于所有字符串,并不是找到第一个匹配就停止 
             i:表示查找时不区分大小写
             m:表示多行模式,即查找玩第一行之后是否继续查找第二行
             :(,),{,},[,],\,^,$,|,?,*,+,.符号在模式中需要进行转义,如:[ => \[
             如:匹配第一个"[bc]at",不区分大小写  var pattern = /\[bc\]at/i;
           使用RegExp构造函数定义正则表达式:(接收两个参数,一个为字符串模式,一个是可选的标志字符串)
             注:由于传递给构造函数的两个参数都为字符串,所以在某种情况下需要双重转义
                 匹配第一个"[bc]at",不区分大小写  var pattern = new RegExp('\\[bc\\]at','i');
        (2)RegExp实例属性
           global:布尔值,表示是否设置了g标志
           ignoreCase:布尔值,表示是否设置了i标志
           lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0算起
           multiline:布尔值,表示是否设置了m标志
           source:正则表达式的字符串表示,按照字面量形式而非构造函数中的字符串模式 
        (3)RegExp实例方法
           pattern.exec(),接收一个字符串作为参数,返回包含第一个匹配项信息的数组,没有匹配项的情况返回null。
             返回的数组中包含两个属性:index表示匹配项在字符串中开始的位置,input表示应用正则表达式的字符串
            (如果没有捕获组,数组只包含一项)             
var text = "mom and dad and baby";var pattern = /[a,d][n,a]d/ig;var match1 = pattern.exec(text);console.log(match1); //["and", index: 4, input: "mom and dad and baby"]console.log(pattern.lastIndex); //7  match1 = pattern.exec(text);    console.log(match1); //["dad", index: 8, input: "mom and dad and baby"]console.log(pattern.lastIndex); //11
           注:如果没有g标志,每一次执行exec方法时都会从头开始而不会继续从上一次执行后的位置开始。
              pattern.lastIndex实际上为index加匹配项长度之后返回的下标 
           pattern.test("字符串")验证,匹配的情况,返回true,表示字符串中存在;否则返回false,表示字符串中不存在
           RegExp实例继承的toLocaleString()和toString()方法都会返回正则表达式的字面量,与创建表达式的方式无关            
var pattern = new RegExp("\\[bc\\]at","ig");console.log(pattern.toString());      //   /\[bc\]at/gi typeof(pattern.toString());           //   "string"console.log(pattern.toLocaleString());//   /\[bc\]at/gi typeof(pattern.toLocaleString());     //   "string"console.log(pattern.valueOf());       //   /\[bc\]at/gi pattern.valueOf() instanceof RegExp;  //   true
(4)字符集:规定一位字符可用的备选字符列表,[字符列表],一个字符集只修饰一个字符,只能从字符集中选一个
           常见字符集:一个字母:[A-Za-z]
                       一个数字:[0-9]
                       一位汉字:[\u4e00-\u9fa5];
           注:"除了xxxx" : [^xxx]  如: 除了4和7 [^47] ^必须放在[]内的开头
           预定义字符集:常用字符集的简化:
                1个数字: \d=>[0-9]    非数字:\D
                1个数字,字母,_:\w   非数字字母下划线:\W   
                1个空字符: \s        非空字符 \S
                1个任意字符:.
           量词:固定一个字符集出现次数的规则
                 字符集{m,n} 字符集最少m个,最多n个
                 字符集{m,}  m个以上
                 字符集{m}   必须m个
                 字符集?  可有可无,最多1个
                 字符集*  可有可无,个数不限
                 字符集+  至少1个,多了不限
           选择和分组:
                 选择: 规则1|规则2  读作"或"在两个规则中匹配其一即可。
                 分组: 将一组规则,用()包裹
           指定匹配位置:         
                 ^ 匹配字符串开头 如: 匹配开头的空字符: ^\s+
                 $ 匹配字符串结尾 如: 匹配结尾的空字符: \s+$
                      
            \b 匹配单词边界 一般成对出现 如:var pattern = /\bhello\b/ig ;  
            相关推荐:https://www.cnblogs.com/moqing/archive/2016/07/13/5665126.html
        面试题:判断一个字符串中出现最多次数的字符

            方法1:

var str = "addadddadddfafgg" ;var arr = str.split("");arr.sort();str = arr.join("");var pattern = /(\w)\1*/g;var newArr = str.match(pattern);newArr.sort(function(a,b){       return a.length < b.length;})         console.log(newArr[0][0] +":"+ newArr[0].length + "次"); //d:8次

                   此方法引用:https://www.cnblogs.com/blank-string/p/6001530.html

            方法2:

var str = "addadddadddfafgg" ;var arr = str.split("");arr.sort();str = arr.join("");var pattern = /(\w)\1*/g;var value = '';var index = 0;str.replace(pattern,function($0,$1){if(index < $0.length){           index = $0.length;           value = $1;        }}) console.log('最多的字符:'+value+',重复的次数:'+index);   //最多的字符:d,重复的次数:8   

                   注:正则表达式中的小括号"()"代表分组。 如果再其后面出现\1则是代表与第一个小括号中要匹配的内容相同。
                           \1必须与小括号配合使用
      5.4  Function类型 
           函数声明语法定义:
           function sum(num1,num2){
             return num1 + num2;
           }; 
           函数表达式定义:
           var sum = function(num1,num2){
             return num1 + num2;
           };
           区别:函数声明定义法会声明提前到代码顶部
           var sum = new Function("param1","param2",...,"return num1 + num2");

           可以传入任一个参数,但是最后一个参数,一定是作为函数体(字符串形式),不推荐使用,会解析两次函数,第一次常规

           解析,第二次解析传入构造函数中的字符串

           (1)函数名本身就是包含指针的变量,所以函数也可以作为值来使用 如:按对象某个属性进行排序
           (2)函数内部属性
              arguments:类数组对象,包含所有函数中的参数
                arguments.callee 该属性为一个指针,指向拥有arguments的函数,消除紧密耦合
               
function factorial(num){ if(num <= 1){     return 1;        }else{                return num * arguments.callee(num - 1);        }}factorial(5);//120
              this引用的是函数据以执行的环境对象(在全局作用域中调用函数,this对象引用的是全局对象window)
              caller,该属性保存在调用当前函数的函数的引用,如果在全局作用域中调用当前函数,caller为null            
function outer(){             inner();}; function inner(){              alert(arguments.callee.caller);}outer(); //function(){inner()};
              注:严格模式下,arguments.callee会报错,不能为caller属性赋值
           (3)函数属性和方法
              函数是对象,所以也有方法和属性
              length属性,希望接收的命名参数的个数(内部属性arguments保存的是实际传入的参数,与length不同)
              prototype属性,是真正保存所有引用类型实例方法的真正所在,不可枚举,使用for-in无法发现
              两个非继承而来的方法:
                  apply(),call(),实际上等于设置函数体内this对象的值
                  apply(),接收两个参数,一个是其中运行函数的作用域,一个是参数数组(可以是arguments也可以是Array的实例)

                  call(),与apply接收参数不同,第一个参数也是this,其余的参数直接传递而不是通过数组的形式(必须明确的传入

  第二个以后的参数)

window.color = "red";var o = {color: "blue"};function sayColor(){ console.log(this.color);}sayColor(); //redsayColor.call(this) //red      sayColor.call(window); //redsayColor.call(o);  //blue

                  
function sum(num1,num2){         return num1 + num2;}function callSum(num1,num2){      // return sum.apply(this,arguments);      // return sum.apply(this,[num1,num2]);         return sum.call(this,num1,num2)}callSum(10,20);//30
              bind方法:创建了一个函数的实例,同时this会被绑定到传个bind函数的值                 
window.color = "red";var o = {color: "blue"};function sayColor(){      console.log(this.color);}    var objectSayColor = sayColor.bind(o);objectSayColor(); //blue
                 sayColor调用bind方法并传入对象o,创建了objectSayColor()函数,同时objectSayColor()函数的this值为o,即使全局调用                     objectSayColor(),也返回blue
              注:(1)IE9+支持bind()
                     (2)toLocaleString()和toString()都返回函数的代码(格式因浏览器而异)
                     (3)valueOf(),返回函数代码
      5.4  基本包装类型:Boolean,Number,String
             创建实例根据传入值得类型返回相应基本包装类型的实例               
var strObj = new Object("some text");var numObj = new Object(14);var bolObj = new Object(false);typeof strObj; //"object"strObj instanceof String; //truestrObj instanceof Object; //true  
           (1)Boolean类型             
var bolObj = new Boolean(true);typeof bolObj;//"object"bolObj instanceof Boolean; //true
              重写valueOf()方法,返回true或false,重写toString()方法,返回"true"或"false"
           (2)Number类型             
var numObj = new Number(10);typeof numObj; //"object"numObj instanceof Number; //true
              重写valueOf(),返回对象表示的基本类型的值,重写toString(),toLocaleSting(),返回对象表示的基本类型的值的字符串形式
              注:toString()方法中可以传入参数,返回相应进制的字符串格式 var num = 10; num.toString(2);//1010
              1.toFixed(param)方法会按照指定的小数位(param)返回数值的字符串表示(四舍五入)            
var num = 10;num.toFixed(2);//"10.00"
              2.toExponential()也接收一个参数,指定输出结果中的小数位数(四舍五入)               
var num = 10;var num1 = 0.1;num.toExponential(1);//"1.0e+1"num1.toExponential(1);//"1.0e-1"
              3.toPrecision()方法,根据实际情况返回合适的结果,会根据要处理的数值,决定是调用toFixed()还是toExponential()          
var num = 99;num.toPrecision(1); //"1.0e+2";num.toPrecision(2); //"99"num.toPrecision(3); //"99.0"
           (3)String类型              
var strObj = new String("some text");typeof strObj; //"object"strObj instanceof String; // true       
              继承的valueOf(),toString(),toLocaleString()都返回字符串形式
              length属性,表示字符串中包含多少个字符(即使字符串中存在双字节字符,仍算一个字符)
      1.字符方法
                 charAt()接收一个参数,即基于0的字符位置,返回给定位置的字符(字符没有字符类型)
                 charCodeAt()接收一个参数,即基于0的字符位置,返回给定位置的字符编码                  
 var stringValue = "hello world"; console.log(stringValue.charAt(1));//e console.log(stringValue.charCodeAt(1)); //101
                  注:不传参,默认第一个位置处
              2.字符串操作方法
                拼接
                concat(),相比之下"+"拼接更常用
                截取
                slice()substr()substring(),都返回子字符串,可传一到两个参数,第一个参数指定子字符串开始的位置,slice与substring
                的第二个参数值指子字符串结束的位置(含头不含尾);substr的第二个参数指截取子字符串的个数,不改变原字符串
                如果参数中存在负值,slice会将传入的赋值与length相加,按返回的值去截取;substr将负的第一个参数与length相加,
                将负的第二个参数转换为0;substring()会将负的参数全部转换为0                
var stringValue = "hello world";console.log(stringValue.slice(-3));     //"rld"console.log(stringValue.substr(-3));    //"rld"console.log(stringValue.substring(-3)); //"hello world"console.log(stringValue.slice(3,-4));   //"lo w"console.log(stringValue.substr(3,-4));  //""console.log(stringValue.substring(3,-4));//"hel"
                注:substring(3,-4)相当于substring(3,0),相当于substring(0,3)
              3.字符串位置方法
                indexOf()和lastIndexOf(),都是从一个字符串中搜索给定字符串,返回子字符串的位置,没找到返回-1。
                indexOf()从头找,laseIndex(),从末尾开始找 ,可接收两个参数,第一个为要查找的字符串,第二个为查找的起始位                        置,未设置第二个参数,indexOf()会从头找,lastIndexOf()会从尾开始找 
              4.trim()方法
                创建一个字符串的副本,删除前置和后缀的所有空格,返回结果,IE9+支持; 
                trimLeft()删除字符串开头空格,trimRight()删除字符串末尾空格                
var stringValue = "    hello world   "; var newString = stringValue.trim();console.log(newString); //"hello world"console.log(stringValue);//"    hello world   "
              5.字符串大小写转换法
                toLowerCase()和toUpperCase()小写和大写
                toLocaleLower()和toUpperCase()针对特定地区的实现
              6.字符串的模式匹配法

                match(),与exec类似,参数为正则表达式或RegExp对象,返回数组的第一项时与整个模式匹配的字符串,之后的每

                一项保存着与正则捕获组匹配的字符串                  

var text = "cat, bat, sat, fat";var pattern = /.at/;var matches = text.match(pattern); console.log(matches.index); //0console.log(match[0]);//"cat"console.log(pattern.lastIndex); //0
                search(),参数为正则表达式或RegExp对象,返回字符串中第一个匹配项的索引,没有返回-1;始终是从头向后查                
var text = "mom and dad and baby";text.search(/a/); //4text.search(/a/); //4

                replace(),接收两个参数,第一个可以为RegExp对象或字符串,第二个参数可以是一个字符串也可以是一个函数。

                不更改原字符串

                如果第一个参数为字符串,那只能替换第一个字符串,替换所有子字符串就需要传正则表达式,指定g
                  $&: 匹配整个字符串模式的子字符串
                  $': 匹配的子字符串之前的子字符串
                  $`: 匹配的子字符之后的子字符串
                  $n: 匹配第n个捕获组的子字符串
                  var text = "cat, bat, sat, fat";
                  text.replace("at","ond"); // "cond, bat, sat, fat"
                  text.replace(/at/g,"ond"); //"cond, bond, sond, fond"
                  text.replace(/(.at)/g,"word($1)")//"word(cat), word(bat), word(sat), word(fat)"

                  如果第二个参数为函数时,回想函数传递3个参数:模式的匹配项(匹配的字符串),第一个捕获组的匹配项,第二个

                  捕获组的匹配项(没有捕获组就直接不提供捕获组的匹配项)最后两个参数分别为匹配项在字符串中的位置,和原始

                  字符串函数返回一个字符串

阅读全文
0 0