<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>岁月如歌</title>
	<atom:link href="http://lifesinger.org/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://lifesinger.org/blog</link>
	<description>关注用户体验、前端开发，记录生活点滴、岁月足迹。</description>
	<lastBuildDate>Sun, 15 Nov 2009 13:08:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Closure Compiler vs. YUICompressor</title>
		<link>http://lifesinger.org/blog/2009/11/closure-compiler-vs-yuicompressor/</link>
		<comments>http://lifesinger.org/blog/2009/11/closure-compiler-vs-yuicompressor/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 03:41:03 +0000</pubDate>
		<dc:creator>lifesinger</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[closure]]></category>
		<category><![CDATA[compress]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[YUI]]></category>

		<guid isPermaLink="false">http://lifesinger.org/blog/?p=2273</guid>
		<description><![CDATA[Google Closure Compiler 挺让人心动。昨晚试用了一把，与 YUICompressor 的对比如下：

下载 DOS 脚本包：downloads list
]]></description>
			<content:encoded><![CDATA[<p>Google Closure Compiler 挺让人心动。昨晚试用了一把，与 YUICompressor 的对比如下：</p>
<div style="width:510px;text-align:left" id="__ss_2462617"><object style="margin:0px" width="510" height="415"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=closure-compiler-vs-yui-compressor-091109210742-phpapp02&#038;stripped_title=closure-compiler-vs-yuicompressor" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=closure-compiler-vs-yui-compressor-091109210742-phpapp02&#038;stripped_title=closure-compiler-vs-yuicompressor" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="505" height="415"></embed></object></div>
<p>下载 DOS 脚本包：<a href="http://code.google.com/p/lifesinger/downloads/list">downloads list</a></p>
]]></content:encoded>
			<wfw:commentRss>http://lifesinger.org/blog/2009/11/closure-compiler-vs-yuicompressor/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>给  JavaScript 文件传递参数的注意点</title>
		<link>http://lifesinger.org/blog/2009/11/the-trap-of-passing-params-to-javascript/</link>
		<comments>http://lifesinger.org/blog/2009/11/the-trap-of-passing-params-to-javascript/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 10:05:59 +0000</pubDate>
		<dc:creator>lifesinger</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[arguments]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://lifesinger.org/blog/?p=2268</guid>
		<description><![CDATA[在 如何给 JavaScript 文件传递参数 一文中，介绍了一种传参方式：

&#60;script type="text/javascript" src="test.js?a=b&#038;c=d"&#62;&#60;/script&#62;

这种方式看起来最漂亮最容易被后台程序员接受，但没有考虑到缓存因素。
由于参数一般都是变化的，上面的方式会导致 js 文件每次都重新下载，实在是很糟糕。
特发此文，警醒！
]]></description>
			<content:encoded><![CDATA[<p>在 <a href="http://lifesinger.org/blog/2009/03/how-to-pass-params-to-javascript-file/">如何给 JavaScript 文件传递参数</a> 一文中，介绍了一种传参方式：</p>
<pre>
&lt;script type="text/javascript" src="test.js?a=b&#038;c=d"&gt;&lt;/script&gt;
</pre>
<p>这种方式看起来最漂亮最容易被后台程序员接受，但没有考虑到缓存因素。<br />
<strong>由于参数一般都是变化的，上面的方式会导致 js 文件每次都重新下载</strong>，实在是很糟糕。</p>
<p>特发此文，警醒！</p>
]]></content:encoded>
			<wfw:commentRss>http://lifesinger.org/blog/2009/11/the-trap-of-passing-params-to-javascript/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>腾讯注册页面的 JS 解密</title>
		<link>http://lifesinger.org/blog/2009/11/tecent-signup-js-decode/</link>
		<comments>http://lifesinger.org/blog/2009/11/tecent-signup-js-decode/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 02:27:01 +0000</pubDate>
		<dc:creator>lifesinger</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[encode]]></category>
		<category><![CDATA[IDEA]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[qq]]></category>
		<category><![CDATA[tecent]]></category>

		<guid isPermaLink="false">http://lifesinger.org/blog/?p=2261</guid>
		<description><![CDATA[先访问：http://signup.qq.com/
然后下载：http://signup.qq.com/js/a.js
用 IntelliJ IDEA 格式化代码：

var naa = true;
O00O = new Array();
O00O[0] = ' f u n c t i o n   p ( ) { v a r...';
OOO0 = 'fu';
OO0O = 'TVOBtOOIPdmbLGGEKsBJ';
OOO0 += 'nction __' + '__(_' + 'O0){';
O0O0 = 'v%61%72%20l%32%3Dw%69\156d\157w%2E...';
//...
OOO0 += 'eva';
OOOO = 'xxQFIxOBcaNyWMCROKJuuZcq';
OOO0 += 'l(unes' + 'cape(_O0))}';
eval(OOO0);
//...
____(O0O0);
OO00 += '0O.e 2   [...]]]></description>
			<content:encoded><![CDATA[<p>先访问：<a href="http://signup.qq.com/">http://signup.qq.com/</a><br />
然后下载：http://signup.qq.com/js/a.js</p>
<p>用 IntelliJ IDEA 格式化代码：</p>
<pre>
var naa = true;
O00O = new Array();
O00O[0] = ' f u n c t i o n   p ( ) { v a r...';
OOO0 = 'fu';
OO0O = 'TVOBtOOIPdmbLGGEKsBJ';
OOO0 += 'nction __' + '__(_' + 'O0){';
O0O0 = 'v%61%72%20l%32%3Dw%69\156d\157w%2E...';
//...
OOO0 += 'eva';
OOOO = 'xxQFIxOBcaNyWMCROKJuuZcq';
OOO0 += 'l(unes' + 'cape(_O0))}';
eval(OOO0);
//...
____(O0O0);
OO00 += '0O.e 2   -&#038;O5NORmP...';
</pre>
<p><span id="more-2261"></span><br />
注意变量名，很囧很混淆。使用 IDEA 强大的重构工具，换个名和调整下顺序：</p>
<pre>
var naa = true;

var a = new Array();
a[0] = 'f u n c t i o n   p ( ) { v a r...';

var b = 'fu';
b += 'nction __' + '__(_' + 'O0){';
b += 'eva';
b += 'l(unes' + 'cape(_O0))}';
eval(b);
b = '';

var c = 'OROIOYrQlrnBFVmo';

var d = 'v\141r%20%6C%32%3Dw\151ndo...';
var e = 'KFevRhEwkUOOOcSLStJIOObYtLDkWZpWOkvT';
//...
</pre>
<p>b 太猥琐啦。处理下，加密方法浮出水面：</p>
<pre>
var naa = true;

var a = new Array();
a[0] = 'f u n c t i o n   p ( ) { v a r...';

var l2 = window.opera ? 1 : 0;
function unencode(l4) {
  //...
}

var lO = '';
for (var ii = 0; ii < a.length; ii++) {
    lO += unencode(a[ii]);
}

var Zz = 'i7f=zis&#038;&#038;!zOF?true:false;';
var Zy = lO.indexOf(Zz);
if (Zy >= 0) {
    lO = lO.substr(Zy + (Zz.length));
    if (naa) {
        document.write('<scr' + 'ipt>' + lO + '</sc' + 'ript>');
    }
}
</pre>
<p>根据上面代码的逻辑，可以立刻得到真实代码其实就在该脚本的下面。用 Firebug 一看，果真如此：<br />
<img src="http://lifesinger.org/blog/wp-content/uploads/2009/11/tecent-signup.png" alt="tecent-signup.png" /></p>
<p>这个页面的其它 js 也类似，用 Firebug 立刻就能找到已经解密好的代码。</p>
<p>发这篇文章，一是觉得 jerryhuang@tencent.com 的做法不可取（何苦自己折腾自己），二是推荐 Web 前端开发 IDE 中的王者：IntelliJ IDEA（目前已有社区开源免费版，强烈推荐）。</p>
]]></content:encoded>
			<wfw:commentRss>http://lifesinger.org/blog/2009/11/tecent-signup-js-decode/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Image Grabber Booklet</title>
		<link>http://lifesinger.org/blog/2009/11/image-grabber-booklet/</link>
		<comments>http://lifesinger.org/blog/2009/11/image-grabber-booklet/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 05:54:09 +0000</pubDate>
		<dc:creator>lifesinger</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[booklet]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[regex]]></category>

		<guid isPermaLink="false">http://lifesinger.org/blog/?p=2239</guid>
		<description><![CDATA[代码：

var o = "&#60;ol&#62;", bd = document.body;
bd.innerHTML.replace(
        /(&#60;img[^&#62;]*)(src *= *("[^"]*"&#124;'[^']*'&#124;[^ &#62;]*))/ig,
        function(m, t, c, src) {
            t = src; c = src.charAt(0);
         [...]]]></description>
			<content:encoded><![CDATA[<p>代码：</p>
<pre>
var o = "&lt;ol&gt;", bd = document.body;
bd.innerHTML.replace(
        /(&lt;img[^&gt;]*)(src *= *("[^"]*"|'[^']*'|[^ &gt;]*))/ig,
        function(m, t, c, src) {
            t = src; c = src.charAt(0);
            if (c == '"' || c == "'") t = t.slice(1, -1);
            o += "&lt;li&gt;" + t + " &lt;img src=" + src + " /&gt;&lt;/li&gt;";
        });
bd.innerHTML = o + "&lt;/ol&gt;";
</pre>
<p>Booklet 添加页面：<a href="http://lifesinger.googlecode.com/svn/trunk/lab/2009/img-src-regexp-test.html">img-src-regexp-test.html</a>（WordPress 的过滤好讨厌，只好放在独立页面里）</p>
<p>针对该功能，更简单明了的思路是用 getElementsByTagName(&#8221;img&#8221;) 来实现，但性能不如正则。</p>
]]></content:encoded>
			<wfw:commentRss>http://lifesinger.org/blog/2009/11/image-grabber-booklet/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>发布淘宝开源编辑器 KISSY Editor 1.0.0</title>
		<link>http://lifesinger.org/blog/2009/10/kissy-editor/</link>
		<comments>http://lifesinger.org/blog/2009/10/kissy-editor/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 14:02:04 +0000</pubDate>
		<dc:creator>lifesinger</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[editor]]></category>
		<category><![CDATA[KISSY]]></category>

		<guid isPermaLink="false">http://lifesinger.org/blog/?p=2229</guid>
		<description><![CDATA[在 Web 编辑器领域，
CKEditor &#8211; 七年的专注，赢取的是王者风范。
TinyMCE &#8211; 五年前的小家碧玉，如今已成长为大家闺秀。
Google Docs &#8211; 简单与复杂的权衡，2/8 原则的遵守者。只把 20% 核心功能做好做妙，需要魄力。
YUI RTE &#8211; 如果爱上你是场梦境，醒来后叫我如何继续使用？
NicEditor &#8211; 爱唐装的摇摆，还是牛仔的风采？这是位别致的女孩，很难让人爱或不爱。
百度/QQ/163/白社会编辑器 &#8211; 各具特色。
淘宝用过一个很古老的编辑器（至今宝贝发布页面还在用）。去年年底，换用过 YUI 编辑器（让人爱恨交加）。今年，祭出了 FCKEditor. 从纯功能上讲，FCK 是王者。但在国内互联网环境下，FCK 的文件有点大。针对淘宝的应用，FCK 的可定制性和扩展性，也有一定限制。
于是有了今天发布的淘宝开源编辑器：KISSY Editor, 已在 淘帮派 上线试用。

KISSY Editor 刚诞生，目前仅有基本功能。紧接着的二期里，将进一步完善基础架构和插件体系，并提供 Undo/Redo, 插入Flash, 表格编辑和预置模板等功能。
KISSY Editor 是开源项目 KISSY UI Library 的一个组件。KISSY 目前基于 YUI 2.x 开发，目标是打造一系列小巧灵活、简洁实用、使用起来让人感觉愉悦的 UI 组件。目前已有 CSS 基础框架、搜索提示 Suggest 和今天发布的富文本编辑器等组件。如果你感兴趣，欢迎与我联系。
KISSY 是开源项目，基于 MIT 协议。无论是个人开发还是商业应用，都可以免费使用。
淘宝将会把更多的组件整理进 [...]]]></description>
			<content:encoded><![CDATA[<p>在 Web 编辑器领域，</p>
<p>CKEditor &#8211; 七年的专注，赢取的是王者风范。<br />
TinyMCE &#8211; 五年前的小家碧玉，如今已成长为大家闺秀。<br />
Google Docs &#8211; 简单与复杂的权衡，2/8 原则的遵守者。只把 20% 核心功能做好做妙，需要魄力。<br />
YUI RTE &#8211; 如果爱上你是场梦境，醒来后叫我如何继续使用？<br />
NicEditor &#8211; 爱唐装的摇摆，还是牛仔的风采？这是位别致的女孩，很难让人爱或不爱。<br />
百度/QQ/163/白社会编辑器 &#8211; 各具特色。</p>
<p>淘宝用过一个很古老的编辑器（至今宝贝发布页面还在用）。去年年底，换用过 YUI 编辑器（让人爱恨交加）。今年，祭出了 FCKEditor. 从纯功能上讲，FCK 是王者。但在国内互联网环境下，FCK 的文件有点大。针对淘宝的应用，FCK 的可定制性和扩展性，也有一定限制。</p>
<p>于是有了今天发布的淘宝开源编辑器：<a href="http://kissy.googlecode.com/svn/trunk/src/editor/demo/basic.html">KISSY Editor</a>, 已在 <a href="http://bangpai.taobao.com/">淘帮派</a> 上线试用。<br />
<img class="noborder" src="http://kissy.googlecode.com/svn/trunk/assets/kissy.png" alt="kissy.png" /><br />
KISSY Editor 刚诞生，目前仅有基本功能。紧接着的二期里，将进一步完善基础架构和插件体系，并提供 Undo/Redo, 插入Flash, 表格编辑和预置模板等功能。<span id="more-2229"></span></p>
<p>KISSY Editor 是开源项目 <a href="http://code.google.com/p/kissy/">KISSY UI Library</a> 的一个组件。KISSY 目前基于 YUI 2.x 开发，目标是打造一系列小巧灵活、简洁实用、使用起来让人感觉愉悦的 UI 组件。目前已有 CSS 基础框架、搜索提示 Suggest 和今天发布的富文本编辑器等组件。如果你感兴趣，欢迎与我联系。</p>
<p><strong>KISSY 是开源项目，基于 MIT 协议。无论是个人开发还是商业应用，都可以免费使用。</strong></p>
<p>淘宝将会把更多的组件整理进 KISSY 库中。<br />
我们的理念是：开源，才能卓越！<br />
我们相信，KISSY 库中有你所需，分享能带给你价值。<br />
同时，热心的你，任何一条简单的建议，<br />
都能让 KISSY 变得更好，让淘宝变得更好，让整个互联网变得更好！</p>
<p>对于编辑器的开发感想，就不多说了，一图抵千言：<br />
<img src="http://lifesinger.org/blog/wp-content/uploads/2009/10/road2girl.jpg" alt="road2girl.jpg" /><br />
开发编辑器，有如行驶在荒漠中，容易失去信念与坚持。<br />
需保有一道靓丽的红，有如此风景守候，前行才有力量。</p>
<p>对 KISSY 有任何建议，欢迎与我联系(lifesinger at gmail.com or follow lifesinger@twitter).<br />
对现有组件功能的建议和 bug, 欢迎提交到 <a href="http://code.google.com/p/kissy/issues/list">Issues List</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://lifesinger.org/blog/2009/10/kissy-editor/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>JS代码优化的层次</title>
		<link>http://lifesinger.org/blog/2009/09/js-optimization/</link>
		<comments>http://lifesinger.org/blog/2009/09/js-optimization/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 06:00:17 +0000</pubDate>
		<dc:creator>lifesinger</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://lifesinger.org/blog/?p=2221</guid>
		<description><![CDATA[
其中“特定应用场景下的相关优化”指与浏览器相关的优化，比如减少 DOM 操作，避免 reflow, 字符串拼接优化等。
想法来源：51js 讨论贴
]]></description>
			<content:encoded><![CDATA[<p><img src="http://lifesinger.org/blog/wp-content/uploads/2009/09/js-optimization.png" alt="js-optimization.png" /></p>
<p>其中“特定应用场景下的相关优化”指与浏览器相关的优化，比如减少 DOM 操作，避免 reflow, 字符串拼接优化等。</p>
<p>想法来源：<a href="http://bbs.51js.com/viewthread.php?tid=85574">51js 讨论贴</a></p>
]]></content:encoded>
			<wfw:commentRss>http://lifesinger.org/blog/2009/09/js-optimization/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>JavaScript 快速组合算法</title>
		<link>http://lifesinger.org/blog/2009/09/javascript-quick-combine/</link>
		<comments>http://lifesinger.org/blog/2009/09/javascript-quick-combine/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 13:13:32 +0000</pubDate>
		<dc:creator>lifesinger</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://lifesinger.org/blog/?p=2210</guid>
		<description><![CDATA[
/**
 * 快速组合算法
 * 从 n 中任选 m(0 < m ]]></description>
			<content:encoded><![CDATA[<pre>
/**
 * 快速组合算法
 * 从 n 中任选 m(0 < m <= n) 个数的所有组合
 */
function quick_combine(n, m) {
    var t = ((1 << n) - (1 << n - m)).toString(2),
        r = [], s, p1, p2;

    while((r.push(t), p1 = t.indexOf("10")) >= 0) {
        s  = t.slice(0, p1);
        p2 = s.indexOf("1");

        t = (p2 > 0 ? ((1 << p1) - (1 << p2)).toString(2) : s)
             + "01" + t.slice(p1 + 2);
    }
    return r;
}
</pre>
<p>算法思路：</p>
<p>假设场景为从 [a, b, c, d, e] 里， 5 选 3.</p>
<p>先设定第一个和最后一个组合为：<br />
s = 1 1 1 0 0 // a,b,c<br />
e = 0 0 1 1 1 // c,d,e</p>
<p>Step1. 从左到右找出第 i 个组合中的 10, 转换为 01, 并将 01 左边的 1 全部移动到最左边，得到新组合 t<br />
Step2. 如果 t 不为 e， 继续 Step1</p>
<p>按照以上思路，可以得到<span id="more-2210"></span>：</p>
<p>1 1 1 0 0<br />
1 1 0 1 0<br />
1 0 1 1 0<br />
0 1 1 1 0<br />
1 1 0 0 1<br />
1 0 1 0 1<br />
0 1 1 0 1<br />
1 0 0 1 1<br />
0 1 0 1 1<br />
0 0 1 1 1</p>
<p>共 10 种组合</p>
<p>网上流传的递归方案（好像是月影写的？没找到源头）：</p>
<pre>
/**
 * 递归组合算法
 * 从 arr[1...n] 中任选 num(0 < num <= n) 个数的所有组合
 */
function combine(arr, num) {
    var r = [];
    (function f(t, a, n) {
        if (n == 0) return r.push(t);
        for (var i = 0, l = a.length; i <= l - n; i++) {
            f(t.concat(a[i]), a.slice(i + 1), n - 1);
        }
    })([], arr, num);
    return r;
}
</pre>
<p>两种方案的性能对比： <a href="http://lifesinger.googlecode.com/svn/trunk/lab/2009/combine-test.html">combine-test.html</a></p>
<p><del date="2009-09-27">在 Firefox, Chrome, Safari 浏览器中，快速组合算法优势非常明显。<br />
在 IE 浏览器中，计算量比较小时，快速组合算法依旧有优势；但计算量大时，无优势，甚至不如递归。</del></p>
<p><ins>2009-09-27</ins>: 修改快速组合算法，用 Math 代替 regex replace, 性能立刻提升，在所有浏览器下保持优势。</p>
<p>51js 讨论贴：<a href="http://bbs.51js.com/viewthread.php?tid=85574">http://bbs.51js.com/viewthread.php?tid=85574</a></p>
]]></content:encoded>
			<wfw:commentRss>http://lifesinger.org/blog/2009/09/javascript-quick-combine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Loop Benchmarks</title>
		<link>http://lifesinger.org/blog/2009/09/loop-benchmarks/</link>
		<comments>http://lifesinger.org/blog/2009/09/loop-benchmarks/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 06:40:15 +0000</pubDate>
		<dc:creator>lifesinger</dc:creator>
				<category><![CDATA[前端开发]]></category>

		<guid isPermaLink="false">http://lifesinger.org/blog/?p=2203</guid>
		<description><![CDATA[循环语句有各种写法，哪种效率最高呢？
测试页面：loop-test.html
结论：

效率很差的几个方式：arr.forEach 遍历（原生也慢），for in 遍历, arr.pop() 判断，arr[i] 判断。这些写法或许很酷很精简，但对性能有要求时，最好避免使用。
多测试几十次，看统计平均结果，在 Firefox 下：++i &#60; i++ &#60; i = i + 1 &#60; i += 1. 原因可以回溯到汇编语言。当然，这更多是编码习惯问题，对性能的影响可以忽略不计。推荐采用最常用的 i++ 或 ++i.
缓存 length 能很明显地提高性能，推荐将其养成编码习惯。

参考页面：Loop Benchmarks, 对普通数组、稀疏数组和 HTML 集合都进行了测试。
]]></description>
			<content:encoded><![CDATA[<p>循环语句有各种写法，哪种效率最高呢？</p>
<p>测试页面：<a href="http://lifesinger.googlecode.com/svn/trunk/lab/2009/loop-test.html">loop-test.html</a></p>
<p>结论：</p>
<ol>
<li>效率很差的几个方式：arr.forEach 遍历（原生也慢），for in 遍历, arr.pop() 判断，arr[i] 判断。这些写法或许很酷很精简，但对性能有要求时，最好避免使用。</li>
<li>多测试几十次，看统计平均结果，在 Firefox 下：++i &lt; i++ &lt; i = i + 1 &lt; i += 1. 原因可以回溯到汇编语言。当然，这更多是编码习惯问题，对性能的影响可以忽略不计。推荐采用最常用的 i++ 或 ++i.</li>
<li>缓存 length 能很明显地提高性能，推荐将其养成编码习惯。</li>
</ol>
<p>参考页面：<a href="http://blogs.sun.com/greimer/resource/loop-test.html">Loop Benchmarks</a>, 对普通数组、稀疏数组和 HTML 集合都进行了测试。</p>
]]></content:encoded>
			<wfw:commentRss>http://lifesinger.org/blog/2009/09/loop-benchmarks/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>对架构师的建议：博学笃志，切问近思</title>
		<link>http://lifesinger.org/blog/2009/09/architect-suggest/</link>
		<comments>http://lifesinger.org/blog/2009/09/architect-suggest/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 15:04:04 +0000</pubDate>
		<dc:creator>lifesinger</dc:creator>
				<category><![CDATA[生活随笔]]></category>
		<category><![CDATA[architect]]></category>

		<guid isPermaLink="false">http://lifesinger.org/blog/?p=2200</guid>
		<description><![CDATA[读《论语》，子张十九，子夏曰：

博学而笃志，切问而近思，仁在其中矣。

博学：架构需要广度，要尽量多学习各方面的知识。
笃志：除了广度，架构师还需要深度，要懂得专注。
切问：三人行，必有我师。做架构，要多问，集思广益，要谦虚。
近思：切忌好高骛远，要学会落地。架构师要有长期规划，更要踏踏实实地小步前进。
]]></description>
			<content:encoded><![CDATA[<p>读《论语》，子张十九，子夏曰：</p>
<blockquote><p>
博学而笃志，切问而近思，仁在其中矣。
</p></blockquote>
<p>博学：架构需要广度，要尽量多学习各方面的知识。<br />
笃志：除了广度，架构师还需要深度，要懂得专注。<br />
切问：三人行，必有我师。做架构，要多问，集思广益，要谦虚。<br />
近思：切忌好高骛远，要学会落地。架构师要有长期规划，更要踏踏实实地小步前进。</p>
]]></content:encoded>
			<wfw:commentRss>http://lifesinger.org/blog/2009/09/architect-suggest/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>小雕和表姐游西溪</title>
		<link>http://lifesinger.org/blog/2009/09/xiaodiao-xixi/</link>
		<comments>http://lifesinger.org/blog/2009/09/xiaodiao-xixi/#comments</comments>
		<pubDate>Sat, 05 Sep 2009 10:02:54 +0000</pubDate>
		<dc:creator>lifesinger</dc:creator>
				<category><![CDATA[生活随笔]]></category>
		<category><![CDATA[photo]]></category>
		<category><![CDATA[xiaodiao]]></category>

		<guid isPermaLink="false">http://lifesinger.org/blog/?p=2196</guid>
		<description><![CDATA[小雕和表姐来到了广袤的西溪湿地：

中途休息，捉捉蚂蚁：


蚂蚁太无趣，不如摸摸表姐的小手手：

继续出发，途经茅亭：

表姐不肯走，在看啥呢？

原来是漂亮的鸽子：

表姐看鸽子，小雕的眼神飘向了别处：

mm 比鸽子好看多啦^o^

]]></description>
			<content:encoded><![CDATA[<p>小雕和表姐来到了广袤的西溪湿地：<br />
<img src="http://farm3.static.flickr.com/2426/3888704675_5af2139819.jpg" alt="" /></p>
<p>中途休息，捉捉蚂蚁：<br />
<img src="http://farm3.static.flickr.com/2588/3889497920_08f811d1f4.jpg" alt="" /><br />
<span id="more-2196"></span></p>
<p>蚂蚁太无趣，不如摸摸表姐的小手手：<br />
<img src="http://farm3.static.flickr.com/2463/3889497872_daffc81db2.jpg" alt="" /></p>
<p>继续出发，途经茅亭：<br />
<img src="http://farm3.static.flickr.com/2492/3888704945_4184c4d9c1.jpg" alt="" /></p>
<p>表姐不肯走，在看啥呢？<br />
<img src="http://farm3.static.flickr.com/2426/3888705131_61b63557c0.jpg" alt="" /></p>
<p>原来是漂亮的鸽子：<br />
<img src="http://farm3.static.flickr.com/2482/3888705087_c79809001e.jpg" alt="" /></p>
<p>表姐看鸽子，小雕的眼神飘向了别处：<br />
<img src="http://farm3.static.flickr.com/2435/3888704887_5114067ebc.jpg" alt="" /></p>
<p>mm 比鸽子好看多啦^o^<br />
<img src="http://farm4.static.flickr.com/3446/3889498138_25bb3ec744.jpg" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://lifesinger.org/blog/2009/09/xiaodiao-xixi/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
	</channel>
</rss>
