本期主题:正则表达式 call(),apply(),callee,caller,cookie方法,setInterval(),clearInterval(),setTimeout() ,clearTimeout()
详细看附件例子,还是写的比较简单的。
1.关于cookie的函数:
- /** ?
- ?*?cookie操作工具. ?
- ?*?使用方法:保存值:CookieTool('name','1',{expires:?7})??//表示保存一个cookie值为1,键值为name,失效时间7天以后 ?
- ?*?????????取值:CookieTool('name')????????????????????//返回1 ?
- ?*?@param?{}?name ?
- ?*?@param?{}?value ?
- ?*?@param?{}?options ?
- ?*?@return?{} ?
- ?*/ ??
- CookieTool?=?function (name,?value,?options)?{??
- ??????????if ?( typeof ?value?!=? 'undefined' )?{??
- ????????????????????options?=?options?||?{};??
- ????????????????????if ?(value?===? null )?{??
- ??????????????????????????????value?=?'' ;???
- ??????????????????????????????options.expires?=?-1;??
- ????????????????????}??
- ????????????????????var ?expires?=? '' ;??
- ????????????????????if ?(options.expires?&&?( typeof ?options.expires?==? 'number' ?||?options.expires.toUTCString))?{??
- ??????????????????????????????var ?date;??
- ??????????????????????????????if ?( typeof ?options.expires?==? 'number' )?{??
- ????????????????????????????????????????date?=?new ?Date();??
- ????????????????????????????????????????date.setTime(date.getTime()?+?(options.expires?*?24?*?60?*?60?*?1000));??
- ??????????????????????????????}?else ?{??
- ????????????????????????????????????????date?=?options.expires;??
- ??????????????????????????????}??
- ??????????????????????????????expires?=?';?expires=' ?+?date.toUTCString();??
- ????????????????????}??
- ????????????????????var ?path?=?options.path??? ';?path=' ?+?(options.path)?:? '' ;??
- ????????????????????var ?domain?=?options.domain??? ';?domain=' ?+?(options.domain)?:? '' ;??
- ????????????????????var ?secure?=?options.secure??? ';?secure' ?:? '' ;??
- ????????????????????document.cookie?=?[name,?'=' ,?encodeURIComponent(value),?expires,?path,?domain,?secure].join( '' );??
- ??????????}?else ?{??
- ????????????????????var ?cookieValue?=? null ;??
- ????????????????????if ?(document.cookie?&&?document.cookie?!=? '' )?{??
- ??????????????????????????????var ?cookies?=?document.cookie.split( ';' );??
- ??????????????????????????????for ?( var ?i?=?0;?i?<?cookies.length;?i++)?{??
- ????????????????????????????????????????var ?cookie?=?trim(cookies[i]);??
- ????????????????????????????????????????if ?(cookie.substring(0,?name.length?+?1)?==?(name?+? '=' ))?{??
- ??????????????????????????????????????????????????cookieValue?=?decodeURIComponent(cookie.substring(name.length?+?1));??
- ??????????????????????????????????????????????????break ;??
- ????????????????????????????????????????}??
- ??????????????????????????????}??
- ????????????????????}??
- ????????????????????return ?cookieValue;??
- ??????????}??
- };??
2.关于一个可以查看js对象的js函数,很酷的方法:
- /** ?
- ?*?用来查看一个对象的属性 ?
- ?*/ ??
- function ?debugObjectInfo(obj){??
- ????????traceObject(obj);??
- ??????????
- ????????function ?traceObject(obj){???
- ????????????????var ?str?=? '' ;??
- ????????????????if (obj.tagName&&obj.name&&obj.id)??
- ????????????????str="<table?border='1'?width='100%'><tr><td?colspan='2'?bgcolor='#ffff99'>traceObject? tag:?<" +obj.tagName+ "> ?name?=?\"" +obj.name+ "\"? id?=?\"" +obj.id+ "\"?</td></tr>" ;???
- ????????????????else {??
- ????????????????????????str="<table?border='1'?width='100%'>" ;???
- ????????????????}??
- ????????????????var ?key=[];???
- ????????????????for ( var ?i? in ?obj){???
- ????????????????????????key.push(i);???
- ????????????????}???
- ????????????????key.sort();???
- ????????????????for ( var ?i=0;i<key.length;i++){???
- ????????????????????????var ?v=? new ?String(obj[key[i]]).replace(/</g, "<" ).replace(/>/g, ">" );???
- ????????????????????????str+="<tr><td?valign='top'>" +key[i]+ "</td><td>" +v+ "</td></tr>" ;???
- ????????????????}???
- ????????????????str=str+"</table>" ;???
- ????????????????writeMsg(str);???
- ????????}???
- ????????function ?trace(v){???
- ????????????????var ?str= "<table?border='1'?width='100%'><tr><td?bgcolor='#ffff99'>" ;???
- ????????????????str+=String(v).replace(/</g,"<" ).replace(/>/g, ">" );???
- ????????????????str+="</td></tr></table>" ;???
- ????????????????writeMsg(str);???
- ????????}???
- ????????function ?writeMsg(s){???
- ????????????????traceWin=window.open("" , "traceWindow" , "height=600,?width=800,scrollbars=yes" );???
- ????????????????traceWin.document.write(s);???
- ????????}???
- }??
3.正则表达式:
g 代表全局匹配
m 代表可以进行多行匹配
i 代表不区分大小写匹配
^ 匹配输入字符串的开始位置
$ 匹配输入字符串的结束位置
* 匹配前面的子表达式零次或多次. 等价于{0,}
+ 匹配前面的子表达式一次或多次. 等价于{1,}
? 匹配前面的子表达式零次或一次. 等价于[0,1} , 当该字符跟在任何一个其他限制符(*, +, ?, {n}, {n,},
{n,m})
后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串
"oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。
\d 匹配一个数字字符. 等价于 [0-9]
\D 匹配一个非数字符. 等价于 [^0-9]
\w? ,等价于 "[A-Za-z0-9_]"
\W 匹配任何非单词字符,等价于 "[^A-Za-z0-9]"
\s 匹配任何空白字符, 包括空格 制表符 换页符 等等. 等价于[\f\n\r\t\v]
\S 匹配任何非空白字符. 等价于 [^\f\r\n\t\v]
\b 匹配一个单词边界,也就是指单词和空格间的位置。
\B 匹配非单词边界。
正则表达式常用js方法:
- /** ?
- ?*?在源字符串中查找满足要求的子串.? ?
- ?*?@return?{} ?
- ?*/ ??
- function ?MatchDemo()?{??
- ????var ?r,?re;? //?声明变量。??? ??
- ????var ?s?=? "The?rain?in?Spain?falls?mainly?in?the?plain" ;??
- ????re?=?new ?RegExp( "ain" ,? "g" );? //?创建正则表达式对象。??? ??
- ????r?=?s.match(re);?//?在字符串?s?中查找匹配。??? ??
- ????return ?(r);??
- }??
- ??
- /** ?
- ?*?返回在源字符串中的满足正则表达式的全部的字串和位置信息.? ?
- ?*/ ??
- function ?RegExpTest()?{??
- ????var ?ver?=?Number(ScriptEngineMajorVersion()?+? "." ??
- ????????????+?ScriptEngineMinorVersion())??
- ????var ?ans?=? '' ;??
- ????if ?(ver?>=?5.5)?{? //?测试?JScript?的版本。??? ??
- ????????var ?src?=? "The?rain?in?Spain?falls?mainly?in?the?plain." ;??
- ????????var ?re?=?/\w+/g;? //?创建正则表达式模式。??? ??
- ????????var ?arr;??
- ????????while ?((arr?=?re.exec(src))?!=? null )??
- ????????????ans?+=?arr.index?+?"-" ?+?arr.lastIndex?+?arr?+? "\t" ;??
- ????}?else ?{??
- ????????ans?=?"请使用?JScript?的更新版本" ;??
- ????}??
- ????return ?ans;??
- }??
- ??
- /** ?
- ?*?对源字符串进行正则表达式检查,看是不是符合正则表达式.?? ?
- ?*/ ??
- function ?TestDemo()?{??
- ????var ?s1;??
- ????var ?source?=? "abcdefg" ;??
- ????var ?regex?=?/\w+/g;? //?创建正则表达式模式。?? ??
- ????if ?(regex.test(source))??
- ????????s1?=?"?contains?" ;??
- ????else ??
- ????????s1?=?"?does?not?contain?" ;??
- ????return ?( "'" ?+?source?+? "'" ?+?s1?+? "'" ?+?regex.source?+? "'" );??
- }??
- ??
- /** ?
- ?*?在源字符串中查找正则表达式的字串.? ?
- ?*?@return?{} ?
- ?*/ ??
- function ?SearchDemo()?{??
- ????var ?r,?re;??
- ????var ?s?=? "The?rain?in?Spain?falls?mainly?in?the?plain." ;??
- ????re?=?/falls/i;??
- ????r?=?s.search(re);??
- ????return ?(r);??
- }??
4.很值得学习并要使用好的方法,call():
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
参数
thisObj
可选项。将被用作当前对象的对象。
arg1, arg2, , argN
可选项。将被传递方法参数序列。
说明
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
简单的例子:
- function ?add(a,b)??
- {??
- ????alert(a+b);??
- }??
- function ?sub(a,b)??
- {??
- ????alert(a-b);??
- }??
- ??
- add.call(sub,3,1);???
- //这个例子中的意思就是用?add?来替换?sub,add.call(sub,3,1)?==?add(3,1)?,所以运行结果为:alert(4); ??
稍微复杂的例子:
- function ?Class1()??
- {??
- ????this .name?=? "class1" ;??
- ??
- ????this .showNam?=? function ()??
- ????{??
- ????????alert(this .name);??
- ????}??
- }??
- ??
- function ?Class2()??
- {??
- ????this .name?=? "class2" ;??
- }??
- ??
- var ?c1?=? new ?Class1();??
- var ?c2?=? new ?Class2();??
- ??
- c1.showNam.call(c2);??
- //call?的意思是把?c1?的方法放到c2上执行,原来c2是没有showNam()?方法,现在是把c1?的showNam()方法放到?c2?上来执行,所以this.name?应该是?class2,执行的结果就是?:alert("class2"); ??
多重继承的例子:
- function ?Class10()??
- {??
- ????this .showSub?=? function (a,b)??
- ????{??
- ????????alert(a-b);??
- ????}??
- }??
- ??
- function ?Class11()??
- {??
- ????this .showAdd?=? function (a,b)??
- ????{??
- ????????alert(a+b);??
- ????}??
- }??
- ??
- ??
- function ?Class2()??
- {??
- ????Class10.call(this );??
- ????Class11.call(this );??
- }??
5.apply函数:
Function.apply(obj,args)方法能接收两个参数
??? obj:这个对象将代替Function类里this对象
??? args:这个是数组,它将作为参数传给Function(args-->arguments)
实现类似call的继承的效果:
- function ?Person(name,age){??? //定义一个类,人类?? ??
- ????this .name=name;????? //名字?? ??
- ????this .age=age;??????? //年龄? ??
- ????this .sayhello= function (){alert( "hello" )};??
- }???
- function ?Print(){???????????? //显示类的属性? ??
- ????this .funcName= "Print" ;???
- ????this .show= function (){????????
- ????????var ?msg=[];??
- ????????for ( var ?key? in ? this ){???
- ????????????if ( typeof ( this [key])!= "function" ){??
- ????????????????msg.push([key,":" , this [key]].join( "" ));??
- ????????????}??
- ????????}???
- ????????alert(msg.join("?" ));??
- ????};??
- }???
- function ?Student(name,age,grade,school){???? //学生类? ??
- ????Person.apply(this ,arguments);??
- ????Print.apply(this ,arguments);??
- ????this .grade=grade;???????????????? //年级? ??
- ????this .school=school;????????????????? //学校? ??
- }???
- var ?p1= new ?Person( "jake" ,10);??
- p1.sayhello();??
- var ?s1= new ?Student( "tom" ,13,6, "清华小学" );??
- s1.show();??
- s1.sayhello();??
- alert(s1.funcName);??
使用apply进行数组参数的函数的优化,很酷的方法:
- Math.max后面可以接任意个参数,最后返回所有参数中的最大值。??
- ??
- 比如???
- alert(Math.max(5,8))???//8 ??
- alert(Math.max(5,7,9,3,1,6))???//9 ??
- ??
- 但是在很多情况下,我们需要找出数组中最大的元素。??
- var ?arr=[5,7,9,1]??
- alert(Math.max(arr))????//?这样却是不行的。一定要这样写 ??
- ??
- function ?getMax(arr){??
- ????var ?arrLen=arr.length;??
- ????for ( var ?i=0,ret=arr[0];i<arrLen;i++){??
- ????????ret=Math.max(ret,arr[i]);?????????
- ????}??
- ????return ?ret;??
- }??
- ??
- 用?apply呢,看代码:??
- function ?getMax2(arr){??
- ????return ?Math.max.apply( null ,arr);??
- }??
下面是另外一个例子,用来合并两个数组:
- 再比如数组的push方法。??
- var ?arr1=[1,3,4];??
- var ?arr2=[3,4,5];??
- 如果我们要把?arr2展开,然后一个一个追加到arr1中去,最后让arr1=[1,3,4,3,4,5]??
- arr1.push(arr2)显然是不行的。?因为这样做会得到[1,3,4,[3,4,5]]??
- ??
- 我们只能用一个循环去一个一个的push(当然也可以用arr1.concat(arr2),但是concat方法并不改变arr1本身)??
- var ?arrLen=arr2.length??
- for ( var ?i=0;i<arrLen;i++){??
- ????arr1.push(arr2[i]);??
- }??
使用apply的话:
-
Array.prototype.push.apply(arr1,arr2)?