<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Artwl</title><subtitle type="text">天行健  君子以自强不息地势坤  君子以厚德载物</subtitle><id>http://feed.cnblogs.com/blog/u/66217/rss</id><updated>2012-05-17T07:05:37Z</updated><author><name>artwl</name><uri>http://www.cnblogs.com/artwl/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/artwl/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/66217/rss"/><entry><id>http://www.cnblogs.com/artwl/archive/2012/05/04/2482528.html</id><title type="text">[转]Javascript 绝句</title><summary type="text">像诗一样的 Javascript 代码。1. 取整同时转成数值型：'10.567890'|0//结果: 10'10.567890'^0//结果: 10-2.23456789|0//结果: -2~~-2.23456789//结果: -22. 日期转数值：var d = +new Date(); //12956984167923. 类数组对象转数组：var arr = [].slice.call(arguments)4. 漂亮的随机码：Math.random().toString(16).substring(2); //14位Math.random().toStri</summary><published>2012-05-04T04:40:00Z</published><updated>2012-05-04T04:40:00Z</updated><author><name>artwl</name><uri>http://www.cnblogs.com/artwl/</uri></author><link rel="alternate" href="http://www.cnblogs.com/artwl/archive/2012/05/04/2482528.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/artwl/archive/2012/05/04/2482528.html"/><content type="html">&lt;p&gt;像诗一样的 Javascript 代码。&lt;/p&gt;&lt;p&gt;1. 取整同时转成数值型：&lt;/p&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;'10.567890'|0&lt;br/&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;结果: 10&lt;/span&gt;&lt;br/&gt;'10.567890'^0&lt;br/&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;结果: 10&lt;/span&gt;&lt;br/&gt;-2.23456789|0&lt;br/&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;结果: -2&lt;/span&gt;&lt;br/&gt;~~-2.23456789&lt;br/&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;结果: -2&lt;/span&gt;&lt;/div&gt;&lt;p&gt;2. 日期转数值：&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; d = +&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Date(); &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;1295698416792&lt;/span&gt;&lt;/div&gt;&lt;p&gt;3. 类数组对象转数组：&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; arr = [].slice.call(arguments)&lt;/div&gt;&lt;p&gt;4. 漂亮的随机码：&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Math.random().toString(16).substring(2); &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;14位&lt;/span&gt;&lt;br/&gt;Math.random().toString(36).substring(2); &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;11位&lt;/span&gt;&lt;/div&gt;&lt;p&gt;5. 合并数组：&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; a = [1,2,3&lt;span style="color: #000000;"&gt;];&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; b = [4,5,6&lt;span style="color: #000000;"&gt;];&lt;br/&gt;Array.prototype.push.apply(a, b);&lt;br/&gt;uneval(a); &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;[1,2,3,4,5,6]&lt;/span&gt;&lt;/div&gt;&lt;p&gt;6. 用0补全位数：&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; prefixInteger(num, length) {&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (num / Math.pow(10, length)).toFixed(length).substr(2&lt;span style="color: #000000;"&gt;);&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;7. 交换值：&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;a= [b, b=a][0];&lt;/div&gt;&lt;p&gt;8. 将一个数组插入另一个数组的指定位置：&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; a = [1,2,3,7,8,9&lt;span style="color: #000000;"&gt;];&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; b = [4,5,6&lt;span style="color: #000000;"&gt;];&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; insertIndex = 3&lt;span style="color: #000000;"&gt;;&lt;br/&gt;a.splice.apply(a, Array.concat(insertIndex, &lt;/span&gt;0&lt;span style="color: #000000;"&gt;, b));&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; a: 1,2,3,4,5,6,7,8,9&lt;/span&gt;&lt;/div&gt;&lt;p&gt;9. 删除数组元素：&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; a = [1,2,3,4,5&lt;span style="color: #000000;"&gt;];&lt;br/&gt;a.splice(&lt;/span&gt;3,1);&lt;/div&gt;&lt;p&gt;10. 快速取数组最大和最小值&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Math.max.apply(Math, [1,2,3]) &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;3&lt;/span&gt;&lt;br/&gt;Math.min.apply(Math, [1,2,3]) &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;1&lt;/span&gt;&lt;/div&gt;&lt;p&gt;(出自http://ejohn.org/blog/fast-javascript-maxmin/)&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;11. 条件判断：&lt;/p&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; a = b &amp;amp;&amp;amp; 1&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;相当于&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (b) {&lt;br/&gt;    a &lt;/span&gt;= 1&lt;span style="color: #000000;"&gt;;&lt;br/&gt;} &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;br/&gt;    a &lt;/span&gt;=&lt;span style="color: #000000;"&gt; b;&lt;br/&gt;}&lt;br/&gt; &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; a = b || 1&lt;span style="color: #000000;"&gt;; &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;相当于&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (b) {&lt;br/&gt;    a &lt;/span&gt;=&lt;span style="color: #000000;"&gt; b;&lt;br/&gt;} &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;br/&gt;    a &lt;/span&gt;= 1&lt;span style="color: #000000;"&gt;;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;12. 判断IE（两种方法）:&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; ie = &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;@cc_on !@&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; ie = !-[1,];&lt;/div&gt;&lt;p&gt;原文地址：&lt;a href="http://www.benben.cc/blog/?p=391"&gt;http://www.benben.cc/blog/?p=391&lt;/a&gt;&lt;a href="http://site.douban.com/widget/notes/22456/note/142716442/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/artwl/aggbug/2482528.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/artwl/archive/2012/05/04/2482528.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/artwl/archive/2012/05/04/2482473.html</id><title type="text">[转]Javascript 中 String.replace( ) 的妙用</title><summary type="text">String.replace( ) 简介语法：string.replace(regexp, replacement)regexp：您要执行替换操作的正则表达式，如果传入的是一个字符串，那就会当作普通字符来处理，并且只会执行一次替换操作；如果是正则表达式，并且带有 global (g) 修饰符，则会替换所有出现的目标字符，否则，将只执行一次替换操作。replacement：您要替换成的字符。返回值是执行替换操作后的字符串。String.replace( ) 的简单用法var text = "javascript 非常强大 ！";text.replace(/javascript</summary><published>2012-05-04T03:51:00Z</published><updated>2012-05-04T03:51:00Z</updated><author><name>artwl</name><uri>http://www.cnblogs.com/artwl/</uri></author><link rel="alternate" href="http://www.cnblogs.com/artwl/archive/2012/05/04/2482473.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/artwl/archive/2012/05/04/2482473.html"/><content type="html">&lt;p&gt;&lt;strong&gt;String.replace( ) 简介&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;语法：&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;string.replace(regexp, replacement)&lt;/div&gt;&lt;p&gt;regexp&amp;nbsp;：您要执行替换操作的正则表达式，如果传入的是一个字符串，那就会当作普通字符来处理，并且只会执行一次替换操作；如果是正则表达式，并且带有 global (g) 修饰符，则会替换所有出现的目标字符，否则，将只执行一次替换操作。&lt;/p&gt;&lt;p&gt;&lt;span&gt;replacement&lt;/span&gt;&amp;nbsp;：您要替换成的字符。&lt;/p&gt;&lt;p&gt;返回值是执行替换操作后的字符串。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;String.replace( ) 的简单用法&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; text = "javascript 非常强大 ！"&lt;span style="color: #000000;"&gt;;&lt;br/&gt;text.replace(&lt;/span&gt;/javascript/i, "JavaScript"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 返回：JavaScript 非常强大 ！&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;String.replace( ) 替换所有出现的目标字符&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; text= "javascript 非常强大 ！JAVASCRIPT 是我最喜欢的一门语言 ！"&lt;span style="color: #000000;"&gt;;&lt;br/&gt;text.replace(&lt;/span&gt;/javascript/ig, "JavaScript"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 返回：JavaScript 非常强大 ！JavaScript 是我最喜欢的一门语言 ！&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;String.replace( ) 实现调换位置&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; name= "Doe, John"&lt;span style="color: #000000;"&gt;;&lt;br/&gt;name.replace(&lt;/span&gt;/(\w+)\s*,\s*(\w+)/, "$2 $1"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 返回：John Doe&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;String.replace( ) 实现将所有双引号包含的字符替换成中括号包含的字符&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; text = '"JavaScript" 非常强大！'&lt;span style="color: #000000;"&gt;;&lt;br/&gt;text.replace(&lt;/span&gt;/"([^"]*)"/g, "[$1]"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 返回：[JavaScript] 非常强大！&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;String.replace( ) 将所有字符首字母大写&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; text = 'a journey of a thousand miles begins with single step.'&lt;span style="color: #000000;"&gt;;&lt;br/&gt;text.replace(&lt;/span&gt;/\b\w+\b/g, &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(word) {&lt;br/&gt;                           &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; word.substring(0,1).toUpperCase( ) +&lt;span style="color: #000000;"&gt;&lt;br/&gt;                                  word.substring(&lt;/span&gt;1&lt;span style="color: #000000;"&gt;);&lt;br/&gt;                         });&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 返回：A Journey Of A Thousand Miles Begins With Single Step.&lt;/span&gt;&lt;/div&gt;&lt;p&gt;以上转自：&lt;a href="http://www.codebit.cn/javascript/javascript-replace.html"&gt;http://www.codebit.cn/javascript/javascript-replace.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;String.replace() 参数解释&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当第一个参数为正则表达式时，第二个参数为一个function时，第二个参数中的function的参数中 $表示正则匹配的字符串，$1,$2...为分组的内容：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;"abc {name} test".replace(/{(.*?)}/img,&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;($,$1&lt;span style="color: #000000;"&gt;){&lt;br/&gt;    console.log($,$&lt;/span&gt;1);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;output {name} name&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; $1&lt;span style="color: #000000;"&gt;;&lt;br/&gt;});&lt;/span&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/artwl/aggbug/2482473.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/artwl/archive/2012/05/04/2482473.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/artwl/archive/2012/04/23/2466739.html</id><title type="text">jQuery1.7.2正式发布了</title><summary type="text">下载地址 jQuery1.7.2正式发布了，下载地址：http://code.jquery.com/jquery-1.7.2.min.js(minified, production)http://code.jquery.com/jquery-1.7.2.js(unminified, debug) 注：如果你正在使用jQuery Mobile，请使用最新的jQuery 1.7.2和jQuery Mobile 1.1这两个版本，因为之前的jQuery Mobile版本还基于jQuery core 1.7.1或更早的版本。更新内容Ajax#4624: Charset in default aja..</summary><published>2012-04-23T09:40:00Z</published><updated>2012-04-23T09:40:00Z</updated><author><name>artwl</name><uri>http://www.cnblogs.com/artwl/</uri></author><link rel="alternate" href="http://www.cnblogs.com/artwl/archive/2012/04/23/2466739.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/artwl/archive/2012/04/23/2466739.html"/><content type="html">&lt;p&gt;&lt;strong&gt;下载地址&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;jQuery1.7.2正式发布了，下载地址：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.jquery.com/jquery-1.7.2.min.js" target="_blank"&gt;http://code.jquery.com/jquery-1.7.2.min.js&lt;/a&gt;&amp;nbsp;(minified, production)&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.jquery.com/jquery-1.7.2.js" target="_blank"&gt;http://code.jquery.com/jquery-1.7.2.js&lt;/a&gt;&amp;nbsp;(unminified, debug)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;注：&lt;span&gt;如果你正在使用jQuery Mobile，请使用最新的jQuery 1.7.2和jQuery Mobile 1.1这两个版本，因为之前的jQuery Mobile版本还基于jQuery core 1.7.1或更早的版本。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;更新内容&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Ajax&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/4624" target="_blank"&gt;#4624&lt;/a&gt;: Charset in default ajaxSettings.contentType&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10978" target="_blank"&gt;#10978&lt;/a&gt;: jQuery.param() should allow non-native constructed objects as property values&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/11264" target="_blank"&gt;#11264&lt;/a&gt;: evalScript() uses defaults set by ajaxSetup()&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/11426" target="_blank"&gt;#11426&lt;/a&gt;: jQuery.ajax() always fails when requesting JPG images in IE&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Attributes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/5571" target="_blank"&gt;#5571&lt;/a&gt;: Allow chaining when passing undefined to any setter in jQuery&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10828" target="_blank"&gt;#10828&lt;/a&gt;: attr(&amp;ldquo;coords&amp;rdquo;) returns undefined in IE7&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10870" target="_blank"&gt;#10870&lt;/a&gt;: Incorrect behaviour of $.removeAttr(&amp;ldquo;selected&amp;rdquo;)&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/11316" target="_blank"&gt;#11316&lt;/a&gt;: Consider looking through valHooks by element type first, then by nodeName instead of the other way around&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Build&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10692" target="_blank"&gt;#10692&lt;/a&gt;: Configure the jshint options to more accurately match the style guide&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10693" target="_blank"&gt;#10693&lt;/a&gt;: generalize the &amp;ldquo;test something in an iframe&amp;rdquo; code in unit tests&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10901" target="_blank"&gt;#10901&lt;/a&gt;: have unit tests fail if the tester is running from file:// or doesn&amp;rsquo;t have PHP&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10902" target="_blank"&gt;#10902&lt;/a&gt;: ability to test a built version of jQuery in unit tests&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10931" target="_blank"&gt;#10931&lt;/a&gt;: Unit tests shouldn&amp;rsquo;t require internet access&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Core&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10466" target="_blank"&gt;#10466&lt;/a&gt;: jQuery.param() mistakes wrapped primitives for deep objects&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Css&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10639" target="_blank"&gt;#10639&lt;/a&gt;: outerWidth(true) and css(&amp;lsquo;margin&amp;rsquo;) returning % instead of px in Webkit&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10754" target="_blank"&gt;#10754&lt;/a&gt;: have jQuery.swap return the return of the callback instead of just executing it&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10782" target="_blank"&gt;#10782&lt;/a&gt;: Incorrect calculating width&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10796" target="_blank"&gt;#10796&lt;/a&gt;: Bug in IE7 with $(&amp;lsquo;#el&amp;rsquo;).css.(&amp;lsquo;background-position&amp;rsquo;)&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10858" target="_blank"&gt;#10858&lt;/a&gt;: css.js regular expressions are incomplete&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/11119" target="_blank"&gt;#11119&lt;/a&gt;: The curCSS function only need 2 arguments&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Data&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/11309" target="_blank"&gt;#11309&lt;/a&gt;: hexadecimal-formatted data-* attributes parsed incorrectly&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Deferred&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/11306" target="_blank"&gt;#11306&lt;/a&gt;: calling .disable() or .lock() on a $.Callbacks object breaks its fired() status&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Dimensions&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/3838" target="_blank"&gt;#3838&lt;/a&gt;: $(document).height() incorrect in IE6&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Effects&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/8498" target="_blank"&gt;#8498&lt;/a&gt;: Animate Hooks&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10006" target="_blank"&gt;#10006&lt;/a&gt;: method show is not working as expected in all browsers when called for document fragment&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10848" target="_blank"&gt;#10848&lt;/a&gt;: Animation toggling loses state tracking in certain atomic edge cases&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/11415" target="_blank"&gt;#11415&lt;/a&gt;: Silently ignore negative CSS values where they are illegal&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/11415" target="_blank"&gt;#11469&lt;/a&gt;: Negative margin in animations (.animate)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Event&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/8165" target="_blank"&gt;#8165&lt;/a&gt;: .live(&amp;lsquo;click&amp;rsquo;, handler) fires on disabled buttons with child elements in Chrome&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10819" target="_blank"&gt;#10819&lt;/a&gt;: Eliminate &amp;ldquo;this.on.call(this, &amp;ldquo;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10878" target="_blank"&gt;#10878&lt;/a&gt;: $(&amp;ldquo;select&amp;rdquo;).live(&amp;ldquo;change&amp;rdquo;, function(){ &amp;hellip;broken in IE8 in jQuery 1.7&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10961" target="_blank"&gt;#10961&lt;/a&gt;: Error in XRegExp using jQuery 1.7.1 in IE6-9&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10970" target="_blank"&gt;#10970&lt;/a&gt;: The .on() selector parameter doesn&amp;rsquo;t work with :not(:first) selector&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10984" target="_blank"&gt;#10984&lt;/a&gt;: Cannot off() custom events ($.event.special)&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/11021" target="_blank"&gt;#11021&lt;/a&gt;: Hover hack mangles a namespace named &amp;ldquo;hover&amp;rdquo;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/11076" target="_blank"&gt;#11076&lt;/a&gt;: .clone(true) loses delegation filters&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/11130" target="_blank"&gt;#11130&lt;/a&gt;: jQuery.fn.on: binding map with null selector ignores data&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/11145" target="_blank"&gt;#11145&lt;/a&gt;: $(document).on() not working with name=&amp;rdquo;disabled&amp;rdquo;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Manipulation&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/9427" target="_blank"&gt;#9427&lt;/a&gt;: Passing undefined to .text() does not trigger setter&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10753" target="_blank"&gt;#10753&lt;/a&gt;: inline the evalScript function in manipulation.js as it&amp;rsquo;s only used once&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10864" target="_blank"&gt;#10864&lt;/a&gt;: text() method on a document fragment always returns the empty string&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/11055" target="_blank"&gt;#11055&lt;/a&gt;: Update HTML5 Shim elements list to support latest html5shiv&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/11217" target="_blank"&gt;#11217&lt;/a&gt;: Append problem with webkit&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/11291" target="_blank"&gt;#11291&lt;/a&gt;: Cloning XMLDoc&amp;rsquo;s with HTML5 nodeName&amp;rsquo;s breaks on IE&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/11323" target="_blank"&gt;#11323&lt;/a&gt;: script tags with type=&amp;rdquo;text/ecmascript&amp;rdquo; leak into the DOM&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/11356" target="_blank"&gt;#11356&lt;/a&gt;: safeFragment memory leak&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Misc&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10952" target="_blank"&gt;#10952&lt;/a&gt;: .fired() doesn&amp;rsquo;t work on Callbacks object when it is flagged with &amp;ldquo;once&amp;rdquo;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/11257" target="_blank"&gt;#11257&lt;/a&gt;: Wrong path to source files in test suite if PHP missing&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Queue&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/10967" target="_blank"&gt;#10967&lt;/a&gt;: .promise() does not attach methods onto target&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Support&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/7986" target="_blank"&gt;#7986&lt;/a&gt;: Bug in $.support.boxModel if page has DIV-element CSS&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/11048" target="_blank"&gt;#11048&lt;/a&gt;: Support Tests affect layout for positioned elements in IE6-9&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/11337" target="_blank"&gt;#11337&lt;/a&gt;: Bug in $.support.reliableMarginRight&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Traversing&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://bugs.jquery.com/ticket/11370" target="_blank"&gt;#11370&lt;/a&gt;: $(&amp;lsquo;&amp;lt;div&amp;gt;&amp;rsquo;).siblings() throws exception&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://www.cnblogs.com/artwl/aggbug/2466739.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/artwl/archive/2012/04/23/2466739.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/artwl/archive/2012/04/18/2455816.html</id><title type="text">分享一个自定义的 console 类，让你不再纠结JS中的调试代码的兼容</title><summary type="text">问题的产生 在写JS的过程中，为了调试我们常常会写很多 console.log、console.info、console.group、console.warn、console.error代码来查看JS的运行情况，但发布时又因为IE不支持console，又要去掉这些代码，一不小心就会出错。 本文分享自己昨晚写的一个console类来试图解决这一问题。当然，更好的做法是把测试代码分开写，那样就不会有这个问题。解决思路 如何解决IE下不兼容的问题呢，那就是我们自己定义一个console类来覆盖浏览器提供的console功能，这样只要在页面中引用此JS文件就可以了。 另外，此类还提供了查看输出...</summary><published>2012-04-18T11:10:00Z</published><updated>2012-04-18T11:10:00Z</updated><author><name>artwl</name><uri>http://www.cnblogs.com/artwl/</uri></author><link rel="alternate" href="http://www.cnblogs.com/artwl/archive/2012/04/18/2455816.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/artwl/archive/2012/04/18/2455816.html"/><content type="html">&lt;p&gt;&lt;strong&gt;问题的产生&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在写JS的过程中，为了调试我们常常会写很多 console.log、console.info、console.group、console.warn、console.error代码来查看JS的运行情况，但发布时又因为IE不支持console，又要去掉这些代码，一不小心就会出错。&lt;/p&gt;&lt;p&gt;本文分享自己昨晚写的一个console类来试图解决这一问题。当然，更好的做法是把测试代码分开写，那样就不会有这个问题。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决思路&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如何解决IE下不兼容的问题呢，那就是我们自己定义一个console类来覆盖浏览器提供的console功能，这样只要在页面中引用此JS文件就可以了。&lt;/p&gt;&lt;p&gt;另外，此类还提供了查看输出的调试信息功能，console 定义了哪些功能呢，我们可以在这里看到：&lt;a href="http://getfirebug.com/wiki/index.php/Console_API"&gt;http://getfirebug.com/wiki/index.php/Console_API&lt;/a&gt;，我们可以看到这里提供了很多方法，我们常用的有&amp;nbsp;console.log、console.info、console.group、console.warn、console.error、console.profile、console.time，最后两个是分析代码性能的，比较复杂，本文没有实现。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;代码解析&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;第一步，当然是搭一个结构，覆盖浏览器(firebug、chrome)提供的console功能，这样直接引用此JS文件即可保证浏览器(主要是IE)中不出错：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('7b25d605-a84c-4034-8394-bc88fa4eadef')"&gt;&lt;div id="cnblogs_code_open_7b25d605-a84c-4034-8394-bc88fa4eadef" class="cnblogs_code_hide"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; console=&lt;span style="color: #000000;"&gt;{&lt;br/&gt;assert:function(){&lt;br/&gt;},&lt;br/&gt;clear:function(){&lt;br/&gt;},&lt;br/&gt;count:function(){&lt;br/&gt;},&lt;br/&gt;debug:function(){&lt;br/&gt;},&lt;br/&gt;dir:function(){&lt;br/&gt;},&lt;br/&gt;dirxml:function(){&lt;br/&gt;},&lt;br/&gt;error:function(){&lt;br/&gt;},&lt;br/&gt;exception:function(){&lt;br/&gt;},&lt;br/&gt;group:function(name){&lt;br/&gt;},&lt;br/&gt;groupCollapsed:function(){&lt;br/&gt;},&lt;br/&gt;groupEnd:function(){&lt;br/&gt;},&lt;br/&gt;info:function(){&lt;br/&gt;},&lt;br/&gt;log:function(){&lt;br/&gt;},&lt;br/&gt;memoryProfile:function(){&lt;br/&gt;},&lt;br/&gt;memoryProfileEnd:function(){&lt;br/&gt;},&lt;br/&gt;profile:function(){&lt;br/&gt;},&lt;br/&gt;profileEnd:function(){&lt;br/&gt;},&lt;br/&gt;table:function(){&lt;br/&gt;},&lt;br/&gt;time:function(){&lt;br/&gt;},&lt;br/&gt;timeEnd:function(){&lt;br/&gt;},&lt;br/&gt;timeStamp:function(){&lt;br/&gt;},&lt;br/&gt;trace:function(){&lt;br/&gt;},&lt;br/&gt;warn:function(){&lt;br/&gt;}&lt;br/&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;第二步，实现 console.log方法。在所实现的几个方法中这个是最复杂的。&lt;/p&gt;&lt;p&gt;从firebug的API中我们可以看到，console.log不仅仅可以输出信息，还提供了类似 string.Format的功能，直接引用原文如下：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;Here is the complete set of patterns that you may use for string substitution:&lt;/p&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;Pattern&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;%s&lt;/td&gt;&lt;td&gt;String&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;%d,&amp;nbsp;%i&lt;/td&gt;&lt;td&gt;Integer (numeric formatting is not yet supported)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;%f&lt;/td&gt;&lt;td&gt;Floating point number (numeric formatting is not yet supported)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;%o&lt;/td&gt;&lt;td&gt;Object hyperlink&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;%c&lt;/td&gt;&lt;td&gt;Style formatting&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;其中的%c比较特殊，是给输出添加样式的，比如我们在firebug中这样写：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;console.log('%cTest output', 'color:white; background-color:blue');&lt;/div&gt;&lt;p&gt;运行后的结果是这样的：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/112805/2012041818382210.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;这里%c也可以跟 %s、%d等混用。&lt;/p&gt;&lt;p&gt;所以，在代码中我直接用replace进行替换，由于JS中的replace默认只替换第一个匹配项，这里刚好，代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; args=&lt;span style="color: #000000;"&gt;Array.prototype.slice.call(arguments);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(args.length&amp;gt;1&lt;span style="color: #000000;"&gt;){&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; i=1,hasstyle=&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(args[0].indexOf("%c")==0&lt;span style="color: #000000;"&gt;){&lt;br/&gt;            args[&lt;/span&gt;0]=args[0].replace(/%c/,""&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            i&lt;/span&gt;=2&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            hasstyle&lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(;i&amp;lt;args.length;i++&lt;span style="color: #000000;"&gt;){&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(/%s|%d|%i|%o/.test(args[0&lt;span style="color: #000000;"&gt;])){&lt;br/&gt;                args[&lt;/span&gt;0]=args[0].replace(/%s|%d|%i|%o/&lt;span style="color: #000000;"&gt;,args[i]);&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(i&amp;lt;&lt;span style="color: #000000;"&gt;args.length){&lt;br/&gt;            args[&lt;/span&gt;0]=args[0]+" "+args.slice(i).join(" "&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(hasstyle){&lt;br/&gt;            consoleHelper.showlog(args[&lt;/span&gt;0],args[1&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br/&gt;            consoleHelper.showlog(args[&lt;/span&gt;0&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(args.length==1&lt;span style="color: #000000;"&gt;){&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(arguments[0] &lt;span style="color: #0000ff;"&gt;instanceof&lt;/span&gt;&lt;span style="color: #000000;"&gt; Array){&lt;br/&gt;            consoleHelper.showlog(&lt;/span&gt;"["+args[0]+"]"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(arguments[0] &lt;span style="color: #0000ff;"&gt;instanceof&lt;/span&gt;&lt;span style="color: #000000;"&gt; Function){&lt;br/&gt;            consoleHelper.showlog(args[&lt;/span&gt;0],&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;,"console_log_function"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br/&gt;            consoleHelper.showlog(args[&lt;/span&gt;0&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br/&gt;        consoleHelper.showlog(&lt;/span&gt;""&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;由于console.log可以接受多个参数，且个数不确定，所以这里直接没有写形参。对于%c虽然firebug中写在中间也是有效的，这里为了简单直接只对写在开头的有效。代码中先把参数转换为数组，然后对数组进行分情况处理。&lt;/p&gt;&lt;p&gt;当参数个数大于1时，对后面的参数用replace进行替换，然后把剩下的参数连接(join)起来进行输出。&lt;/p&gt;&lt;p&gt;当参数个数为1时，还要分两种情况，一是数组，二是方法。对于数组，按firebug中的格式，在两端加中括号，对于函数，把字的颜色变为绿色&lt;/p&gt;&lt;p&gt;当参数个数为0时，直接输出空字符串&lt;/p&gt;&lt;p&gt;后面的consoleHelper.showlog是为了输出方便另外写的一个方法，在这个方法中把各种调试信息的结果显示在页面上的一个div(如果存在)中。&lt;/p&gt;&lt;p&gt;其他几个方法的思路跟这个差不多，只是样式不同，功能比这个简单，直接把参数连接起来输出即可。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;整个console类代码如下：&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('fa287f3d-87e0-4179-be1c-ac9cad266de5')"&gt;&lt;div id="cnblogs_code_open_fa287f3d-87e0-4179-be1c-ac9cad266de5" class="cnblogs_code_hide"&gt;&lt;span style="color: #800000;"&gt;var console=&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;assert&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;function(){&lt;br/&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;,&lt;br/&gt;clear:function()&lt;/span&gt;{&lt;br/&gt;}&lt;span style="color: #800000;"&gt;,&lt;br/&gt;count:function()&lt;/span&gt;{&lt;br/&gt;}&lt;span style="color: #800000;"&gt;,&lt;br/&gt;debug:function()&lt;/span&gt;{&lt;br/&gt;}&lt;span style="color: #800000;"&gt;,&lt;br/&gt;dir:function()&lt;/span&gt;{&lt;br/&gt;}&lt;span style="color: #800000;"&gt;,&lt;br/&gt;dirxml:function()&lt;/span&gt;{&lt;br/&gt;}&lt;span style="color: #800000;"&gt;,&lt;br/&gt;error:function()&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    var args=Array.prototype.slice.call(arguments);&lt;br/&gt;    consoleHelper.showerror(args.join(" "));&lt;br/&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;,&lt;br/&gt;exception:function()&lt;/span&gt;{&lt;br/&gt;}&lt;span style="color: #800000;"&gt;,&lt;br/&gt;group:function(name)&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    consoleHelper.showgroup(name);&lt;br/&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;,&lt;br/&gt;groupCollapsed:function()&lt;/span&gt;{&lt;br/&gt;}&lt;span style="color: #800000;"&gt;,&lt;br/&gt;groupEnd:function()&lt;/span&gt;{&lt;br/&gt;}&lt;span style="color: #800000;"&gt;,&lt;br/&gt;info:function()&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    var args=Array.prototype.slice.call(arguments);&lt;br/&gt;    if(args.length==1){&lt;br/&gt;        if(arguments[0] instanceof Array){&lt;br/&gt;            consoleHelper.showinfo("["+args[0]+"]");&lt;br/&gt;        &lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br/&gt;        else if(arguments[0] instanceof Function)&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;            consoleHelper.showinfo(args[0],"console_log_function");&lt;br/&gt;        &lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br/&gt;        else&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;            consoleHelper.showinfo(args[0]);&lt;br/&gt;        &lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br/&gt;    }&lt;br/&gt;    else&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;        consoleHelper.showinfo(args.join(" "));&lt;br/&gt;    &lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br/&gt;},&lt;br/&gt;log:function()&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    var args=Array.prototype.slice.call(arguments);&lt;br/&gt;    if(args.length&amp;gt;1){&lt;br/&gt;        var i=1,hasstyle=false;&lt;br/&gt;        if(args[0].indexOf("%c")==0){&lt;br/&gt;            args[0]=args[0].replace(/%c/,"");&lt;br/&gt;            i=2;&lt;br/&gt;            hasstyle=true;&lt;br/&gt;        &lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br/&gt;        for(;i&amp;lt;args.length;i++)&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;            if(/%s|%d|%i|%o/.test(args[0])){&lt;br/&gt;                args[0]=args[0].replace(/%s|%d|%i|%o/,args[i]);&lt;br/&gt;            &lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br/&gt;            else&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;                break;&lt;br/&gt;            &lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br/&gt;        }&lt;br/&gt;        if(i&amp;lt;args.length)&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;            args[0]=args[0]+" "+args.slice(i).join(" ");&lt;br/&gt;        &lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br/&gt;        if(hasstyle)&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;            consoleHelper.showlog(args[0],args[1]);&lt;br/&gt;        &lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br/&gt;        else&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;            consoleHelper.showlog(args[0]);&lt;br/&gt;        &lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br/&gt;    }&lt;br/&gt;    else if(args.length==1)&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;        if(arguments[0] instanceof Array){&lt;br/&gt;            consoleHelper.showlog("["+args[0]+"]");&lt;br/&gt;        &lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br/&gt;        else if(arguments[0] instanceof Function)&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;            consoleHelper.showlog(args[0],null,"console_log_function");&lt;br/&gt;        &lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br/&gt;        else&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;            consoleHelper.showlog(args[0]);&lt;br/&gt;        &lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br/&gt;    }&lt;br/&gt;    else&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;        consoleHelper.showlog("");&lt;br/&gt;    &lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br/&gt;},&lt;br/&gt;memoryProfile:function()&lt;/span&gt;{&lt;br/&gt;}&lt;span style="color: #800000;"&gt;,&lt;br/&gt;memoryProfileEnd:function()&lt;/span&gt;{&lt;br/&gt;}&lt;span style="color: #800000;"&gt;,&lt;br/&gt;profile:function()&lt;/span&gt;{&lt;br/&gt;}&lt;span style="color: #800000;"&gt;,&lt;br/&gt;profileEnd:function()&lt;/span&gt;{&lt;br/&gt;}&lt;span style="color: #800000;"&gt;,&lt;br/&gt;table:function()&lt;/span&gt;{&lt;br/&gt;}&lt;span style="color: #800000;"&gt;,&lt;br/&gt;time:function()&lt;/span&gt;{&lt;br/&gt;}&lt;span style="color: #800000;"&gt;,&lt;br/&gt;timeEnd:function()&lt;/span&gt;{&lt;br/&gt;}&lt;span style="color: #800000;"&gt;,&lt;br/&gt;timeStamp:function()&lt;/span&gt;{&lt;br/&gt;}&lt;span style="color: #800000;"&gt;,&lt;br/&gt;trace:function()&lt;/span&gt;{&lt;br/&gt;}&lt;span style="color: #800000;"&gt;,&lt;br/&gt;warn:function()&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    var args=Array.prototype.slice.call(arguments);&lt;br/&gt;    if(args.length==1){&lt;br/&gt;        if(arguments[0] instanceof Array){&lt;br/&gt;            consoleHelper.showwarn("["+args[0]+"]");&lt;br/&gt;        &lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br/&gt;        else if(arguments[0] instanceof Function)&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;            consoleHelper.showwarn(args[0],"console_log_function");&lt;br/&gt;        &lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br/&gt;        else&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;            consoleHelper.showwarn(args[0]);&lt;br/&gt;        &lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br/&gt;    }&lt;br/&gt;    else&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;        consoleHelper.showwarn(args.join(" "));&lt;br/&gt;    &lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br/&gt;}&lt;br/&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;consoleHelper代码如下：&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; consoleHelper=&lt;span style="color: #000000;"&gt;{&lt;br/&gt;showlog:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(val,style,cla){&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(cla){&lt;br/&gt;        cla&lt;/span&gt;="console_log "+&lt;span style="color: #000000;"&gt;cla;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br/&gt;        cla&lt;/span&gt;="console_log"&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.show(val,style,cla);&lt;br/&gt;},&lt;br/&gt;showinfo:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(val,cla){&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(cla){&lt;br/&gt;        cla&lt;/span&gt;="console_info "+&lt;span style="color: #000000;"&gt;cla;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br/&gt;        cla&lt;/span&gt;="console_info"&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.show(val,&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;,cla);&lt;br/&gt;},            &lt;br/&gt;showwarn:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(val,cla){&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(cla){&lt;br/&gt;        cla&lt;/span&gt;="console_warn "+&lt;span style="color: #000000;"&gt;cla;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br/&gt;        cla&lt;/span&gt;="console_warn"&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.show(val,&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;,cla);&lt;br/&gt;},&lt;br/&gt;showerror:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(val){&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.show(val,&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;,"console_error"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;},&lt;br/&gt;showgroup:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(val){&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!&lt;span style="color: #000000;"&gt;val){&lt;br/&gt;        val&lt;/span&gt;=""&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.show(val+":",&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;,"console_group"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;},&lt;br/&gt;show:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(val,style,cla){&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(document.getElementById("showconsole"&lt;span style="color: #000000;"&gt;)){&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; div=document.createElement("div"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(div.setAttribute){&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(style){&lt;br/&gt;                div.setAttribute(&lt;/span&gt;"style"&lt;span style="color: #000000;"&gt;,style);&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(style){&lt;br/&gt;                div&lt;/span&gt;=document.createElement("&amp;lt;div style="+style+"&amp;gt;"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(cla){&lt;br/&gt;            div.className&lt;/span&gt;=&lt;span style="color: #000000;"&gt;cla;&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; oText=&lt;span style="color: #000000;"&gt;document.createTextNode(val);&lt;br/&gt;        div.appendChild(oText);&lt;br/&gt;        document.getElementById(&lt;/span&gt;"showconsole"&lt;span style="color: #000000;"&gt;).appendChild(div);&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;};&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;注：如果想在页面中看到调试信息，直接在页面上添加一个id 为&amp;nbsp;showconsole 的隐藏的div即可。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;样式(尽量跟FireBug保持一致)：&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #800000;"&gt;.console_log&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    border&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;1px solid #CCC&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    color&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;#333&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    padding&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;0px 5px&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    min-height&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;24px&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    line-height&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;24px&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    margin-bottom&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;-1px&lt;/span&gt;;&lt;br/&gt;}&lt;span style="color: #800000;"&gt;&lt;br/&gt;.console_info&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    border&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;1px solid #CCC&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    color&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;#333&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    padding&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;0px 5px&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    min-height&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;24px&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    line-height&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;24px&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    margin-bottom&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;-1px&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    background&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; url("data:image/png&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAEEklEQVQ4jbWUW0wcZRTH/998szO7O8ByWa7WmBVKE1EpjUCt1hZsk1pCqsFL6mufauJDTQypTYHY2KbGmChp+mBsfDBtNFJDArWVWlAJsqxpKYGYsiJpKVso2y3sZXZnZ2aPDyNkl23Vl05ykvnO5Tdn/ufMMCLCo7iER0IFIP5Xgru2LS8ai9cRUQUAMMYCOYrjWvB6T/jf6tjDpHBubKkxnRVH3ZUNLU9W1+Q48koAAPHwXfw1PRUNzoz1czVwTPX3T/0v8MHD3ezL7356L++ZN05sbd5nKylQ4LAxKLIVj2pATCPcW1ExOtirhye+PXzg9Zc/PX3i3QxQhhQ9F37BmfM/Hyva+cGRF7c+hzKXgMqi7G4IDH5ZgbPlLduvhVWfnDn/cf6u7bVH2/a+9OCO5cqWfXL9oe937GxiJXkcjxdY/hc8QO1j1v3A8HX4qRYAsBgB5pdTGBq8TJrvs9e0mf7eVdbaVmxo2C+xsvqT1VuaWNzgcDmASMKyW4srGPV6Mer1YnLiKsIaENYAhwRwLqC6romxsvqTGxr2S1lSLN1b3iY9v3tTocKRNIG7EUAWAS4AE0EXZLHRGl5lI0JhIGEATglgAApzOGye3ZuWfvNuAzCUASZR2eMo3wzOATKBuWWrSOLAO9uBV5+18r745jK+XtllHWJWjkMS4CjfDE1U9mSBmdPtkR1OMALs67Y7lTZvMuJZcUaA7HCCOd2eLClWAZwDEsssFNO+TwbAYcuMm5T58Ewp1OCsFlcBUmCX1iWlgxlgXweOaYAWV0FqcHbVt1bCjNhFbWEcIdUqTDfOMzteHw+pgLYwDmbELmaBi4vyR/TZgRs3QwQi63VXLb1jgWXGiICbIYI+O3CjuCh/JAt8e+xckhZ87cv+KzQxb22DXbQskdAQCNxBIHAH4XB4zS9xYGIeWPZfIVrwtd8eO5fM0hgAzna397596PPjM/aCIyLfgh1VgI0DQ37Chd91qxO5CTk2QDeB4T+BmT+uQr92+qOz3e296Sze1dW1dnhq4xMIBBYHfZe+ioRUNM0aldwp21CUKyI/3wUl1wUm5WImCPw4GcctX4+evHqq/UBb0/H3D76ZMdCH/zar9j5tOis6eEXjK7bimhxHnhsAEA8HoS9NRc2A9weuBj6cGjg16fF4surZyMgIOjs7+fT0tBiJRKRkMimZpimlUikbEdnI5iogu7uOBLEcAFjKWGCJpXGmh0OMMV0QBF0QhKQkSUlFUZIej0fv6OgwRV3XoaoqDMNgpmkKRLRqHIBI2v0EtPs+BvB/ts0kwABjIoAUEaWISDBNUzAMg6mqyqLR6IOl6OvrY8PDw5ibm2OhUIipqopEIsEAwG63kyzLcLvdVFpaSs3NzWhtbc2C/A18nMDdJnOGEAAAAABJRU5ErkJggg==") no-repeat scroll 0 1px #EBF5FF;&lt;br/&gt;    padding-left&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;30px&lt;/span&gt;;&lt;br/&gt;}&lt;span style="color: #800000;"&gt;&lt;br/&gt;.console_warn&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    border&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;1px solid #CCC&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    color&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;#333&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    padding&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;0px 5px&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    min-height&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;24px&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    line-height&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;24px&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    margin-bottom&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;-1px&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    background&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; url("data:image/png&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAD/ElEQVQ4jbWUX2gcVRSHv3tndmaTTbJJSJNWaXVNCUVjFbEWlb4U9aEYjRYURHwqKIIvgqX0oZEi+CIqCBYUjVhE8aW0xAfxSQhpSaVqETWpDdhtbWvS/NvZ2dm5c+/xIUmTdlN86oUDw71zvnvu7xx+SkS4HUvfFirg3/Lk/Lcw9tp2l9lBE8ujzrBBaWK/iT+8UI+osPMHXpxKbpWu1pNCjnZtsXH6fm2xddAWd3iqow/d3I5YgyxegpnThHpqMiiq/Xpw/DjFvv8Huy86dtTn7PF6ftem4P7nULkmCAso7YEIklQQEbLyGeT8V66wITmsd75zWPe/IbcE2+HOu+vz2UlT3LMx2PYEKNAB5LY9gy50YzPDX99/wF1dnYgFO3cR+8sRCj3J6/6+hSNrwdebZ0+/rbI4+yjV/RuD3p34YUTYHhG2RmhtlyQCrF4gbI8IWiP89iJ667Mkc7yXfdp597pgd+bDHWkU7An6dhG2V8nlI7SLwEQgdjUjq6GyCE9HhMUq4ebN2KC32Rq7f31wJnspbtX5DQpNFbI1IW4NOAZTBVNFZVVyzTFBaTs2YTD9vDdY+e36uNlUHg96N6OJwdzU4pWKRcAmS5etNAkIu1upTbVsktpsCZi4AYx4PX5b01JFN6/lPZPW0GYeFq+CqYDS0HQH2m9BtxaRuNrdCFYkykVgwkZwMg1AdWGa5sppCL3Vs2oZOh5A6wznqDdIgbMTMjvRT2cJ1HKiOMiqpJdHubLQxJW/f2Nr3uMGJxCBhQmkNmsEf6oBLKK+swvX9nragBcCArYOOLzFYdpqn9EGtBVyDQ9yaYKrmfH8yz/ONFas88eyhdq7fmtzz2o9CvDwtjxNe74bcZbs3FG0tzolApi5CGc5onseXMWtfBTevDpvU4bS6XmcFcBbjd5XYPsB7H1vce4K1/dFPGwlwszXxlTxnm/WvuIGd/P7Bj4xEyceVurffbliEZVvQSnFzO8nuFw/ibMZTRoEjZgUV52nfq1eFpd7oeXVn+1aVoMJVYaf1HJp/HCuRQ4EbdpTuTx4wdJoIeAyxCTY2JAuMm5dsLd4cObizbqva5vTF/5EDz/2kO9lB3PNPOWFtC6bGzbFmhpnTaI+nsmVvgxeOpaWSqUGhhobG2NoaMibnJz0K5VKkKZpYK0NnHM5Eck9cqdqf/5e3d/RpLpqRuo//ePOfX1WLljBKKWM1tpordMgCNJCoZCWSiVz6NAh6xtjiOOYLMuUtVaLyEp4gH+qbOunyvbX5Y4pwAK+UkoAJyJORLS1VmdZpuI4VlEUrS/FyMiIGh0dpVwuq9nZWRXHMUmSKIB8Pi9hGNLV1SU9PT2ye/duBgYGGiD/AVNZApv23zD/AAAAAElFTkSuQmCC") no-repeat scroll 0 1px #FFFFC8;&lt;br/&gt;    padding-left&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;30px&lt;/span&gt;;&lt;br/&gt;}&lt;span style="color: #800000;"&gt;&lt;br/&gt;.console_error&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    border&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;1px solid #CCC&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    color&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;#FF0000&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    padding&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;0px 5px&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    min-height&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;24px&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    line-height&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;24px&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    margin-bottom&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;-1px&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    background&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; url("data:image/png&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACYQAAAmEBwTBV+gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAQHSURBVDiNtZVtbxRVFMd/596ZnS1L210otMB2t62gmKA2gVLtC5UgaGi0Eg2JfgY+AdAWWq0fgKJGE33ZqCQF5EFqCIoJ0RoTXpRATHjY0hYa2i6d7XZ2u7tzfbHttlgKiYn/5M5N7j33N+fMOfeMGGP4P2Q9yyCxSloUxBAioCKIyviW1R9/5N152jlZyeORkOwz6A5VVdWsa2uxamOAonB/hPzoCH4yOahE922acHsxJv9M8L2QbETbp/SmaNOqtv1Yz20BgeJD5ichf+c23oWzFMbHB4IZ82HVw4epFcET66R8Nu9cKdv9diNbnsefm6Ns46YSbCk4OzmF0gpz+xaZ3369ZgK6tfbm8NgCSy2+QixPVp8MNr/WmF+zlqnECNlwFVODg/gpF991i3PKJTV0HXdiisnbCfIVYZztOxoV1qmlHpfAo9Xhg1a8fm+hJorrptnyzbfE2ttRL71C8q9r+KkUJpVi5ubfeNqm4Xgvm7/6GncySWFdNToWbxp5+YV9y8DGtj+26hvw3WnKtr6ICgYBiB1pR2/fwaOh68zcukUmVM7mE58jWqMch+DWrRSmXaxYHB1wOh4DJ+pq6iUcaUIUAccmd+ki944dLYUV6zyKtfNVsmvWsfmLL0HrYqK7jpH/7RecUBkoBRWVzWMtO1tgvo4tJ7BftMafngbbYnWkEvfsGRKFAvGu7iK8qxt8vwgAhjs7mLv0MxWxKH46Db6PaI2xVAy4WrwglhM0+Rz5sVEktAoVClERqcQ908/dQoG6T3vm4ytC7x4+TG7gAhXRDZjZWUw2g8lmAUE5gUjJYyydFKVAFORy+G6qCMnlyD94AIVCKfxiQgwmmynaLZSiZYEojKhFsAScZNFAFY2UYnY6hX5zNw3He0ueLqiup4eEVqR+PEV5TTUoQUQWwJnFqrDVMHYAbBuxbdKpNNa+d2noPbEY/qFD3D18qASPd39CsO0DZianEMsGuziU2P2w5Obdf6Pld5Q0Z9Oz8NY71PV8VoIk2o+QPXcGEJzW94h3dy/udXTA1Ss4kTCIDNZ839/8WB2LY3dh20gwSObGDXzPm89+J9mfzlFRG6UiFiU7cJ7ho50A+J6Hd30IFQwiWiNK9ZV4S3vFg9Y9g4hqyqZm8Naup2zbNuYuXqA8uuGx7z8zeh979x68oSHK0i7BcCVgBqrHk61cvpxfBp5o27uxoALnjEjjnOdh8gWcSBj5V/IAMo+mUZZFYHUIkGvay71edfp0qcMta5sTbW3lBUefRMneZbQn608t+fer+k6PLV18cqPftcsar15zEOEjDDtXAP5hjHTVfHfy/JM2V/yDLGj8wIF6Uf5+IyYoRpIGPymih9f3/XD1aeeeCf6v+gfLYZXwkd5f2QAAAABJRU5ErkJggg==") no-repeat scroll 0 1px #FFEBEB;&lt;br/&gt;    padding-left&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;30px&lt;/span&gt;;&lt;br/&gt;}&lt;span style="color: #800000;"&gt;&lt;br/&gt;.console_group&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    margin-top&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;20px&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    font-size&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;16px&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    font-weight&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;bolder&lt;/span&gt;;&lt;br/&gt;}&lt;span style="color: #800000;"&gt;&lt;br/&gt;.console_log_function&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    color&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;green&lt;/span&gt;;&lt;br/&gt;}&lt;/div&gt;&lt;p&gt;这里为了演示方便，三个小图标直接用的是base64格式的图片，就是上面代码中的三个长字符串，大家用时可以换成图片地址。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;运行效果&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;iframe style="width: 100%; height: 600px;" src="http://jscode.chinacxy.com/code/7b448874bb61e634e9fed1f73609555c.aspx" frameborder="0" width="320" height="240"&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;小结&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;写这个JS一方面是工作中有这方面的需求，另外也是因为在博问中看到有人问&amp;nbsp;&lt;a class="blacklink" href="http://q.cnblogs.com/q/34768/"&gt;JavaScript中如何获得console.log的值？&lt;/a&gt;&amp;nbsp;，前段时间有个国外学编程网站可以把console.log的结果直接显示在页面上，不知道是不是用了本文类似的方案。&lt;/p&gt;&lt;p&gt;欢迎大家留言讨论。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/artwl/aggbug/2455816.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/artwl/archive/2012/04/18/2455816.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/artwl/archive/2012/04/16/2452713.html</id><title type="text">《JavaScript高级程序设计》阅读笔记（十六）：javascript检测浏览器和操作系统-detect.js</title><summary type="text">检测浏览器的方式 1、对象特征检测法：判断浏览器能力的通用方法。如果更关注浏览器的能力而不在乎它的实际身份，就可以使用这种检测方法。常见的原生Ajax写法中就用这种方法来创建XMLHttpRequest：IXHR: function(){ if(window.ActiveXObject){ XHR=new ActiveXObject('Microsoft.XMLHTTP'); }else if(window.XMLHttpRequest){ XHR=new XMLHttpRequest(); }else{ ...</summary><published>2012-04-16T13:47:00Z</published><updated>2012-04-16T13:47:00Z</updated><author><name>artwl</name><uri>http://www.cnblogs.com/artwl/</uri></author><link rel="alternate" href="http://www.cnblogs.com/artwl/archive/2012/04/16/2452713.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/artwl/archive/2012/04/16/2452713.html"/><content type="html">&lt;p&gt;&lt;strong&gt;检测浏览器的方式&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1、对象特征检测法：判断浏览器能力的通用方法。如果更关注浏览器的能力而不在乎它的实际身份，就可以使用这种检测方法。常见的原生Ajax写法中就用这种方法来创建&lt;span&gt;XMLHttpRequest：&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;IXHR: function(){&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(window.ActiveXObject){&lt;br/&gt;            XHR&lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; ActiveXObject(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Microsoft.XMLHTTP&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        }&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(window.XMLHttpRequest){&lt;br/&gt;            XHR&lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; XMLHttpRequest();&lt;br/&gt;        }&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;2、user-agent字符串检测法：通过能浏览器的user-agent字符串进行解析来判断，判断方法在下文的detect.js中&lt;/p&gt;&lt;p&gt;&lt;strong&gt;检测平台/操作系统&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;通过navigator折platform属性和user-agent字符串来判断，判断方法在下文的detect.js中&lt;/p&gt;&lt;p&gt;&lt;strong&gt;检测浏览器和操作系统-detect.js&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; sUserAgent =&lt;span style="color: #000000;"&gt; navigator.userAgent;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; fAppVersion =&lt;span style="color: #000000;"&gt; parseFloat(navigator.appVersion);&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; compareVersions(sVersion1, sVersion2) {&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; aVersion1 = sVersion1.split("."&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; aVersion2 = sVersion2.split("."&lt;span style="color: #000000;"&gt;);&lt;br/&gt;   &lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (aVersion1.length &amp;gt;&lt;span style="color: #000000;"&gt; aVersion2.length) {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; i=0; i &amp;lt; aVersion1.length - aVersion2.length; i++&lt;span style="color: #000000;"&gt;) {&lt;br/&gt;            aVersion2.push(&lt;/span&gt;"0"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        }&lt;br/&gt;    } &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (aVersion1.length &amp;lt;&lt;span style="color: #000000;"&gt; aVersion2.length) {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; i=0; i &amp;lt; aVersion2.length - aVersion1.length; i++&lt;span style="color: #000000;"&gt;) {&lt;br/&gt;            aVersion1.push(&lt;/span&gt;"0"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        }   &lt;br/&gt;    }&lt;br/&gt;   &lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; i=0; i &amp;lt; aVersion1.length; i++&lt;span style="color: #000000;"&gt;) {&lt;br/&gt; &lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (aVersion1[i] &amp;lt;&lt;span style="color: #000000;"&gt; aVersion2[i]) {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; -1&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        } &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (aVersion1[i] &amp;gt;&lt;span style="color: #000000;"&gt; aVersion2[i]) {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; 1&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        }   &lt;br/&gt;    }&lt;br/&gt;   &lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; 0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; isOpera = sUserAgent.indexOf("Opera") &amp;gt; -1&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; isMinOpera4 = isMinOpera5 = isMinOpera6 = isMinOpera7 = isMinOpera7_5 = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (isOpera) {&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; fOperaVersion;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(navigator.appName == "Opera"&lt;span style="color: #000000;"&gt;) {&lt;br/&gt;        fOperaVersion &lt;/span&gt;=&lt;span style="color: #000000;"&gt; fAppVersion;&lt;br/&gt;    } &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; reOperaVersion = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; RegExp("Opera (//d+//.//d+)"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        reOperaVersion.test(sUserAgent);&lt;br/&gt;        fOperaVersion &lt;/span&gt;= parseFloat(RegExp["$1"&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;    }&lt;br/&gt;    isMinOpera4 &lt;/span&gt;= fOperaVersion &amp;gt;= 4&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    isMinOpera5 &lt;/span&gt;= fOperaVersion &amp;gt;= 5&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    isMinOpera6 &lt;/span&gt;= fOperaVersion &amp;gt;= 6&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    isMinOpera7 &lt;/span&gt;= fOperaVersion &amp;gt;= 7&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    isMinOpera7_5 &lt;/span&gt;= fOperaVersion &amp;gt;= 7.5&lt;span style="color: #000000;"&gt;;&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; isKHTML = sUserAgent.indexOf("KHTML") &amp;gt; -1&lt;br/&gt;              || sUserAgent.indexOf("Konqueror") &amp;gt; -1&lt;br/&gt;              || sUserAgent.indexOf("AppleWebKit") &amp;gt; -1&lt;span style="color: #000000;"&gt;;&lt;br/&gt;             &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; isMinSafari1 = isMinSafari1_2 = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; isMinKonq2_2 = isMinKonq3 = isMinKonq3_1 = isMinKonq3_2 = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (isKHTML) {&lt;br/&gt;    isSafari &lt;/span&gt;= sUserAgent.indexOf("AppleWebKit") &amp;gt; -1&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    isKonq &lt;/span&gt;= sUserAgent.indexOf("Konqueror") &amp;gt; -1&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (isSafari) {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; reAppleWebKit = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; RegExp("AppleWebKit///(//d+(?://.//d*)?)"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        reAppleWebKit.test(sUserAgent);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; fAppleWebKitVersion = parseFloat(RegExp["$1"&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;        isMinSafari1 &lt;/span&gt;= fAppleWebKitVersion &amp;gt;= 85&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        isMinSafari1_2 &lt;/span&gt;= fAppleWebKitVersion &amp;gt;= 124&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    } &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (isKonq) {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; reKonq = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; RegExp("Konqueror///(//d+(?://.//d+(?://.//d)?)?)"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        reKonq.test(sUserAgent);&lt;br/&gt;        isMinKonq2_2 &lt;/span&gt;= compareVersions(RegExp["$1"], "2.2") &amp;gt;= 0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        isMinKonq3 &lt;/span&gt;= compareVersions(RegExp["$1"], "3.0") &amp;gt;= 0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        isMinKonq3_1 &lt;/span&gt;= compareVersions(RegExp["$1"], "3.1") &amp;gt;= 0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        isMinKonq3_2 &lt;/span&gt;= compareVersions(RegExp["$1"], "3.2") &amp;gt;= 0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    }&lt;br/&gt;   &lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; isIE = sUserAgent.indexOf("compatible") &amp;gt; -1&lt;br/&gt;           &amp;amp;&amp;amp; sUserAgent.indexOf("MSIE") &amp;gt; -1&lt;br/&gt;           &amp;amp;&amp;amp; !&lt;span style="color: #000000;"&gt;isOpera;&lt;br/&gt;          &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; isMinIE4 = isMinIE5 = isMinIE5_5 = isMinIE6 = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (isIE) {&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; reIE = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; RegExp("MSIE (//d+//.//d+);"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    reIE.test(sUserAgent);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; fIEVersion = parseFloat(RegExp["$1"&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;    isMinIE4 &lt;/span&gt;= fIEVersion &amp;gt;= 4&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    isMinIE5 &lt;/span&gt;= fIEVersion &amp;gt;= 5&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    isMinIE5_5 &lt;/span&gt;= fIEVersion &amp;gt;= 5.5&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    isMinIE6 &lt;/span&gt;= fIEVersion &amp;gt;= 6.0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; isMoz = sUserAgent.indexOf("Gecko") &amp;gt; -1&lt;br/&gt;            &amp;amp;&amp;amp; !&lt;span style="color: #000000;"&gt;isKHTML;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; isMinMoz1 = sMinMoz1_4 = isMinMoz1_5 = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (isMoz) {&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; reMoz = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; RegExp("rv:(//d+//.//d+(?://.//d+)?)"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    reMoz.test(sUserAgent);&lt;br/&gt;    isMinMoz1 &lt;/span&gt;= compareVersions(RegExp["$1"], "1.0") &amp;gt;= 0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    isMinMoz1_4 &lt;/span&gt;= compareVersions(RegExp["$1"], "1.4") &amp;gt;= 0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    isMinMoz1_5 &lt;/span&gt;= compareVersions(RegExp["$1"], "1.5") &amp;gt;= 0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; isNS4 = !isIE &amp;amp;&amp;amp; !isOpera &amp;amp;&amp;amp; !isMoz &amp;amp;&amp;amp; !&lt;span style="color: #000000;"&gt;isKHTML&lt;br/&gt;            &lt;/span&gt;&amp;amp;&amp;amp; (sUserAgent.indexOf("Mozilla") == 0&lt;span style="color: #000000;"&gt;)&lt;br/&gt;            &lt;/span&gt;&amp;amp;&amp;amp; (navigator.appName == "Netscape"&lt;span style="color: #000000;"&gt;)&lt;br/&gt;            &lt;/span&gt;&amp;amp;&amp;amp; (fAppVersion &amp;gt;= 4.0 &amp;amp;&amp;amp; fAppVersion &amp;lt; 5.0&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; isMinNS4 = isMinNS4_5 = isMinNS4_7 = isMinNS4_8 = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (isNS4) {&lt;br/&gt;    isMinNS4 &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    isMinNS4_5 &lt;/span&gt;= fAppVersion &amp;gt;= 4.5&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    isMinNS4_7 &lt;/span&gt;= fAppVersion &amp;gt;= 4.7&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    isMinNS4_8 &lt;/span&gt;= fAppVersion &amp;gt;= 4.8&lt;span style="color: #000000;"&gt;;&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; isWin = (navigator.platform == "Win32") || (navigator.platform == "Windows"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; isMac = (navigator.platform == "Mac68K") || (navigator.platform == "MacPPC"&lt;span style="color: #000000;"&gt;)&lt;br/&gt;            &lt;/span&gt;|| (navigator.platform == "Macintosh"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; isUnix = (navigator.platform == "X11") &amp;amp;&amp;amp; !isWin &amp;amp;&amp;amp; !&lt;span style="color: #000000;"&gt;isMac;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; isWin95 = isWin98 = isWinNT4 = isWin2K = isWinME = isWinXP = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; isMac68K = isMacPPC = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; isSunOS = isMinSunOS4 = isMinSunOS5 = isMinSunOS5_5 = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (isWin) {&lt;br/&gt;    isWin95 &lt;/span&gt;= sUserAgent.indexOf("Win95") &amp;gt; -1&lt;br/&gt;              || sUserAgent.indexOf("Windows 95") &amp;gt; -1&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    isWin98 &lt;/span&gt;= sUserAgent.indexOf("Win98") &amp;gt; -1&lt;br/&gt;              || sUserAgent.indexOf("Windows 98") &amp;gt; -1&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    isWinME &lt;/span&gt;= sUserAgent.indexOf("Win 9x 4.90") &amp;gt; -1&lt;br/&gt;              || sUserAgent.indexOf("Windows ME") &amp;gt; -1&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    isWin2K &lt;/span&gt;= sUserAgent.indexOf("Windows NT 5.0") &amp;gt; -1&lt;br/&gt;              || sUserAgent.indexOf("Windows 2000") &amp;gt; -1&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    isWinXP &lt;/span&gt;= sUserAgent.indexOf("Windows NT 5.1") &amp;gt; -1&lt;br/&gt;              || sUserAgent.indexOf("Windows XP") &amp;gt; -1&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    isWinNT4 &lt;/span&gt;= sUserAgent.indexOf("WinNT") &amp;gt; -1&lt;br/&gt;              || sUserAgent.indexOf("Windows NT") &amp;gt; -1&lt;br/&gt;              || sUserAgent.indexOf("WinNT4.0") &amp;gt; -1&lt;br/&gt;              || sUserAgent.indexOf("Windows NT 4.0") &amp;gt; -1&lt;br/&gt;              &amp;amp;&amp;amp; (!isWinME &amp;amp;&amp;amp; !isWin2K &amp;amp;&amp;amp; !&lt;span style="color: #000000;"&gt;isWinXP);&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (isMac) {&lt;br/&gt;    isMac68K &lt;/span&gt;= sUserAgent.indexOf("Mac_68000") &amp;gt; -1&lt;br/&gt;               || sUserAgent.indexOf("68K") &amp;gt; -1&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    isMacPPC &lt;/span&gt;= sUserAgent.indexOf("Mac_PowerPC") &amp;gt; -1&lt;br/&gt;               || sUserAgent.indexOf("PPC") &amp;gt; -1&lt;span style="color: #000000;"&gt;; &lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (isUnix) {&lt;br/&gt;    isSunOS &lt;/span&gt;= sUserAgent.indexOf("SunOS") &amp;gt; -1&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (isSunOS) {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; reSunOS = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; RegExp("SunOS (//d+//.//d+(?://.//d+)?)"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        reSunOS.test(sUserAgent);&lt;br/&gt;        isMinSunOS4 &lt;/span&gt;= compareVersions(RegExp["$1"], "4.0") &amp;gt;= 0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        isMinSunOS5 &lt;/span&gt;= compareVersions(RegExp["$1"], "5.0") &amp;gt;= 0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        isMinSunOS5_5 &lt;/span&gt;= compareVersions(RegExp["$1"], "5.5") &amp;gt;= 0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/artwl/aggbug/2452713.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/artwl/archive/2012/04/16/2452713.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/artwl/archive/2012/04/15/2450624.html</id><title type="text">Levenshtein算法的JavaScript实现</title><summary type="text">Levenshtein算法Levenshtein算法定义及算法原理见这篇文章：一个快速、高效的Levenshtein算法实现JavaScript实现function levenshteinDistance(s,t){ if(s.length&gt;t.length){ var temp=s; s=t; t=temp; delete temp; } var n=s.length; var m=t.length; if(m==0){ return n; } else if(n==0){ ...</summary><published>2012-04-15T12:58:00Z</published><updated>2012-04-15T12:58:00Z</updated><author><name>artwl</name><uri>http://www.cnblogs.com/artwl/</uri></author><link rel="alternate" href="http://www.cnblogs.com/artwl/archive/2012/04/15/2450624.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/artwl/archive/2012/04/15/2450624.html"/><content type="html">&lt;p&gt;&lt;strong&gt;Levenshtein算法&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Levenshtein算法定义及算法原理见这篇文章：&lt;a id="cb_post_title_url" class="postTitle2" href="http://www.cnblogs.com/ymind/archive/2012/03/27/fast-memory-efficient-Levenshtein-algorithm.html"&gt;一个快速、高效的Levenshtein算法实现&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;JavaScript实现&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; levenshteinDistance(s,t){&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(s.length&amp;gt;&lt;span style="color: #000000;"&gt;t.length){&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; temp=&lt;span style="color: #000000;"&gt;s;&lt;br/&gt;        s&lt;/span&gt;=&lt;span style="color: #000000;"&gt;t;&lt;br/&gt;        t&lt;/span&gt;=&lt;span style="color: #000000;"&gt;temp;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;delete&lt;/span&gt;&lt;span style="color: #000000;"&gt; temp;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; n=&lt;span style="color: #000000;"&gt;s.length;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; m=&lt;span style="color: #000000;"&gt;t.length;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(m==0&lt;span style="color: #000000;"&gt;){&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; n;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(n==0&lt;span style="color: #000000;"&gt;){&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; m;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; v0=&lt;span style="color: #000000;"&gt;[];&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; i=0;i&amp;lt;=m;i++&lt;span style="color: #000000;"&gt;){&lt;br/&gt;        v0[i]&lt;/span&gt;=&lt;span style="color: #000000;"&gt;i;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; v1=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Array(n+1&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; cost=0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; i=1;i&amp;lt;=n;i++&lt;span style="color: #000000;"&gt;){&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(i&amp;gt;1&lt;span style="color: #000000;"&gt;){&lt;br/&gt;            v0&lt;/span&gt;=v1.slice(0&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        }&lt;br/&gt;        v1[&lt;/span&gt;0]=&lt;span style="color: #000000;"&gt;i;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; j=1;j&amp;lt;=m;j++&lt;span style="color: #000000;"&gt;){&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(s[i-1].toLowerCase()==t[j-1&lt;span style="color: #000000;"&gt;].toLowerCase()){&lt;br/&gt;                cost&lt;/span&gt;=0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br/&gt;                cost&lt;/span&gt;=1&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            }&lt;br/&gt;            v1[j]&lt;/span&gt;=Math.min.call(&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;,v1[j-1]+1,v0[j]+1,v0[j-1]+&lt;span style="color: #000000;"&gt;cost);&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; v1.pop();&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Test&lt;/span&gt;&lt;br/&gt;levenshteinDistance("gUMBO","GAMBOL");&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;output 2&lt;/span&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/artwl/aggbug/2450624.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/artwl/archive/2012/04/15/2450624.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/artwl/archive/2012/04/15/2449009.html</id><title type="text">递归求嵌套数组中最大值</title><summary type="text">今早在https://attachments.me/hirehack/public/computer.html做题，有一题是递归求嵌套数组中最大值:/*This challenge requires that, given as input an array which may contain: - integer values. - inner-arrays of integer values. - any recursive combination thereof. Return the largest value contained in the array or any of its </summary><published>2012-04-15T02:30:00Z</published><updated>2012-04-15T02:30:00Z</updated><author><name>artwl</name><uri>http://www.cnblogs.com/artwl/</uri></author><link rel="alternate" href="http://www.cnblogs.com/artwl/archive/2012/04/15/2449009.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/artwl/archive/2012/04/15/2449009.html"/><content type="html">&lt;p&gt;今早在&amp;nbsp;&lt;a href="https://attachments.me/hirehack/public/computer.html"&gt;https://attachments.me/hirehack/public/computer.html&lt;/a&gt;&amp;nbsp;做题，有一题是&amp;nbsp;递归求嵌套数组中最大值:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br/&gt;This challenge requires that, given as input an array which may contain:&lt;br/&gt; - integer values.&lt;br/&gt; - inner-arrays of integer values.&lt;br/&gt; - any recursive combination thereof.&lt;br/&gt; Return the largest value contained in the array or any of its sub-arrays.&lt;br/&gt;&lt;br/&gt;Input: [1, [2, [3, 4]], [5, [6, 7]]]&lt;br/&gt;&lt;br/&gt;Output: 7&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;p&gt;分享一下我的代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; recursiveMax(input){&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; nums=&lt;span style="color: #000000;"&gt;[];&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; i=0;i&amp;lt;input.length;i++&lt;span style="color: #000000;"&gt;){&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; obj=&lt;span style="color: #000000;"&gt;input[i];&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(obj &lt;span style="color: #0000ff;"&gt;instanceof&lt;/span&gt;&lt;span style="color: #000000;"&gt; Array){&lt;br/&gt;            nums.push(recursiveMax(obj));&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br/&gt;            nums.push(obj);&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; Math.max.apply(&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;,nums);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Test&lt;/span&gt;&lt;br/&gt;recursiveMax([1,[[2,3],4,5,6,7],8,9,10]);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;output 10&lt;/span&gt;&lt;/div&gt;&lt;p&gt;欢迎交流。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/artwl/aggbug/2449009.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/artwl/archive/2012/04/15/2449009.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/artwl/archive/2012/04/14/2446762.html</id><title type="text">《JavaScript高级程序设计》阅读笔记（十五）：浏览器中的JavaScript</title><summary type="text">Window对象窗口操作 Window对象对操作浏览器窗口非常有用，开发者可以移动或调整浏览器窗口的大小。可用四种方法实现这些操作： moveBy(dx,dy)：把浏览器窗口相对当前位置水平移动dx个像素，垂直移动dy个像素。dx值为负左移，dy为负上移。 moveTo(x,y)：移动浏览器窗口，使它的左上角位于用户屏幕的(x,y)处。可以使用负数，不过这样会把部分窗口移出屏幕的可视区域。 resizeBy(dw,dh)：相对浏览器窗口当前大小，把窗口的宽度调整dw个像素，高度调整dy个像素。dw、dy为负时缩小窗口。 resizeTo(w,h)：把窗口的宽度调整为w，高度调整为h，...</summary><published>2012-04-14T04:51:00Z</published><updated>2012-04-14T04:51:00Z</updated><author><name>artwl</name><uri>http://www.cnblogs.com/artwl/</uri></author><link rel="alternate" href="http://www.cnblogs.com/artwl/archive/2012/04/14/2446762.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/artwl/archive/2012/04/14/2446762.html"/><content type="html">&lt;p&gt;&lt;strong&gt;Window对象&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;窗口操作&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Window对象对操作浏览器窗口非常有用，开发者可以移动或调整浏览器窗口的大小。可用四种方法实现这些操作：&lt;/p&gt;&lt;p&gt;moveBy(dx,dy)：把浏览器窗口相对当前位置水平移动dx个像素，垂直移动dy个像素。dx值为负左移，dy为负上移。&lt;/p&gt;&lt;p&gt;moveTo(x,y)：移动浏览器窗口，使它的左上角位于用户屏幕的(x,y)处。可以使用负数，不过这样会把部分窗口移出屏幕的可视区域。&lt;/p&gt;&lt;p&gt;resizeBy(dw,dh)：相对浏览器窗口当前大小，把窗口的宽度调整dw个像素，高度调整dy个像素。dw、dy为负时缩小窗口。&lt;/p&gt;&lt;p&gt;resizeTo(w,h)：把窗口的宽度调整为w，高度调整为h，不能使用负数。&lt;/p&gt;&lt;p&gt;注，FireFox跟Chrome默认不允许进行此操作，要在安全设置里更改&lt;/p&gt;&lt;p&gt;效果(在IE浏览器中有效果)：&lt;/p&gt;&lt;p&gt;&lt;iframe style="width: 100%; height: 100px;" src="http://jscode.chinacxy.com/code/a75cd3fa4c26957b970347ffc386be2d.aspx" frameborder="0" width="320" height="240"&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;导航和打开新窗口&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;导航和打开新窗口用 window.open() 方法，该方法接受四个参数，即要载入新窗口的页面的URL，新窗口名字，特性字符串和说明是否用新载入的页面替换当前载入的页面的Boolean值。一般只用前三个参数，最后一个参数只有在window.open()打不开新窗口时才有效。&lt;/p&gt;&lt;p&gt;第三个参数可选值如下：&lt;/p&gt;&lt;p&gt;top=pixels窗口的 y 坐标。&lt;/p&gt;&lt;table class="dataintable"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;left=pixels&lt;/td&gt;&lt;td&gt;窗口的 x 坐标。以像素计。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;height=pixels&lt;/td&gt;&lt;td&gt;窗口文档显示区的高度。以像素计。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;width=pixels&lt;/td&gt;&lt;td&gt;窗口的文档显示区的宽度。以像素计。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;resizable=yes|no&lt;/td&gt;&lt;td&gt;窗口是否可调节尺寸。默认是 yes。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;scrollable=yes|no&lt;/td&gt;&lt;td&gt;是否显示滚动条。默认是 yes。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;location=yes|no&lt;/td&gt;&lt;td&gt;是否显示地址字段。默认是 yes。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;status=yes|no&lt;/td&gt;&lt;td&gt;是否添加状态栏。默认是 yes。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;toolbar=yes|no&lt;/td&gt;&lt;td&gt;是否显示浏览器的工具栏。默认是 yes。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;特性字符串是以逗号分隔的，所以在逗号或等号后不能有空格。&lt;/p&gt;&lt;p&gt;示例：&lt;/p&gt;&lt;p&gt;&lt;iframe style="width: 100%; height: 100px;" src="http://jscode.chinacxy.com/code/f508b0629af20251ad3d5271dddae91a.aspx" frameborder="0" width="320" height="240"&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;document对象&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;用document的open、write、close等方法可以向新打开的窗口中写入内容，如下所示：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/javascript"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; run(){&lt;br/&gt;        &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; oNewWin&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;window.open(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;about:blank&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;,&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;newwindow&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;,&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;height=300,width=400&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;);&lt;br/&gt;        oNewWin.document.open();&lt;br/&gt;        oNewWin.document.write(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;script&amp;gt;function test(){alert('test');}&amp;lt;/scr&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;+&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;ipt&amp;gt;&amp;lt;input type='button' value='test' onclick='test()'/&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;);&lt;br/&gt;        oNewWin.document.close();&lt;br/&gt;    }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;input &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;='button' &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;='run' &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;onclick&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;='run()'&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;script type="text/javascript"&gt;// &lt;![CDATA[function run(){var oNewWin=window.open("about:blank","newwindow","height=300,width=400");oNewWin.document.open();oNewWin.document.write("&lt;html&gt;&lt;body&gt;&lt;script&gt;function test(){alert('test');}&lt;/scr"+"ipt&gt;&lt;input type='button' value='test' onclick='test()'/&gt;&lt;/body&gt;&lt;/html&gt;");oNewWin.document.close();}// ]]&gt;&lt;/script&gt;&lt;p&gt;&lt;input onclick="run()" type="button" value="run" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;location对象&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;location对象可以用来解析URL，例如 URL为：http://www.cnblogs.com/artwl/archive/2012/04/14/2446762.html#top?id=1，则:&lt;/p&gt;&lt;p&gt;hash:#top&lt;/p&gt;&lt;p&gt;host:www.cnblogs.com&lt;/p&gt;&lt;p&gt;hostname:www.cnblogs.com&lt;/p&gt;&lt;p&gt;href:http://www.cnblogs.com/artwl/archive/2012/04/14/2446762.html#top?id=1&lt;/p&gt;&lt;p&gt;pathname:/artwl/archive/2012/04/14/2446762.html&lt;/p&gt;&lt;p&gt;port:空白&lt;/p&gt;&lt;p&gt;protocol:http:&lt;/p&gt;&lt;p&gt;search:?id=1&lt;/p&gt;&lt;img src="http://www.cnblogs.com/artwl/aggbug/2446762.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/artwl/archive/2012/04/14/2446762.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/artwl/archive/2012/04/12/2443574.html</id><title type="text">[译]扩展JavaScript功能的正确方法</title><summary type="text">早上看到《JavaScript 每周导读》【第三期】一文，里面发现一篇文章(Extending JavaScript – The Right Way)，觉得还不错，翻译过来跟大家共享，本文并不是逐字逐句进行翻译，尽量说得通俗易懂。 原文地址：Extending JavaScript – The Right Way以下是译文 JavaScript已经内置了很多强大的方法，但有时你需要的某个功能在内置的方法中没有，我们怎么来优雅地扩展JavaScript功能呢。 例如我们想增加一个capitalize()方法来实现首字母大写，通常我们这样写：if(!String.prototype.ca...</summary><published>2012-04-12T03:01:00Z</published><updated>2012-04-12T03:01:00Z</updated><author><name>artwl</name><uri>http://www.cnblogs.com/artwl/</uri></author><link rel="alternate" href="http://www.cnblogs.com/artwl/archive/2012/04/12/2443574.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/artwl/archive/2012/04/12/2443574.html"/><content type="html">&lt;p&gt;早上看到&lt;a id="cb_post_title_url" class="postTitle2" href="http://www.cnblogs.com/lhb25/archive/2012/04/12/javascript-weekly-c.html"&gt;《JavaScript 每周导读》【第三期】&lt;/a&gt;一文，里面发现一篇文章(&lt;a href="http://www.websanova.com/tutorials/javascript/extending-javascript-the-right-way"&gt;Extending JavaScript &amp;ndash; The Right Way&lt;/a&gt;)，觉得还不错，翻译过来跟大家共享，本文并不是逐字逐句进行翻译，尽量说得通俗易懂。&lt;/p&gt;&lt;p&gt;原文地址：&lt;a href="http://www.websanova.com/tutorials/javascript/extending-javascript-the-right-way"&gt;Extending JavaScript &amp;ndash; The Right Way&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;以下是译文&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;JavaScript已经内置了很多强大的方法，但有时你需要的某个功能在内置的方法中没有，我们怎么来优雅地扩展JavaScript功能呢。&lt;/p&gt;&lt;p&gt;例如我们想增加一个capitalize()方法来实现首字母大写，通常我们这样写：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!&lt;span style="color: #000000;"&gt;String.prototype.capitalize)&lt;br/&gt;{&lt;br/&gt;    String.prototype.capitalize &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;()&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.slice(0,1).toUpperCase() + &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.slice(1&lt;span style="color: #000000;"&gt;).toLowerCase();&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;上面的代码可以正常使用，但如果在某个地方有下面的代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; strings = "yay"&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; strings) console.log(i + ":" + strings[i]);&lt;/div&gt;&lt;p&gt;我们得到的结果是这样的：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;0&lt;span style="color: #000000;"&gt;: y&lt;br/&gt;&lt;/span&gt;1&lt;span style="color: #000000;"&gt;: a&lt;br/&gt;&lt;/span&gt;2&lt;span style="color: #000000;"&gt;: y&lt;br/&gt;capitalize: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; () { &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.slice(0, 1).toUpperCase() + &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.slice(1).toLowerCase(); }&lt;/div&gt;&lt;p&gt;这显然不是我们想要的结果，输出了我们增加的方法的原因是我们增加的方法的&lt;span&gt;enumerable属性默认为true。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;我们可以通过简单地把枚举属性(enumerable)设置为false避免这个问题，使用defineProperty方法进行功能的扩展：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!&lt;span style="color: #000000;"&gt;String.prototype.capitalize)&lt;br/&gt;{&lt;br/&gt;    Object.defineProperty(String.prototype, &lt;/span&gt;'capitalize'&lt;span style="color: #000000;"&gt;,&lt;br/&gt;    {&lt;br/&gt;       value: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;()&lt;br/&gt;       {&lt;br/&gt;           &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.slice(0,1).toUpperCase() + &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.slice(1&lt;span style="color: #000000;"&gt;).toLowerCase();&lt;br/&gt;       },&lt;br/&gt;       enumerable: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    });&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;现在我们再运行这段代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; strings = "yay"&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; strings) console.log(i + ":" + strings[i]);&lt;/div&gt;&lt;p&gt;我们得到的结果是：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;0&lt;span style="color: #000000;"&gt;: y&lt;br/&gt;&lt;/span&gt;1&lt;span style="color: #000000;"&gt;: a&lt;br/&gt;&lt;/span&gt;2: y&lt;/div&gt;&lt;p&gt;要注意的是，用循环没有输出的并不代表不存在，我们可以通过下面的代码查看到定义：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; strings = "yay"&lt;span style="color: #000000;"&gt;;&lt;br/&gt;console.log(strings.capitalize)&lt;/span&gt;&lt;/div&gt;&lt;p&gt;会输出：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; () { &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.slice(0, 1).toUpperCase() + &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.slice(1).toLowerCase(); }&lt;/div&gt;&lt;p&gt;&lt;span title="The reason for this may not seem as obvious when we're looking at strings, but it gives us a lot of flexibility should we need it."&gt;用这种方式扩展JavaScript功能比较灵活，我们可以用这种方式&lt;/span&gt;&lt;span title="It can come in really handy when defining our own objects and setting some default values that we would want to expose."&gt;来定义我们自己的对象，并设置一些默认值。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span title="It can come in really handy when defining our own objects and setting some default values that we would want to expose."&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span title="It can come in really handy when defining our own objects and setting some default values that we would want to expose."&gt;&lt;span&gt;以下是另外几个扩展方法，你可以在自己的项目中使用：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span title="It can come in really handy when defining our own objects and setting some default values that we would want to expose."&gt;&lt;strong&gt;String.pxToInt()&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span title="It can come in really handy when defining our own objects and setting some default values that we would want to expose."&gt;&lt;span&gt;&lt;span&gt;把"200px"这样的字符串转换为数字 200 :&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!&lt;span style="color: #000000;"&gt;String.prototype.pxToInt)&lt;br/&gt;{&lt;br/&gt;    Object.defineProperty(String.prototype, &lt;/span&gt;'pxToInt'&lt;span style="color: #000000;"&gt;,&lt;br/&gt;    {&lt;br/&gt;        value: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;()&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; parseInt(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.split('px')[0&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;        },&lt;br/&gt;        enumerable: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    });&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;strong&gt;String.isHex()&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span title="It can come in really handy when defining our own objects and setting some default values that we would want to expose."&gt;&lt;span&gt;&lt;span&gt;判断一个字符串是否是16进制表示的，如"#CCC" 或 "#CACACA"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!&lt;span style="color: #000000;"&gt;String.prototype.isHex)&lt;br/&gt;{&lt;br/&gt;    Object.defineProperty(String.prototype, &lt;/span&gt;'isHex'&lt;span style="color: #000000;"&gt;,&lt;br/&gt;    {&lt;br/&gt;        value: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;()&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.substring(0,1) == '#' &amp;amp;&amp;amp;&lt;span style="color: #000000;"&gt;  &lt;br/&gt;                   (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.length == 4 || &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.length == 7) &amp;amp;&amp;amp; &lt;br/&gt;                   /^[0-9a-fA-F]+$/.test(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.slice(1&lt;span style="color: #000000;"&gt;));&lt;br/&gt;        },&lt;br/&gt;        enumerable: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    });&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;strong&gt;String.reverse()&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span title="It can come in really handy when defining our own objects and setting some default values that we would want to expose."&gt;&lt;span&gt;&lt;span&gt;字符串反转：&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!&lt;span style="color: #000000;"&gt;String.prototype.reverse)&lt;br/&gt;{&lt;br/&gt;    Object.defineProperty(String.prototype, &lt;/span&gt;'reverse'&lt;span style="color: #000000;"&gt;,&lt;br/&gt;    {&lt;br/&gt;        value: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;()&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.split( '' ).reverse().join( ''&lt;span style="color: #000000;"&gt; );&lt;br/&gt;        },&lt;br/&gt;        enumerable: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    });&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;strong&gt;String.wordCount()&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span title="It can come in really handy when defining our own objects and setting some default values that we would want to expose."&gt;&lt;span&gt;&lt;span&gt;统计单词数量，用空格分开&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!&lt;span style="color: #000000;"&gt;String.prototype.wordCount)&lt;br/&gt;{&lt;br/&gt;    Object.defineProperty(String.prototype, &lt;/span&gt;'wordCount'&lt;span style="color: #000000;"&gt;,&lt;br/&gt;    {&lt;br/&gt;        value: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;()&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.split(' '&lt;span style="color: #000000;"&gt;).length;&lt;br/&gt;        },&lt;br/&gt;        enumerable: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    });&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;strong&gt;String.htmlEntities()&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span title="It can come in really handy when defining our own objects and setting some default values that we would want to expose."&gt;&lt;span&gt;&lt;span&gt;html标签如&amp;lt;和&amp;gt;编码为特殊字符&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!&lt;span style="color: #000000;"&gt;String.prototype.htmlEntities)&lt;br/&gt;{&lt;br/&gt;    Object.defineProperty(String.prototype, &lt;/span&gt;'htmlEntities'&lt;span style="color: #000000;"&gt;,&lt;br/&gt;    {&lt;br/&gt;        value: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;()&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; String(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;).replace(/&amp;amp;/g, '&amp;amp;').replace(&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;g, '&amp;gt;').replace(/"/g, '"');&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;        },&lt;br/&gt;        enumerable: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    });&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;strong&gt;String.stripTags()&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span title="It can come in really handy when defining our own objects and setting some default values that we would want to expose."&gt;&lt;span&gt;&lt;span&gt;去掉HTML标签：&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!&lt;span style="color: #000000;"&gt;String.prototype.stripTags)&lt;br/&gt;{&lt;br/&gt;    Object.defineProperty(String.prototype, &lt;/span&gt;'stripTags'&lt;span style="color: #000000;"&gt;,&lt;br/&gt;    {&lt;br/&gt;        value: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;()&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.replace(/&amp;lt;\/?[^&amp;gt;]+&amp;gt;/gi, ''&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        },&lt;br/&gt;        enumerable: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    });&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;strong&gt;String.trim()&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span title="It can come in really handy when defining our own objects and setting some default values that we would want to expose."&gt;&lt;span&gt;&lt;span&gt;去掉首尾空格：&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!&lt;span style="color: #000000;"&gt;String.prototype.trim)&lt;br/&gt;{&lt;br/&gt;    Object.defineProperty(String.prototype, &lt;/span&gt;'trim'&lt;span style="color: #000000;"&gt;,&lt;br/&gt;    {&lt;br/&gt;        value: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;()&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.replace(/^\s*/, "").replace(/\s*$/, ""&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        },&lt;br/&gt;        enumerable: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    });&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;strong&gt;String.stripNonAlpha()&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span title="It can come in really handy when defining our own objects and setting some default values that we would want to expose."&gt;&lt;span&gt;&lt;span&gt;去掉非字母字符：&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!&lt;span style="color: #000000;"&gt;String.prototype.stripNonAlpha)&lt;br/&gt;{&lt;br/&gt;    Object.defineProperty(String.prototype, &lt;/span&gt;'stripNonAlpha'&lt;span style="color: #000000;"&gt;,&lt;br/&gt;    {&lt;br/&gt;        value: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;()&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.replace(/[^A-Za-z ]+/g, ""&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        },&lt;br/&gt;        enumerable: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    });&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;strong&gt;Object.sizeof()&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span title="It can come in really handy when defining our own objects and setting some default values that we would want to expose."&gt;&lt;span&gt;&lt;span&gt;统计对象的大小，如&lt;span&gt;{one: &amp;ldquo;and&amp;rdquo;, two: &amp;ldquo;and&amp;rdquo;}为2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!&lt;span style="color: #000000;"&gt;Object.prototype.sizeof)&lt;br/&gt;{&lt;br/&gt;    Object.defineProperty(Object.prototype, &lt;/span&gt;'sizeof'&lt;span style="color: #000000;"&gt;,&lt;br/&gt;    {&lt;br/&gt;        value: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;()&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; counter = 0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(index &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;) counter++&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; counter;&lt;br/&gt;        },&lt;br/&gt;        enumerable: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    });&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;PS&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这种方式扩展JS原生对象的功能还是挺不错的，但除非必要(项目中用的很多)，不建议直接在原生对象上扩展功能，会造成&lt;span&gt;全局变量污染。&lt;/span&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;另外，文中的pxToInt()方法是没什么必要的，JS中的parseInt()可以直接完成这样的功能：parsetInt("200px")===200&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;htmlEntities方法貌似有问题，下面另提供一个：&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!&lt;span style="color: #000000;"&gt;String.prototype.htmlEntities)&lt;br/&gt;{&lt;br/&gt;    Object.defineProperty(String.prototype, &lt;/span&gt;'htmlEntities'&lt;span style="color: #000000;"&gt;,&lt;br/&gt;    {&lt;br/&gt;        value: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;()&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; div = document.createElement("div"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(div.textContent){&lt;br/&gt;                div.textContent&lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br/&gt;                div.innerText&lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; div.innerHTML;&lt;br/&gt;        },&lt;br/&gt;        enumerable: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    });&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/artwl/aggbug/2443574.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/artwl/archive/2012/04/12/2443574.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/artwl/archive/2012/04/09/2439049.html</id><title type="text">JavaScript单元测试ABC</title><summary type="text">前言 当前,在软件开发中单元测试越来越受到开发者的重视,它能提高软件的开发效率,而且能保障开发的质量。以往，单元测试往往多见于服务端的开发中，但随着Web编程领域的分工逐渐明细，在前端Javascript开发领域中，也可以进行相关的单元测试，以保障前端开发的质量。 在服务器端的单元测试中，都有各种各样的测试框架，在JavaScript中现在也有一些很优秀的框架，但在本文中，我们将自己动手一步步来实现一个简单的单元测试框架。 JS单元测试有很多方面，比较多的是对方法功能检查，对浏览器兼容性检查，本文主要谈第一种。 本文检查的JS代码是我以前写的一个JS日期格式化的方法，原文在这里(jav...</summary><published>2012-04-09T07:41:00Z</published><updated>2012-04-09T07:41:00Z</updated><author><name>artwl</name><uri>http://www.cnblogs.com/artwl/</uri></author><link rel="alternate" href="http://www.cnblogs.com/artwl/archive/2012/04/09/2439049.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/artwl/archive/2012/04/09/2439049.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;span&gt;前言&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;当前,在软件开发中单元测试越来越受到开发者的重视,它能提高软件的开发效率,而且能保障开发的质量。以往，单元测试往往多见于服务端的开发中，但随着Web编程领域的分工逐渐明细，在前端Javascript开发领域中，也可以进行相关的单元测试，以保障前端开发的质量。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;在服务器端的单元测试中，都有各种各样的测试框架，在JavaScript中现在也有一些很优秀的框架，但在本文中，我们将自己动手一步步来实现一个简单的单元测试框架。&lt;/p&gt;&lt;p&gt;&lt;span&gt;JS单元测试有很多方面，比较多的是对方法功能检查，对浏览器兼容性检查，本文主要谈第一种。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;本文检查的JS代码是我以前写的一个JS日期格式化的方法，原文在这里(&lt;/span&gt;&lt;a id="cb_post_title_url" class="postTitle2" href="http://www.cnblogs.com/artwl/archive/2011/12/29/2305853.html"&gt;javascript日期格式化函数，跟C#中的使用方法类似&lt;/a&gt;)，代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Date.prototype.toString=&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(format){&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; time=&lt;span style="color: #000000;"&gt;{};&lt;br/&gt;    time.Year&lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.getFullYear();&lt;br/&gt;    time.TYear&lt;/span&gt;=(""+time.Year).substr(2&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    time.Month&lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.getMonth()+1&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    time.TMonth&lt;/span&gt;=time.Month&amp;lt;10?"0"+&lt;span style="color: #000000;"&gt;time.Month:time.Month;&lt;br/&gt;    time.Day&lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.getDate();&lt;br/&gt;    time.TDay&lt;/span&gt;=time.Day&amp;lt;10?"0"+&lt;span style="color: #000000;"&gt;time.Day:time.Day;&lt;br/&gt;    time.Hour&lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.getHours();&lt;br/&gt;    time.THour&lt;/span&gt;=time.Hour&amp;lt;10?"0"+&lt;span style="color: #000000;"&gt;time.Hour:time.Hour;&lt;br/&gt;    time.hour&lt;/span&gt;=time.Hour&amp;lt;13?time.Hour:time.Hour-12&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    time.Thour&lt;/span&gt;=time.hour&amp;lt;10?"0"+&lt;span style="color: #000000;"&gt;time.hour:time.hour;&lt;br/&gt;    time.Minute&lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.getMinutes();&lt;br/&gt;    time.TMinute&lt;/span&gt;=time.Minute&amp;lt;10?"0"+&lt;span style="color: #000000;"&gt;time.Minute:time.Minute;&lt;br/&gt;    time.Second&lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.getSeconds();&lt;br/&gt;    time.TSecond&lt;/span&gt;=time.Second&amp;lt;10?"0"+&lt;span style="color: #000000;"&gt;time.Second:time.Second;&lt;br/&gt;    time.Millisecond&lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.getMilliseconds();&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; oNumber=time.Millisecond/1000;&lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(format!=undefined &amp;amp;&amp;amp; format.replace(/\s/g,"").length&amp;gt;0&lt;span style="color: #000000;"&gt;){&lt;br/&gt;        format&lt;/span&gt;=&lt;span style="color: #000000;"&gt;format&lt;br/&gt;            .replace(&lt;/span&gt;/yyyy/&lt;span style="color: #000000;"&gt;ig,time.Year)&lt;br/&gt;            .replace(&lt;/span&gt;/yyy/&lt;span style="color: #000000;"&gt;ig,time.Year)&lt;br/&gt;            .replace(&lt;/span&gt;/yy/&lt;span style="color: #000000;"&gt;ig,time.TYear)&lt;br/&gt;            .replace(&lt;/span&gt;/y/&lt;span style="color: #000000;"&gt;ig,time.TYear)&lt;br/&gt;            .replace(&lt;/span&gt;/MM/&lt;span style="color: #000000;"&gt;g,time.TMonth)&lt;br/&gt;            .replace(&lt;/span&gt;/M/&lt;span style="color: #000000;"&gt;g,time.Month)&lt;br/&gt;            .replace(&lt;/span&gt;/dd/&lt;span style="color: #000000;"&gt;ig,time.TDay)&lt;br/&gt;            .replace(&lt;/span&gt;/d/&lt;span style="color: #000000;"&gt;ig,time.Day)&lt;br/&gt;            .replace(&lt;/span&gt;/HH/&lt;span style="color: #000000;"&gt;g,time.THour)&lt;br/&gt;            .replace(&lt;/span&gt;/H/&lt;span style="color: #000000;"&gt;g,time.Hour)&lt;br/&gt;            .replace(&lt;/span&gt;/hh/&lt;span style="color: #000000;"&gt;g,time.Thour)&lt;br/&gt;            .replace(&lt;/span&gt;/h/&lt;span style="color: #000000;"&gt;g,time.hour)&lt;br/&gt;            .replace(&lt;/span&gt;/mm/&lt;span style="color: #000000;"&gt;g,time.TMinute)&lt;br/&gt;            .replace(&lt;/span&gt;/m/&lt;span style="color: #000000;"&gt;g,time.Minute)&lt;br/&gt;            .replace(&lt;/span&gt;/ss/&lt;span style="color: #000000;"&gt;ig,time.TSecond)&lt;br/&gt;            .replace(&lt;/span&gt;/s/&lt;span style="color: #000000;"&gt;ig,time.Second)&lt;br/&gt;            .replace(&lt;/span&gt;/fff/&lt;span style="color: #000000;"&gt;ig,time.Millisecond)&lt;br/&gt;            .replace(&lt;/span&gt;/ff/ig,oNumber.toFixed(2)*100&lt;span style="color: #000000;"&gt;)&lt;br/&gt;            .replace(&lt;/span&gt;/f/ig,oNumber.toFixed(1)*10&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br/&gt;        format&lt;/span&gt;=time.Year+"-"+time.Month+"-"+time.Day+" "+time.Hour+":"+time.Minute+":"+&lt;span style="color: #000000;"&gt;time.Second;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; format;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;这段代码目前没有发现比较严重的bug，本文为了测试，我们把&amp;nbsp;&lt;/span&gt;&lt;span data-mce-=""&gt;.replace(&lt;/span&gt;/MM/&lt;span data-mce-=""&gt;g,time.TMonth) 改为&amp;nbsp;&lt;/span&gt;&lt;span data-mce-=""&gt;.replace(&lt;/span&gt;/MM/&lt;span data-mce-=""&gt;g,time.Month)，这个错误是当月份小于10时，没有用两位数表示月份。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;现在有这么一句话，好的设计都是重构出来的，在本文中也一样，我们从最简单的开始。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;第一版：用最原始的alert&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;作为第一版，我们很偷懒的直接用alert来检查，完整代码如下：&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br/&gt;&amp;lt;html&amp;gt;&lt;br/&gt;&amp;lt;head&amp;gt;&lt;br/&gt;    &amp;lt;title&amp;gt;Demo&amp;lt;/title&amp;gt;&lt;br/&gt;    &amp;lt;meta charset="utf-8"/&amp;gt;&lt;br/&gt;&amp;lt;/head&amp;gt;&lt;br/&gt;&amp;lt;body&amp;gt;&lt;br/&gt;    &amp;lt;script type="text/javascript"&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;        Date.prototype.toString&lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(format){&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; time=&lt;span style="color: #000000;"&gt;{};&lt;br/&gt;            time.Year&lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.getFullYear();&lt;br/&gt;            time.TYear&lt;/span&gt;=(""+time.Year).substr(2&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            time.Month&lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.getMonth()+1&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            time.TMonth&lt;/span&gt;=time.Month&amp;lt;10?"0"+&lt;span style="color: #000000;"&gt;time.Month:time.Month;&lt;br/&gt;            time.Day&lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.getDate();&lt;br/&gt;            time.TDay&lt;/span&gt;=time.Day&amp;lt;10?"0"+&lt;span style="color: #000000;"&gt;time.Day:time.Day;&lt;br/&gt;            time.Hour&lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.getHours();&lt;br/&gt;            time.THour&lt;/span&gt;=time.Hour&amp;lt;10?"0"+&lt;span style="color: #000000;"&gt;time.Hour:time.Hour;&lt;br/&gt;            time.hour&lt;/span&gt;=time.Hour&amp;lt;13?time.Hour:time.Hour-12&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            time.Thour&lt;/span&gt;=time.hour&amp;lt;10?"0"+&lt;span style="color: #000000;"&gt;time.hour:time.hour;&lt;br/&gt;            time.Minute&lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.getMinutes();&lt;br/&gt;            time.TMinute&lt;/span&gt;=time.Minute&amp;lt;10?"0"+&lt;span style="color: #000000;"&gt;time.Minute:time.Minute;&lt;br/&gt;            time.Second&lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.getSeconds();&lt;br/&gt;            time.TSecond&lt;/span&gt;=time.Second&amp;lt;10?"0"+&lt;span style="color: #000000;"&gt;time.Second:time.Second;&lt;br/&gt;            time.Millisecond&lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.getMilliseconds();&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; oNumber=time.Millisecond/1000;&lt;br/&gt;&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(format!=undefined &amp;amp;&amp;amp; format.replace(/\s/g,"").length&amp;gt;0&lt;span style="color: #000000;"&gt;){&lt;br/&gt;                format&lt;/span&gt;=&lt;span style="color: #000000;"&gt;format&lt;br/&gt;                    .replace(&lt;/span&gt;/yyyy/&lt;span style="color: #000000;"&gt;ig,time.Year)&lt;br/&gt;                    .replace(&lt;/span&gt;/yyy/&lt;span style="color: #000000;"&gt;ig,time.Year)&lt;br/&gt;                    .replace(&lt;/span&gt;/yy/&lt;span style="color: #000000;"&gt;ig,time.TYear)&lt;br/&gt;                    .replace(&lt;/span&gt;/y/&lt;span style="color: #000000;"&gt;ig,time.TYear)&lt;br/&gt;                    .replace(&lt;/span&gt;/MM/&lt;span style="color: #000000;"&gt;g,time.Month)&lt;br/&gt;                    .replace(&lt;/span&gt;/M/&lt;span style="color: #000000;"&gt;g,time.Month)&lt;br/&gt;                    .replace(&lt;/span&gt;/dd/&lt;span style="color: #000000;"&gt;ig,time.TDay)&lt;br/&gt;                    .replace(&lt;/span&gt;/d/&lt;span style="color: #000000;"&gt;ig,time.Day)&lt;br/&gt;                    .replace(&lt;/span&gt;/HH/&lt;span style="color: #000000;"&gt;g,time.THour)&lt;br/&gt;                    .replace(&lt;/span&gt;/H/&lt;span style="color: #000000;"&gt;g,time.Hour)&lt;br/&gt;                    .replace(&lt;/span&gt;/hh/&lt;span style="color: #000000;"&gt;g,time.Thour)&lt;br/&gt;                    .replace(&lt;/span&gt;/h/&lt;span style="color: #000000;"&gt;g,time.hour)&lt;br/&gt;                    .replace(&lt;/span&gt;/mm/&lt;span style="color: #000000;"&gt;g,time.TMinute)&lt;br/&gt;                    .replace(&lt;/span&gt;/m/&lt;span style="color: #000000;"&gt;g,time.Minute)&lt;br/&gt;                    .replace(&lt;/span&gt;/ss/&lt;span style="color: #000000;"&gt;ig,time.TSecond)&lt;br/&gt;                    .replace(&lt;/span&gt;/s/&lt;span style="color: #000000;"&gt;ig,time.Second)&lt;br/&gt;                    .replace(&lt;/span&gt;/fff/&lt;span style="color: #000000;"&gt;ig,time.Millisecond)&lt;br/&gt;                    .replace(&lt;/span&gt;/ff/ig,oNumber.toFixed(2)*100&lt;span style="color: #000000;"&gt;)&lt;br/&gt;                    .replace(&lt;/span&gt;/f/ig,oNumber.toFixed(1)*10&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br/&gt;                format&lt;/span&gt;=time.Year+"-"+time.Month+"-"+time.Day+" "+time.Hour+":"+time.Minute+":"+&lt;span style="color: #000000;"&gt;time.Second;&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; format;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; date=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Date(2012,3,9&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        alert(date.toString(&lt;/span&gt;"yyyy"&lt;span style="color: #000000;"&gt;));&lt;br/&gt;        alert(date.toString(&lt;/span&gt;"MM"&lt;span style="color: #000000;"&gt;));&lt;br/&gt;    &lt;/span&gt;&amp;lt;/script&amp;gt;&lt;br/&gt;&amp;lt;/body&amp;gt;&lt;br/&gt;&amp;lt;/html&amp;gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;运行后会弹出 2012 和 4 ，观察结果我们知道 date.toString("MM")方法是有问题的。&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;这种方式很不方便，最大的问题是它只弹出了结果，并没有给出正确或错误的信息，除非对代码非常熟悉，否则很难知道弹出的结果是正是误，下面，我们写一个断言(assert)方法来进行测试，明确给出是正是误的信息。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;第二版：用assert进行检查&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;断言是表达程序设计人员对于系统应该达到状态的一种预期，比如有一个方法用于把两个数字加起来，对于3+2，我们预期这个方法返回的结果是5，如果确实返回5那么就通过，否则给出错误提示。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;断言是单元测试的核心，在各种单元测试的框架中都提供了断言功能，这里我们写一个简单的断言(assert)方法：&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; assert(message,result){&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!&lt;span style="color: #000000;"&gt;result){&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Error(message);&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;这个方法接受两个参数，第一个是错误后的提示信息，第二个是断言结果&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;用断言测试代码如下：&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; date=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Date(2012,3,9&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br/&gt;    assert(&lt;/span&gt;"yyyy should return full year",date.toString("yyyy")==="2012"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;}&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt;(e){&lt;br/&gt;    alert(&lt;/span&gt;"Test failed:"+&lt;span style="color: #000000;"&gt;e.message);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br/&gt;    assert(&lt;/span&gt;"MM should return full month",date.toString("MM")==="04"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt;(e){&lt;br/&gt;    alert(&lt;/span&gt;"Test failed:"+&lt;span style="color: #000000;"&gt;e.message);&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;运行后会弹出如下窗口：&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/112805/2012040914215219.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第三版：进行批量测试&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在第二版中，assert方法可以给出明确的结果，但如果想进行一系列的测试，每个测试都要进行异常捕获，还是不够方便。另外，在一般的测试框架中都可以给出成功的个数，失败的个数，及失败的错误信息。&lt;/p&gt;&lt;p&gt;为了可以方便在看到测试结果，这里我们把结果用有颜色的文字显示的页面上，所以这里要写一个小的输出方法PrintMessage：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; PrintMessage(text,color){&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; div=document.createElement("div"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    div.innerHTML&lt;/span&gt;=&lt;span style="color: #000000;"&gt;text;&lt;br/&gt;    div.style.color&lt;/span&gt;=&lt;span style="color: #000000;"&gt;color;&lt;br/&gt;    document.body.appendChild(div);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;delete&lt;/span&gt;&lt;span style="color: #000000;"&gt; div;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;下面，我们就写一个类似&lt;strong&gt;jsTestDriver&lt;/strong&gt;中的TestCase方法，来进行批量测试：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; testCase(name,tests){&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; successCount=0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; testCount=0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; test &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; tests){&lt;br/&gt;        testCount&lt;/span&gt;++&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br/&gt;            tests[test]();&lt;br/&gt;            PrintMessage(test&lt;/span&gt;+" success","#080"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            successCount&lt;/span&gt;++&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt;(e){&lt;br/&gt;            PrintMessage(test&lt;/span&gt;+" failed:"+e.message,"#800"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;    PrintMessage(&lt;/span&gt;"Test result: "+testCount+" tests,"+successCount+" success, "+ (testCount-successCount)+" failures","#800"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;测试代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; date=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Date(2012,3,9&lt;span style="color: #000000;"&gt;);&lt;br/&gt;testCase(&lt;/span&gt;"date toString test"&lt;span style="color: #000000;"&gt;,{&lt;br/&gt;    &lt;/span&gt;yyyy:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){&lt;br/&gt;        assert(&lt;/span&gt;"yyyy should return 2012",date.toString("yyyy")==="2012"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    },&lt;br/&gt;    &lt;/span&gt;MM:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){&lt;br/&gt;        assert(&lt;/span&gt;"MM should return 04",date.toString("MM")==="04"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    },&lt;br/&gt;    &lt;/span&gt;dd:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){&lt;br/&gt;        assert(&lt;/span&gt;"dd should return 09",date.toString("dd")==="09"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    }&lt;br/&gt;});&lt;/span&gt;&lt;/div&gt;&lt;p&gt;结果为：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/112805/2012040915002525.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;这样我们一眼就可以看出哪个出错了。但这样是否就完美了呢，我们可以看到最后那个测试中 var date=new Date(2012,3,9)是放在testCase外面定义的，并且整个testCase的测试代码中共用了date，这里因为各个方法中没有对date的值进行修改，所以没出问题，如果某个测试方法中对date的值修改了呢，测试的结果就是不准确的，所以在很多测试框架中都提供了setUp和tearDown方法，用来对统一提供和销毁测试数据，下面我们就在我们的testCase中加上setUp和tearDown方法。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第四版：统一提供测试数据的批量测试&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;首先我们添加setUp和tearDown方法：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;testCase("date toString"&lt;span style="color: #000000;"&gt;,{&lt;br/&gt;    setUp:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.date=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Date(2012,3,9&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    },&lt;br/&gt;    tearDown:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;delete&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.date;&lt;br/&gt;    },&lt;br/&gt;    yyyy:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){&lt;br/&gt;        assert(&lt;/span&gt;"yyyy should return 2012",&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.date.toString("yyyy")==="2012"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    },&lt;br/&gt;    MM:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){&lt;br/&gt;        assert(&lt;/span&gt;"MM should return 04",&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.date.toString("MM")==="04"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    },&lt;br/&gt;    dd:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){&lt;br/&gt;        assert(&lt;/span&gt;"dd should return 09",&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.date.toString("dd")==="09"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    }&lt;br/&gt;});&lt;/span&gt;&lt;/div&gt;&lt;p&gt;由于setUp和tearDown方法不参与测试，所以我们要修改testCase代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; testCase(name,tests){&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; successCount=0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; testCount=0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; hasSetUp=&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt; tests.setUp == "function"&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; hasTearDown=&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt; tests.tearDown == "function"&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; test &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; tests){&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(test==="setUp"||test==="tearDown"&lt;span style="color: #000000;"&gt;){&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        }&lt;br/&gt;        testCount&lt;/span&gt;++&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(hasSetUp){&lt;br/&gt;                tests.setUp();&lt;br/&gt;            }&lt;br/&gt;            tests[test]();&lt;br/&gt;            PrintMessage(test&lt;/span&gt;+" success","#080"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(hasTearDown){&lt;br/&gt;                tests.tearDown();&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;            successCount&lt;/span&gt;++&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt;(e){&lt;br/&gt;            PrintMessage(test&lt;/span&gt;+" failed:"+e.message,"#800"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;    PrintMessage(&lt;/span&gt;"Test result: "+testCount+" tests,"+successCount+" success, "+ (testCount-successCount)+" failures","#800"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;运行后的结果跟第三版相同。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;小结及参考文章&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;上面说了，好的设计是不断重构的结果，上面的第四版是不是就完美了呢，远远没有达到，这里只是一个示例。如果大家需要这方面的知识，我后面可以再写写各个测试框架的使用。&lt;/p&gt;&lt;p&gt;本文只是JS单元测试入门级的示例，让初学者对JS的单元测试有个初步概念，属于抛砖引玉，欢迎各位高人拍砖补充。&lt;/p&gt;&lt;p&gt;本文参考了《测试驱动的JavaScript开发》(个人觉得还不错，推荐下)一书第一章，书中的测试用例也是一个时间函数，不过写的比较复杂，初学者不太容易看懂。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/artwl/aggbug/2439049.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/artwl/archive/2012/04/09/2439049.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
