JavaScript应用技巧集合.doc_第1页
JavaScript应用技巧集合.doc_第2页
JavaScript应用技巧集合.doc_第3页
JavaScript应用技巧集合.doc_第4页
JavaScript应用技巧集合.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JavaScript应用技巧集合(转载) 前段时间我曾经对JavaScript中的应用技巧进行了收集和总结,形成了以下几篇文章: JavaScript tips and tricks - 1 JavaScript tips and tricks - 2 JavaScript tips and tricks - 3 JavaScript tips and tricks - 4 JavaScript tips and tricks - 5 这里我将会对这些应用技巧进行集中描述,如果你觉得遗漏了一些好用的应用技巧,也请在留言中提出,我会及时更新到这篇文章中的。 转化为Boolean类型所有JavaScript中的值都能隐式的转化为Boolean类型,比如: view source print?10 = false; / true21 = true; / true3 = false / true4null = false / true但是这些值都不是Boolean类型。因此当我们使用三个等于号进行比较时: view source print?10 = false; / false21 = true; / false3 = false / false4null = false / false现在的问题是如何将其他类型转化为Boolean类型: view source print?1!0 = false; / true2!1 = true; / true3! = false / true4!null = false / true 为参数赋初值JavaScript中没有重载的概念,但是JavaScript中函数的参数都是可选的,如果调用时少写了一个参数,将会被undefined所代替。 view source print?1function plus(base, added) 2return base + added;34plus(2); / NaN在这个例子中,plus(2)和plus(2, undefined)是等价的,2 + undefined的结果是NaN。 现在的问题是,如果没有传递第二个参数,如何为它赋初值呢? view source print?1function plus(base, added) 2added = added | 1;3return base + added;45plus(2); / 36plus(2, 2); / 4有网友提到 plus(2, 0) = 3; 的确是这样的,看来这个地方还要做一些特殊处理: view source print?1function plus(base, added) 2added = added | (added = 0 ? 0 : 1);3return base + added;4 阻止别人在Iframe中加载你的页面如果你的网站变得非常有人气的时候,就有很多网站想链接到你的网站,甚至想把你的网页通过IFrame嵌入它自己的网页。 这样就不好玩了,那么如何来阻止这样行为呢? view source print?1if(top != window) 2top.location.href = window.location.href;3这段代码应该放在你每个页面的head中,如果你想知道现实中有没人在用,看看baidu的博客你就知道了。 字符串替换Stotype.replace函数经常会让那些非常熟悉C#或者Java的程序员感到迷惑。 比如: view source print?1Hello world, hello world.replace(world, JavaScript);2/ The result is Hello JavaScript, hello worldreplace函数的第一个参数是正则表达式。如果你传递一个字符串到第一个参数,则只有第一个找到的匹配字符串被替换。 为了解决这个问题,我们可以使用正则表达式: view source print?1Hello world, hello world.replace(/world/g, JavaScript);2/ The result is Hello JavaScript, hello JavaScript我们还可以指定在替换时忽略大小写: view source print?1Hello world, hello world.replace(/hello/gi, Hi);2/ The result is Hi world, Hi world 将arguments转化为数组函数中的预定义变量arguments并非一个真正的数组,而是一个类似数组的对象。 它具有length属性,但是没有slice, push, sort等函数,那么如何使arguments具有这些数组才有的函数呢? 也就是说如何使arguments变成一个真正的数组呢? view source print?1function args() 2return .slice.call(arguments, 0);34args(2, 5, 8); / 2, 5, 8 为parseInt函数指定第二个参数parseInt用来将字符串转化为整形的数字,语法为: view source print?1parseInt(str, radix)其中第二个参数是可选的,用来指定第一个参数是几进制的。 如果没有传递第二个参数,则按照如下规则:-如果str以 0x 开头,则认为是16进制。-如果str以 0 开头,则认为是8进制。-否则,认为是10进制。因此如下的代码将会让人很迷惑,如果你不知道这些规则: view source print?1parseInt(08); / 02parseInt(08, 10); / 8所以,安全起见一定要为parseInt指定第二个参数。 从数组中删除一个元素 或许我们可以通过delete来做到: view source print?1var arr = 1, 2, 3, 4, 5;2delete arr1;3arr; / 1, undefined, 3, 4, 5可以看到,delete并不能真正的删除数组中的一个元素。删除的元素会被undefined取代,数组的长度并没有变化。 事实上,我们可以通过Atotype中的splice函数来删除数组中的元素,如下所示: view source print?1var arr = 1, 2, 3, 4, 5;2arr.splice(1, 1);3arr; / 1, 3, 4, 5 函数也是对象在JavaScript中函数也是对象,因为我们可以为函数添加属性。 比如: view source print?1function add() 2return add.count+;34add.count = 0;5add(); / 06add(); / 17add(); / 2我们为函数add添加了count属性,用来记录此函数被调用的次数。 当然这可以通过更优雅的方式来实现: view source print?1function add() 2if(!arguments.callee.count) 3arguments.callee.count = 0;45return arguments.callee.count+;67add(); / 08add(); / 19add(); / 2arguments.callee指向当前正在运行的函数。 数组中的最大值如何在全是数字的数组中找到最大值,我们可以简单的通过循环来完成: view source print?1var arr = 2, 3, 45, 12, 8;2var max = arr0;3for(var i in arr) 4if(arri max) 5max = arri;678max; / 45有没有其他方法?我们都知道JavaScript中有一个Math对象进行数字的处理: view source print?1Math.max(2, 3, 45, 12, 8); / 45然后,我们可以这样来找到数组中最大值: view source print?1var arr = 2, 3, 45, 12, 8;2Math.max.apply(null, arr); / 45 为IE添加console.log函数 在Firefox下并有Firebug的支持下,我们经常使用console.log来在控制台记录一些信息。 但是这种做法在IE下会阻止JavaScript的执行(在Firefox下没有启用Firebug情况下也是一样),因为此时根本没有console对象存在。 我们可以通过如下小技巧来防止这样情况的发生: view source print?1if (typeof(console) = undefined) 2window.console = 3log: function(msg) 4alert(msg);56;78console.log(debug info.); undefined是JavaScript中保留关键字么?看起来像是的,但实际上undefined并不是JavaScript中的关键字: view source print?1var undefined = Hello; 2undefined; / Hello这段代码可能会让你感到很奇怪,不过它的确能够正常运行,undefined只是JavaScript中一个预定义的变量而已。 注:在JavaScript程序中,千万不要这样做,这个技巧只是告诉你有这么一回事而已。 判断一个变量是否为undefined两种情况下,一个变量为undefined: 1. 声明了变量,但是没有赋值 view source print?1var name; 2name = undefined; / true2. 从来没有声明过此变量 view source print?1name2 = undefined; / error name2 is not defined在第二种情况下,会有一个错误被抛出,那么如果判断一个变量是否为undefined而不产生错误呢? 下面提供了一种通用的方法: view source print?1typeof(name2) = undefined; / true 预加载图片 预加载图片就是加载页面上不存在的图片,以便以后使用JavaScript把它们快速显示出来。 比如你想在鼠标移动到某个图片上时显示另一张图片: view source print?1var img = new Image(); 2img.src = clock2.gif;view source print?1那么,如何加载一组图片呢?考虑如下代码: view source print?1var source = img1.gif,img2.gif; 2var img = new Image(); 3for(var i = 0; i source.length; i+) 4img.src = sourcei; 5实际上,这段代码只能预加载最后的一张图片,因为其他的图片根本没有时间来预加载在循环到来的时候。 因此正确的写法应该是: view source print?1var source = img1.gif,img2.gif; 2for(var i = 0; i source.length; i+) 3var img = new Image(); 4img.src = sourcei; 5 闭包(closure) 闭包指的是函数内的局部变量,当函数返回时此变量依然可用。 当你在函数内部定义另外一个函数时,你就创建了一个闭包,一个著名的例子: view source print?1function add(i) 2return function() 3return +i; 4; 5 6add(2).toString(); / function () return +i; 7add(2)(); / 3add(2)是一个函数,它可能获取外部函数的局部变量i。 参考文章 私有变量我们经常使用命名规范来标示一个变量是否为私有变量(最常用来标示): view source print?1var person = 2_name: , 3getName: function() 4return this._name | not defined; 5 6; 7person.getName(); / not defined下划线前缀用来作为私有变量的约定,但是其他开发人员仍然可以调用此私有变量: view source print?1person._name; / 那么,如何在JavaScript中创建一个真正的私有变量呢? 主要技巧是使用匿名函数(anonymous function)和闭包(closure)。 view source print?01var person = ; 02(function() 03var _name = ; 04person.getName = function() 05return _name | not defined; 06 07)(); 0809person.getName(); / not defined 10typeof(person._name); / undefined JavaScript没有块级上下文(Scope)JavaScript中块级代码没有上下文,实际上只有函数有自己的上下文。 view source print?1for(var i = 0; i 2; i +) 23 4i; / 2如果想创建一个上下文,可以使用自执行的匿名函数: view source print?1(function () 2for(var i = 0; i 2; i +) 345)(); 6typeof(i) = undefined; / true 怪异的NaNNaN用来表示一个值不是数字。NaN在JavaScript中行为很怪异,是因为那NaN和任何值都不相等(包括它自己)。 view source print?1NaN = NaN; / false因为下面的代码可能会让一些人抓狂: view source print?1parseInt(hello, 10); / NaN 2parseInt(hello, 10) = NaN; / false 3parseInt(hello, 10) = NaN; / false那么如何来检查一个值是否NaN?可以使用window.isNaN来判断: view source print?1isNaN(parseInt(hello, 10); / true 真值和假值JavaScript中所有值都能隐式地转化为Boolean类型。在条件判断中,下面这些值会自动转化为false:null, undefined, NaN, 0, , false因此,不需要做如下复杂的判断: view source print?1if(obj = undefined | obj = null) 2而只需要这样做就行了: view source print?1if(!obj) 23 修改arguments比如,添加一个值到arguments中: view source print?1function add() 2arguments.push(new value); 3 4add(); / error - arguments.push is not a function这样会出错,因为arguments不是一个真正的数组,没有push方法。 解决办法: view source print?1function add() 2Atotype.push.call(arguments, new value); 3return arguments; 4 5add()0; / new value Boolean 和 new Boolean我们可以把Boolean看做是一个函数,用来产生Boolean类型的值(Literal): view source print?1Boolean(false) = false; / true 2Boolean() = false; / true所以,Boolean(0)和!0是等价的。 我们也可以把Boolean看做是一个构造函数,通过new来创建一个Boolean类型的对象: view source print?1new Boolean(false) = false; / false 2new Boolean(false) = false; / true 3typeof(new Boolean(false); / object 4typeof(Boolean(false); / boolean 快速字符串连接我们经常使用+将较短的字符串连接为一个长字符串,这在大部分的情况下是没问题的。 但是如果有大量的字符串需要连接,这种做法将会遇到性能问题,尤其是在IE下。 view source print?1var startTime = new Date();2var str = ;3for (var i = 0; i 50000; i+) 4str += i;56alert(new Date() - startTime); / Firefox - 18ms, IE7 - 2060msview source print?1var startTime = new Date();2var arr = ;3for (var i = 0; i 100000; i+) 4arr.push(i);56var str = arr.join();7alert(new Date() - startTime); / Firefox - 38ms, IE7 - 280ms可以看到Firefox似乎对+操作符进行了优化,而IE则表现的傻乎乎的。 一元操作符 + 在JavaScript中,我们可以在字符串之前使用一元操作符“+”。这将会把字符串转化为数字,如果转化失败则返回NaN。 view source print?12 + 1; / 2122 + ( +1); / 3如果把 + 用在非字符串的前面,将按照如下顺序进行尝试转化: 调用valueOf() 调用toString() 转化为数字 view source print?1+new Date; / 12426164520162+new Date = new Date().getTime(); / true3+new Date() = Number(new Date) / true参考文章 encodeURI和encodeURIComponentwindow.encodeURI函数用来编码一个URL,但是不会对以下字符进行编码:“:”, “/”, “;”, “?”. window.encodeURIComponent则会对上述字符进行编码。我们通过一个例子来说明: view source print?1index.jsp?page=+encodeURI(/p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论