<?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>网站前端,web前端,前端脚本,前端优化&#124;时代前端 &#187; JavaScript</title>
	<atom:link href="http://www.52shidai.com/tag/javascript/feed" rel="self" type="application/rss+xml" />
	<link>http://www.52shidai.com</link>
	<description>网站前端研究中心</description>
	<lastBuildDate>Thu, 02 Feb 2012 03:36:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Web 前端优化最佳实践之 JavaScript 篇</title>
		<link>http://www.52shidai.com/web-front/801.html</link>
		<comments>http://www.52shidai.com/web-front/801.html#comments</comments>
		<pubDate>Sat, 26 Nov 2011 07:13:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[前端优化]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[优化]]></category>

		<guid isPermaLink="false">http://www.52shidai.com/?p=801</guid>
		<description><![CDATA[Web 前端优化最佳实践之 JavaScript 篇，这部分有 6 条规则，和 CSS 篇 重复的有几条。前端优化最佳实践，最重要的还是”实践”，要理解这东西容易得很，关键是要去”实践”，去”执行”，去”反馈”，去获取受益。 1. 脚本放到 HTML 代码页底部 (Put Scripts at the Bottom) 当一个脚本在下载的时候，浏览器干不了其它的事儿(串行了)。所以，把它扔到最后面去处理。对于一些功能性的脚本，可能实现起来有些两难。不过对于国内网站来说，有很多使用 Google Analytics 服务进行网站数据分析的。这这一点来说，绝对可行的建议，放到页面最底下。 2. Make JavaScript and CSS External 参见 CSS 篇的描述 3. 精简 JavaScript 与 CSS (Minify JavaScript and CSS) 参见 CSS 篇的描述 4. 移除重复脚本 (Remove Duplicate Scripts) 对于一些历史遗留站点或是论坛类的网站来说，这倒是比较常见的。接手维护人前后变化过多，每个人都有自己的一套。这就会带来一些潜在的麻烦。 5. 减少 DOM 访问 (Minimize DOM Access) 有三条指导建议: 缓存已经访问过的元素 (Cache references to accessed elements) “离线”更新节点, 再将它们添加到树中 (Update nodes “offline” and then [...]]]></description>
			<content:encoded><![CDATA[<p>Web <span class='wp_keywordlink'><a href="http://www.52shidai.com" title="时代前端" target="_blank">前端</a></span><span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e4%bc%98%e5%8c%96" title="查看 优化 中的全部文章" target="_blank">优化</a></span>最佳实践之 <span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/javascript" title="查看 JavaScript 中的全部文章" target="_blank">JavaScript</a></span> 篇，这部分有 6 条规则，和 <acronym title="Cascading Style Sheets<br />
">CSS</acronym> 篇 重复的有几条。<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e5%89%8d%e7%ab%af%e4%bc%98%e5%8c%96" title="查看 前端优化 中的全部文章" target="_blank">前端优化</a></span>最佳实践，最重要的还是”实践”，要理解这东西容易得很，关键是要去”实践”，去”执行”，去”反馈”，去获取受益。</p>
<h4>1. 脚本放到 <acronym title="HyperText Markup Language<br />
">HTML</acronym> 代码页底部 (Put Scripts at the Bottom)</h4>
<p>当一个脚本在下载的时候，浏览器干不了其它的事儿(串行了)。所以，把它扔到最后面去处理。对于一些功能性的脚本，可能实现起来有些两难。不过对于国内网站来说，有很多使用 Google Analytics 服务进行网站数据分析的。这这一点来说，绝对可行的建议，放到页面最底下。</p>
<h4>2. Make <span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/javascript" title="查看 JavaScript 中的全部文章" target="_blank">JavaScript</a></span> and <acronym title="Cascading Style Sheets<br />
">CSS</acronym> External</h4>
<p>参见 <a href="http://www.52shidai.com/web-front/799.html" target="_blank">CSS 篇</a>的描述</p>
<h4>3. 精简 <span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/javascript" title="查看 JavaScript 中的全部文章" target="_blank">JavaScript</a></span> 与 <acronym title="Cascading Style Sheets<br />
">CSS</acronym> (Minify JavaScript and <acronym title="Cascading Style Sheets<br />
">CSS</acronym>)</h4>
<p>参见 <a href="http://www.52shidai.com/web-front/799.html" target="_blank">CSS 篇</a>的描述</p>
<h4>4. 移除重复脚本 (Remove Duplicate Scripts)</h4>
<p>对于一些历史遗留站点或是论坛类的网站来说，这倒是比较常见的。接手维护人前后变化过多，每个人都有自己的一套。这就会带来一些潜在的麻烦。</p>
<h4>5. 减少 <acronym title="Document Object Model<br />
">DOM</acronym> 访问 (Minimize <acronym title="Document Object Model<br />
">DOM</acronym> Access)</h4>
<p>有三条指导建议:</p>
<ul>
<li>缓存已经访问过的元素 (Cache references to accessed elements)</li>
<li>“离线”更新节点, 再将它们添加到树中 (Update nodes “offline” and then add them to the tree)</li>
<li>避免使用 JavaScript 输出页面布局&#8211;应该是 <acronym title="Cascading Style Sheets<br />
">CSS</acronym> 的事儿 (Avoid fixing layout with JavaScript)</li>
</ul>
<h4>6. Develop Smart Event Handlers</h4>
<p>除了英文解释外，这里也提醒一下注意关于 <strong>Java Script 内存泄漏</strong>的问题。</p>
<p>另外推荐一篇<a href="http://shiningray.cn/improve-javascript-performance.html" target="_blank">《如何优化 JavaScript 脚本的性能》</a>，关于 Ajax <span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e4%bc%98%e5%8c%96" title="查看 优化 中的全部文章" target="_blank">优化</a></span>指导原则，可以参见 <a href="http://www.ibm.com/developerworks/cn/web/wa-aj-speed.html" target="_blank">提高 Ajax 应用程序性能，避开 Web 服务漏洞</a>。</p>
<p><strong>后记1)</strong> ：整理得差不多之后，发现网络上已经有一篇 《Yahoo!网站性能最佳体验的34条黄金守则》，是翻译稿。看来我做了一部分重复劳动。</p>
<p><strong>后记 2)</strong>：CSS / JavaScript 都有优化规则。但似乎缺少了对 Flash 的优化实践。</p>
<h2  class="related_post_title">您可能感兴趣的文章</h2><ul class="related_post"><li><a href="http://www.52shidai.com/web-front/809.html" title="Flickr 的开发者的 Web 应用优化技巧">Flickr 的开发者的 Web 应用优化技巧</a></li><li><a href="http://www.52shidai.com/web-front/806.html" title="Web 前端优化最佳实践之 Mobile(iPhone) 篇">Web 前端优化最佳实践之 Mobile(iPhone) 篇</a></li><li><a href="http://www.52shidai.com/web-front/804.html" title="Web 前端优化最佳实践之 图象篇">Web 前端优化最佳实践之 图象篇</a></li><li><a href="http://www.52shidai.com/web-front/799.html" title="Web 前端优化最佳实践之 CSS 篇">Web 前端优化最佳实践之 CSS 篇</a></li><li><a href="http://www.52shidai.com/web-front/797.html" title="Web 前端优化最佳实践之 Cookie 篇">Web 前端优化最佳实践之 Cookie 篇</a></li><li><a href="http://www.52shidai.com/web-front/795.html" title="Web 前端优化最佳实践之 Server 篇">Web 前端优化最佳实践之 Server 篇</a></li><li><a href="http://www.52shidai.com/web-front/793.html" title="Web 前端优化最佳实践之 内容篇">Web 前端优化最佳实践之 内容篇</a></li><li><a href="http://www.52shidai.com/seo/883.html" title="RSS对网站SEO优化的好处">RSS对网站SEO优化的好处</a></li><li><a href="http://www.52shidai.com/seo/877.html" title="如何优化网站内链建设">如何优化网站内链建设</a></li><li><a href="http://www.52shidai.com/seo/844.html" title="wordpress博客seo优化指南">wordpress博客seo优化指南</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.52shidai.com/web-front/801.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>31个Javascript的实用工具</title>
		<link>http://www.52shidai.com/javascript/759.html</link>
		<comments>http://www.52shidai.com/javascript/759.html#comments</comments>
		<pubDate>Tue, 22 Nov 2011 13:49:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[前端优化]]></category>
		<category><![CDATA[工具]]></category>

		<guid isPermaLink="false">http://www.52shidai.com/?p=759</guid>
		<description><![CDATA[下面提到的这些工具包括各种实用工具，优化器，测试和调试工具，它们可以提高开发者创建Web站点的效率。 1，JavaScript compressor and comparison tool 有许多工具可以帮助你压缩JavaScript代码，但是这个过程比较耗时，并且，对于某个特定的场景来说，很难分析出具体哪个工具表现的最好。这 个应用程序可以对那些工具的常规压缩做一个汇总统计，它可以让开发者在不安装这些工具的情况下，对在自己的JavaScript代码上应用那些工具的情况 进行比较。 具体可以参考：http://compressorrater.thruhere.net/ 2，Regular expression validator tool 这个基于Web的JavaScript正则表达式验证器可以让你轻松地为JavaScript测试和编写正则表达式。这个工具可以帮助你检查语法方面的错误，此外，它还为你提供一个正则表达式库。 具体可以参考：http://tools.netshiftmedia.com/regexlibrary/ 3，Regular expression generator 在IE中，这个脚本运行在 JDC 1.0.3 之上，这就是它在 Firefox，Opera 和 Safari 上运行的稍微快一些的原因。 具体可以参考：http://www.jslab.dk/tools.regex.php 4，Jsbeautifier 这个微型的美化器可以重新调整 bookmarklet 和丑陋的JavaScript的格式和缩进，也可以对使用流行的 Dean Edward 的 Packer 打包的脚本进行拆包，对通过javascriptobfuscator.com 混淆的脚本进行反混淆。 具体可以参考：http://jsbeautifier.org/ 5，Jsbin JS Bin是一个开源的，协同的JavaScript调试工具。 具体可以参考：http://jsbin.com/ &#160; 6，Jslint JSlint会对JavaScript的源代码进行扫描。如果它发现了一个问题，会返回一个描述这个问题的消息和源代码中的大概位置。这个问题不一 定是一个语法错误（虽然通常情况下，这个问题都是一个语法错误）。JSLint 会发现一些样式约定和结构问题。它无法证明你的程序是正确的。它只能帮助你发现一些问题。 具体可以参考：http://www.jslint.com/ 7，Rockstarapps Rockstarapps 的使命比较简单：给开发者提供一套工具，让他们可以在云中创建经过高度优化的Web应用程序。 具体可以参考：http://rockstarapps.com/joomla-1.5.8/home.html 8，Prettyprinter 这是一个源代码美化器（源代码格式化器），和缩进的效果是类似的。 [...]]]></description>
			<content:encoded><![CDATA[<p>下面提到的这些<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e5%b7%a5%e5%85%b7" title="查看 工具 中的全部文章" target="_blank">工具</a></span>包括各种实用<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e5%b7%a5%e5%85%b7" title="查看 工具 中的全部文章" target="_blank">工具</a></span>，优化器，测试和调试<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e5%b7%a5%e5%85%b7" title="查看 工具 中的全部文章" target="_blank">工具</a></span>，它们可以提高开发者创建Web站点的效率。</p>
<p><strong>1，<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/javascript" title="查看 JavaScript 中的全部文章" target="_blank">JavaScript</a></span> compressor and comparison tool</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/1502580.jpg" alt="JavaScript compressor and comparison tool" width="600" height="300" border="0" /></p>
<p>有许多工具可以帮助你压缩<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/javascript" title="查看 JavaScript 中的全部文章" target="_blank">JavaScript</a></span>代码，但是这个过程比较耗时，并且，对于某个特定的场景来说，很难分析出具体哪个工具表现的最好。这 个应用程序可以对那些工具的常规压缩做一个汇总统计，它可以让开发者在不安装这些工具的情况下，对在自己的<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/javascript" title="查看 JavaScript 中的全部文章" target="_blank">JavaScript</a></span>代码上应用那些工具的情况 进行比较。</p>
<p>具体可以参考：http://compressorrater.thruhere.net/</p>
<p><strong>2，Regular expression validator tool</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/1502581.jpg" alt="Regular expression validator tool" width="600" height="300" border="0" /></p>
<p>这个基于Web的JavaScript正则表达式验证器可以让你轻松地为JavaScript测试和编写正则表达式。这个工具可以帮助你检查语法方面的错误，此外，它还为你提供一个正则表达式库。</p>
<p>具体可以参考：http://tools.netshiftmedia.com/regexlibrary/</p>
<p><strong>3，Regular expression generator</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/1502582.jpg" alt="Regular expression generator" width="600" height="300" border="0" /></p>
<p>在IE中，这个脚本运行在 JDC 1.0.3 之上，这就是它在 Firefox，Opera 和 Safari 上运行的稍微快一些的原因。</p>
<p>具体可以参考：http://www.jslab.dk/tools.regex.php</p>
<p><strong>4，Jsbeautifier</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/1502583.jpg" alt="Jsbeautifier" width="600" height="300" border="0" /></p>
<p>这个微型的美化器可以重新调整 bookmarklet 和丑陋的JavaScript的格式和缩进，也可以对使用流行的 Dean Edward 的 Packer 打包的脚本进行拆包，对通过javascriptobfuscator.com 混淆的脚本进行反混淆。</p>
<p>具体可以参考：http://jsbeautifier.org/</p>
<p><strong>5，Jsbin</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/1502584.jpg" alt="Jsbin" width="600" height="300" border="0" /></p>
<p>JS Bin是一个开源的，协同的JavaScript调试工具。</p>
<p>具体可以参考：http://jsbin.com/</p>
<p>&nbsp;</p>
<p><strong>6，Jslint</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/1502585.jpg" alt="Jslint" width="600" height="300" border="0" /></p>
<p>JSlint会对JavaScript的源代码进行扫描。如果它发现了一个问题，会返回一个描述这个问题的消息和源代码中的大概位置。这个问题不一 定是一个语法错误（虽然通常情况下，这个问题都是一个语法错误）。JSLint 会发现一些样式约定和结构问题。它无法证明你的程序是正确的。它只能帮助你发现一些问题。</p>
<p>具体可以参考：http://www.jslint.com/</p>
<p><strong>7，Rockstarapps</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/1502586.jpg" alt="Rockstarapps" width="600" height="300" border="0" /></p>
<p>Rockstarapps 的使命比较简单：给开发者提供一套工具，让他们可以在云中创建经过高度优化的Web应用程序。</p>
<p>具体可以参考：http://rockstarapps.com/joomla-1.5.8/home.html</p>
<p><strong>8，Prettyprinter</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/1502587.jpg" alt="Prettyprinter" width="600" height="300" border="0" /></p>
<p>这是一个源代码美化器（源代码格式化器），和缩进的效果是类似的。</p>
<p>具体可以参考：http://www.prettyprinter.de/</p>
<p><strong>9，Pixastic</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/1502588.jpg" alt="Pixastic" width="600" height="300" border="0" /></p>
<p>Pixastic是一个实验性的库，使用这个库，你只需要一点点的 JavaScript 代码，就可以执行各种图像操作。它支持的效果包括淡化/灰度调整，倒置，翻转，亮度/对比度的调整，色调/饱和度，浮现，模糊，等等。</p>
<p>具体可以参考：http://www.pixastic.com/</p>
<p><strong>10，Extjs</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/1502589.jpg" alt="Extjs" width="600" height="300" border="0" /></p>
<p>构建丰富的，可持续发展的Web应用程序比以往更加快捷了。许多著名的公司（Adobe, Amazon, CNN 等）都在使用extjs。</p>
<p>具体可以参考：http://www.sencha.com/</p>
<p>&nbsp;</p>
<p><strong>11，Slickspeed</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/15025810.jpg" alt="Slickspeed" width="600" height="300" border="0" /></p>
<p>各种测试在一个中立的环境中运行，在主要的JavaScript测试中，既不包括库也不包括框架，这样可以避免偏颇。</p>
<p>具体可以参考：http://mootools.net/slickspeed/</p>
<p><strong>12，Scriptalizer</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/15025811.jpg" alt="Scriptalizer" width="600" height="300" border="0" /></p>
<p>对于那些在互联网上部署和传输的解释性语言（例如：JavaScript）来说，对源代码进行最小化是很有帮助的，因为这可以减少需要传输的数据量。</p>
<p>具体可以参考：http://www.scriptalizer.com/</p>
<p><strong>13，Yui compressor</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/15025812.jpg" alt="Yui compressor" width="600" height="300" border="0" /></p>
<p>YUI Compressor 是100%安全的 JavaScript 最小化器，它比大多数其他工具的压缩比都要高。在YUI库上的测试表明，和 JSMin 比起来，它可以节省超过20%的体积（在HTTP压缩以后，这个数字是10%）。</p>
<p>具体可以参考：http://developer.yahoo.com/yui/compressor/</p>
<p><strong>14，Js minifier</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/15025813.jpg" alt="Js minifier" width="600" height="300" border="0" /></p>
<p>具体可以参考：http://fmarcia.info/jsmin/test.html</p>
<p><strong>15，Jslitmus</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/15025814.jpg" alt="Jslitmus" width="600" height="300" border="0" /></p>
<p>JSLitmus 是一个轻量级的工具，主要用于创建 ad-hoc JavaScript benchmark tests。</p>
<p>具体可以参考：http://broofa.com/Tools/JSLitmus/</p>
<p>&nbsp;</p>
<p><strong>16，Js regular expression tester</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/15025815.jpg" alt="Js regular expression tester" width="600" height="300" border="0" /></p>
<p>这个方便的实用程序可以在一个浏览器中，使用 JavaScript 来测试 JavaScript 正则表达式。它的界面和其他正则表达式测试工具类似，但是，和其他工具不同的是，它用JavaScript 测试正则表达式的 JavaScript 实现。</p>
<p>具体可以参考：http://www.codeproject.com/KB/scripting/regex2.aspx</p>
<p><strong>17，Qooxdoo</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/15025816.jpg" alt="Qooxdoo" width="600" height="300" border="0" /></p>
<p>qooxdoo是一个集综合性和创新性于一身的框架，它主要用于创建富互联网应用程序（RIA）。面向对象的 JavaScript 可以让开发者构建跨浏览器的应用程序。无须掌握HTML, CSS的知识，也无须掌握 DOM 知识。</p>
<p>具体可以参考：http://qooxdoo.org/</p>
<p><strong>18，JavascriptMVC</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/15025817.jpg" alt="JavascriptMVC" width="600" height="300" border="0" /></p>
<p>JavascriptMVC是一个开源的框架，它融合了企业级的 JavaScript 开发方面的最佳理念。它可以通过执行最佳实践，增加可维护性，和推广约定优于配置的理念等方式来帮助你成功地完成项目。</p>
<p>具体可以参考：http://javascriptmvc.com/</p>
<p><strong>19，GNUcitizen</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/15025818.jpg" alt="GNUcitizen" width="600" height="300" border="0" /></p>
<p>为了把JavaScript攻击向量和其他的客户端和服务端技术组合在一起，AttackAPI提供了简单而直观的编程界面。</p>
<p>具体可以参考：http://www.gnucitizen.org/blog/attackapi/</p>
<p><strong>20，Jsfuzzer</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/15025819.jpg" alt="Jsfuzzer" width="600" height="300" border="0" /></p>
<p>这个 fuzzing 工具支持事件，标签，样式和 HTML 属性的 fuzzing。你可以使用各种深度的不完整标签，也可以对所有参数进行随机排列。它还包含一个带有所有新的攻击向量的数据库。</p>
<p>具体可以参考：http://code.google.com/p/jsfuzzer/</p>
<p>&nbsp;</p>
<p><strong>21，J3unit</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/15025820.jpg" alt="J3unit" width="600" height="300" border="0" /></p>
<p>J3Unit是一个面向对象的 JavaScript 单元测试框架。J3Unit可以直接在Web浏览器中运行JavaScript测试，也可以自动地运行 JUnit 和Jetty。J3Unit是建立在JSUnit 和 Script.aculo.us 基础之上的，它提供了一种更好的方式来自动化JavaScript单元测试。</p>
<p>具体可以参考：http://j3unit.sourceforge.net/</p>
<p><strong>22，Jsunit</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/15025821.jpg" alt="Jsunit" width="600" height="300" border="0" /></p>
<p>JsUnit是一个客户端（浏览器内）JavaScript单元测试框架。它实际上是JUnit到JavaScript的一个通道。此外，它还包括一个平台，这个平台可以自动地执行多个浏览器和运行不同的操作系统的多台机器上的测试。</p>
<p>具体可以参考：http://www.jsunit.net/</p>
<p><strong>23,Firebug</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/15025822.jpg" alt="Firebug" width="600" height="300" border="0" /></p>
<p>Firebug是和 Firefox 集成在一起的，当你浏览页面的时候，你随时可以使用它提供的丰富的Web开发工具。在任何一个Web页面中，你都可以实时地编辑，调试和监控 CSS，HTML，和JavaScript。</p>
<p>具体可以参考：http://getfirebug.com/</p>
<p><strong>24，Venkman</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/15025823.jpg" alt="Venkman" width="600" height="300" border="0" /></p>
<p>Venkman 是 Mozilla 的 JavaScript 调试器的代号。Venkman 旨在为基于 Gecko 的浏览器（即：Firefox 3.x,Netscape 7.x 系列的浏览器）提供一个强大的 JavaScript 调试环境。</p>
<p>具体可以参考：http://www.mozilla.org/projects/venkman/</p>
<p><strong>25，Drosera</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/15025824.jpg" alt="Drosera" width="600" height="300" border="0" /></p>
<p>为了调试你的应用程序中的 JavaScript 代码，你需要为你的应用程序指定一个默认的“bundle identifier”。此外，你还需要使用 TOT WebKit 框架来发布你的应用程序。通过 WebKitTools/Scripts 内的 run-webkit-app 脚本，你可以轻松地完成这些工作，然后，你会发现你的应用程序已经显示在 Drosera 的窗口中了。</p>
<p>具体可以参考：http://webkit.org/blog/61/introducing-drosera/</p>
<p>&nbsp;</p>
<p><strong>26，Dragonfly</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/15025825.jpg" alt="Dragonfly" width="600" height="300" border="0" /></p>
<p>欢迎 Opera Dragonfly 的 alpha版的到来，这是一个为基于 Presto 的 Opera 浏览器而提供的功能完备的调试环境。Opera Dragonfly 提供的那些工具可以让你更快速，更轻松地进行开发，它们可以调试你的 JavaScript 代码，也可以检查DOM，CSS，网络流量和数据存储。Opera Dragonfly 内置的远程调试功能让移动开发变得前所未有的轻松。</p>
<p>具体可以参考：http://www.opera.com/dragonfly/</p>
<p><strong>27，Nitobibug</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/15025826.jpg" alt="Nitobibug" width="600" height="300" border="0" /></p>
<p>对于专家和新手来说，NitobiBug 都是一个实用的工具。它让 JavaScript 和 DOM 问题的调试变得更加快捷，更加简单。</p>
<p>具体可以参考：http://www.nitobibug.com/</p>
<p><strong>28，Wavemaker</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/15025827.jpg" alt="Wavemaker" width="600" height="300" border="0" /></p>
<p>具体可以参考：http://www.wavemaker.com/</p>
<p><strong>29，Jaxer</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/15025828.jpg" alt="Jaxer" width="600" height="300" border="0" /></p>
<p>Jaxer是一个 Aptana Ajax Server，它内置在 Aptana Studio 中。Jaxer可以让你在提供那个页面以前或者是在回调期间，在服务器上执行 JavaScript 代码。</p>
<p>具体可以参考：http://jaxer.org/</p>
<p><strong>30，Jxlib</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/15025829.jpg" alt="Jxlib" width="600" height="300" border="0" /></p>
<p>一个 JavaScript 库，主要用于创建基于传说中的 MooTools 库的图形化的用户界面。</p>
<p>具体可以参考：http://jxlib.org/</p>
<p><strong>31，Dojotoolkit</strong></p>
<p><img title="在新窗口打开图片" src="http://images.51cto.com/files/uploadimg/20101206/15025830.jpg" alt="Dojotoolkit" width="600" height="300" border="0" /></p>
<p>Dojo 可以节省你的时间，提供强大的性能，缩短你的开发过程。为了提供良好的Web体验，有经验的开发人员都会使用这个工具包。</p>
<h2  class="related_post_title">您可能感兴趣的文章</h2><ul class="related_post"><li><a href="http://www.52shidai.com/web-front/801.html" title="Web 前端优化最佳实践之 JavaScript 篇">Web 前端优化最佳实践之 JavaScript 篇</a></li><li><a href="http://www.52shidai.com/javascript/661.html" title="javascript 正则表达式-替换">javascript 正则表达式-替换</a></li><li><a href="http://www.52shidai.com/javascript/614.html" title="高质量JavaScript代码书写基本要点|值得收藏">高质量JavaScript代码书写基本要点|值得收藏</a></li><li><a href="http://www.52shidai.com/seo/611.html" title="前端开发的一些必备工具信息">前端开发的一些必备工具信息</a></li><li><a href="http://www.52shidai.com/javascript/585.html" title="js入门学习：Javascript的学习笔记">js入门学习：Javascript的学习笔记</a></li><li><a href="http://www.52shidai.com/javascript/583.html" title="学习JavaScript三件必须了解的事">学习JavaScript三件必须了解的事</a></li><li><a href="http://www.52shidai.com/javascript/556.html" title="JavaScript操作iframe里的dom">JavaScript操作iframe里的dom</a></li><li><a href="http://www.52shidai.com/javascript/323.html" title="javascript中的107个基础知识收集整理">javascript中的107个基础知识收集整理</a></li><li><a href="http://www.52shidai.com/seo/298.html" title="所有网站长必备的SEO工具大全">所有网站长必备的SEO工具大全</a></li><li><a href="http://www.52shidai.com/javascript/62.html" title="JavaScript面向对象之静态与非静态类">JavaScript面向对象之静态与非静态类</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.52shidai.com/javascript/759.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>javascript 正则表达式-替换</title>
		<link>http://www.52shidai.com/javascript/661.html</link>
		<comments>http://www.52shidai.com/javascript/661.html#comments</comments>
		<pubDate>Tue, 30 Nov 2010 02:10:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[替换]]></category>
		<category><![CDATA[正则表达式]]></category>

		<guid isPermaLink="false">http://www.52shidai.com/?p=661</guid>
		<description><![CDATA[Javascript经典正则表达式 三道测试题： 1， var str=“ abbbbacc”; var rs=str.replace(“a”,”0”); (A)0bbbbacc (B)0bbbb0cc 2，var str=“ abbbbacc”; var rs=str.replace(“/a/”,”0”); (A)0bbbbacc (B)0bbbb0cc 3，var str=“ abbbbacc”; var rs=str.replace(“/a/g”,”0”); (A)0bbbbacc (B)0bbbb0cc 附注：String对象的replace方法签名为： replace(regx,str) 一，概述 1，正则表达式，可以说是任何一种编程语言都提供的机制，它主要是提供了对字符串的处理能力。 2，正则表达式在页面处理中的使用场景： 1）表单验证。验证某些域符合某种规则，例如邮件输入框必须输入的是邮件、联系电话输入框输入的必须是数字等等 2）处理DOM模型。例如通过表达式定位DOM中的一个对象或一系列对象，一个例子就是定位id属性中含有某个特殊字符的div对象。 3）纯编程逻辑。直接用于编程的逻辑之中。 3，说明：本部分所举的正则表达式的代码片断，都是经过测试的，但有一点需要注意，对于换行的字符串的定义，我们在表述时使用的是类似如下的形式： var str=“It’s is a beautiful city”； 这种形式直接写在JS代码中是错误的，那如何获取具有换行的字符串呢？简单的办法：在textarea中输入文本并换行，然后将该值赋给JS变量即可。例如： var str=document.forms[0].mytextarea.value; 二，语法与使用 1，定义正则表达式 1）定义正则表达式有两种形式，一种是普通方式，一种是构造函数方式。 2）普通方式：var reg=/表达式/附加参数 表达式：一个字符串，代表了某种规则，其中可以使用某些特殊字符，来代表特殊的规则，后面会详细说明。 附加参数：用来扩展表达式的含义，目前主要有三个参数： g：代表可以进行全局匹配。 i：代表不区分大小写匹配。 m：代表可以进行多行匹配。 上面三个参数，可以任意组合，代表复合含义，当然也可以不加参数。 例子： var [...]]]></description>
			<content:encoded><![CDATA[<p>Javascript经典<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f" title="查看 正则表达式 中的全部文章" target="_blank">正则表达式</a></span><br />
三道测试题：<br />
1， var str=“ abbbbacc”;<br />
var rs=str.replace(“a”,”0”);<br />
(A)0bbbbacc (B)0bbbb0cc<br />
2，var str=“ abbbbacc”;<br />
var rs=str.replace(“/a/”,”0”);<br />
(A)0bbbbacc (B)0bbbb0cc<br />
3，var str=“ abbbbacc”;<br />
var rs=str.replace(“/a/g”,”0”);<br />
(A)0bbbbacc (B)0bbbb0cc<br />
附注：String对象的replace方法签名为：<br />
replace(regx,str)</p>
<p>一，概述<br />
1，<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f" title="查看 正则表达式 中的全部文章" target="_blank">正则表达式</a></span>，可以说是任何一种编程语言都提供的机制，它主要是提供了对字符串的处理能力。<br />
2，<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f" title="查看 正则表达式 中的全部文章" target="_blank">正则表达式</a></span>在页面处理中的使用场景：<br />
1）表单验证。验证某些域符合某种规则，例如邮件输入框必须输入的是邮件、联系电话输入框输入的必须是数字等等<br />
2）处理DOM模型。例如通过表达式定位DOM中的一个对象或一系列对象，一个例子就是定位id属性中含有某个特殊字符的div对象。<br />
3）纯编程逻辑。直接用于编程的逻辑之中。<br />
3，说明：本部分所举的正则表达式的代码片断，都是经过测试的，但有一点需要注意，对于换行的字符串的定义，我们在表述时使用的是类似如下的形式：<br />
var str=“It’s is<br />
a  beautiful city”；<br />
这种形式直接写在JS代码中是错误的，那如何获取具有换行的字符串呢？简单的办法：在textarea中输入文本并换行，然后将该值赋给JS变量即可。例如：<br />
var str=document.forms[0].mytextarea.value;<br />
二，语法与使用<br />
1，定义正则表达式<br />
1）定义正则表达式有两种形式，一种是普通方式，一种是构造函数方式。<br />
2）普通方式：var reg=/表达式/附加参数<br />
表达式：一个字符串，代表了某种规则，其中可以使用某些特殊字符，来代表特殊的规则，后面会详细说明。<br />
附加参数：用来扩展表达式的含义，目前主要有三个参数：<br />
g：代表可以进行全局匹配。<br />
i：代表不区分大小写匹配。<br />
m：代表可以进行多行匹配。<br />
上面三个参数，可以任意组合，代表复合含义，当然也可以不加参数。<br />
例子：<br />
var reg=/a*b/;<br />
var reg=/abc+f/g;<br />
3）构造函数方式：var reg=new RegExp(“表达式”,”附加参数”);<br />
其中“表达式”与“附加参数”的含义与上面那种定义方式中的含义相同。<br />
例子：<br />
var reg=new RegExp(“a*b”);<br />
var reg=new RegExp(“abc+f”,”g”);<br />
4）普通方式与构造函数方式的区别<br />
普通方式中的表达式必须是一个常量字符串，而构造函数中的表达式可以是常量字符串，也可以是一个js变量，例如根据用户的输入来作为表达式参数等等：<br />
var reg=new RegExp(document.forms[0].exprfiled.value,”g”);<br />
2，表达式模式<br />
1）表达式模式，是指表达式的表达方式与样式， 即 var reg=/表达式/附加参数 中的“表达式”怎样去描述？<br />
2）从规范上讲，表达式模式分为简单模式和复合模式。<br />
3）简单模式：是指通过普通字符的组合来表达的模式，例如<br />
var reg=/abc0d/;<br />
可见简单模式只能表示具体的匹配。<br />
4）复合模式：是指含有通配符来表达的模式，例如：<br />
var reg=/a+b?\w/;<br />
其中的+、?和\w都属于通配符，代表着特殊的含义。因此复合模式可以表达更为抽象化的逻辑。<br />
下面我们着重说一下复合模式中各个通配符的含义及其使用。<br />
5)复合模式中特殊字符的讲解：<br />
1&gt;\：在许多编程语言里面被用作转义符，一般来说<br />
\符号后面如果跟的是普通字符c，那么\c就代表特殊的含义，例如n本来代表字符n，但\n就代表换行。<br />
\符号后面如果跟的是特殊字符c，那么\c就代表普通字符c，例如\一般用作转义符，但\\则调表普通字符\。<br />
Javascript的正则表达式中\的用法与上面相同，只是不同的编程语言，特殊字符表可能不太一样罢了。<br />
2&gt;^：匹配输入字符串的起始端，如果是多行匹配，即表达式的附加参数中含有m，则也在一个换行符后匹配。<br />
例子：/^B/匹配 “Bab Bc ”中的第一个B<br />
例子2：/^B/gm匹配<br />
“Badd B<br />
cdaf<br />
B dsfB”<br />
中的第一行第一个B，第三行中的第一个B</p>
<p>3&gt;$：匹配输入字符创的尾端，如果是多行匹配，即表达式的附加参数中含有m，则也在一个换行符前匹配。<br />
与^的用法相反。<br />
例子：/t$/匹配“bat”中的t，但是不匹配“hate”中的t<br />
例子2：/t$/匹配<br />
“tag at<br />
bat”<br />
中第一行的最后一个t和第二行的t。<br />
4&gt;*：匹配前一个字符0次或多次。<br />
例子：/ab*/匹配“dddabbbbc”中的“abbbb”，也匹配“ddda”中的“a”<br />
5&gt;+：匹配前一个字符1次或多次。<br />
例子：/ab+/匹配“dddabbbbc”中的“abbbb”，但不匹配“ddda”<br />
与后面的{1,}（原型：{n,}）的用法类似<br />
6&gt;?：?的用法比较特殊，一般来说它用来对前一个字符做0次或1次匹配，但是它有另外两种特殊的用法：<br />
如果紧跟在*、+、?和{ }之后，则表示原始匹配的最小次数匹配，例如：<br />
/ba*/本来匹配“bbbaaaa”中的“baaaa”，但是/ba*?/则匹配“bbbaaaa”中的“b”（因为*表示0次或多次匹配，而加?应该表示最少次数匹配，即0次匹配）。<br />
同理：/ba+?/则匹配“baaaa”中的“ba”。<br />
作为语法结构符号，使用于前置断言中，即后面要说到的x(?=y)和x(?!=y)<br />
7&gt;.：小数点中的“.”号，匹配任何一个单独的字符，但是换行符除外。<br />
标准中总共有哪些字符？请参考：字符集<br />
例如：/a.b/匹配“acbaa”中的“acb”，但是不匹配“abbb”。<br />
8&gt;(x)：表示匹配x(并非特指字符x或者特指一个字符，x表示一个字符串)，而且匹配会被记住，在语法中这种()被称为“capturing parentheses ”，即捕捉用的小括号。<br />
匹配会被记住，是因为在表达式提供的函数中，有些函数返回一个数组，该数组会保存所匹配的所有字符串，例如exec()函数。<br />
另外还要注意()中的x被记住的前提是匹配x。<br />
例子1：<br />
var regx=/a(b)c/;<br />
var rs=regx.exec(“abcddd”);<br />
从上面可以看出,/a(b)c/匹配“abcddd”中的“abc”，因为()的原因，b也会记录下来，因此rs返回的数字内容为：<br />
{abc,b}<br />
例子2：<br />
var regx=/a(b)c/;<br />
var rs=regx.exec(“acbcddd”);<br />
rs返回null，因为/a(b)c/不匹配“acbcddd”，所以()中的b不会被记录下来（尽管字符串中含有b）</p>
<p>9&gt;(?:x)：匹配x，但不会记住x，这种格式中的()被称为“non-capturing parentheses ”，即非捕捉用的小括号。<br />
例子：<br />
var regx=/a(?:b)c/;<br />
var rs=regx.exec(“abcddd”);<br />
从上面可以看出,/a(?:b)c/匹配“abcddd”中的“abc”，因为(?:)的原因，b不会记录下来，因此rs返回的数字内容为：<br />
{abc}<br />
10&gt;X(?=y)：匹配x，仅当后面紧跟着y时。如果符合匹配，则只有x会被记住，y不会被记住。<br />
例子：<br />
var regx=/user(?=name)/;<br />
var rs=regx.exec(“The username is Mary”);<br />
结果：匹配成功，而且rs的值为{user}<br />
11&gt;X(?!y)：匹配x，仅当后面不紧跟着y时。如果符合匹配，则只有x会被记住，y不会被记住。<br />
例子：<br />
var regx=/user(?!name)/;<br />
var rs=regx.exec(“The user name is Mary”);<br />
结果：匹配成功，而且rs的值为{user}<br />
例子2：<br />
var regx=/\d+(?!\.)/;<br />
var rs=regx.exec(“54.235”);<br />
结果：匹配成果，rs的值为{5}，不匹配54是因为54后面跟着“.”号，当然235也匹配，但是由于exec方法的行为，235不会被返回<br />
12&gt;x|y：匹配x或y。注意如果x和y都匹配上了，那么只记住x。<br />
例子：<br />
var regx=/beijing|shanghai/;<br />
var rs=regx.exec(“I love beijing and shanghai”);<br />
结果：匹配成功，rs的值为{beijing}，虽然shanghai也匹配，但不会被记住。<br />
13&gt;{n}：匹配前一个字符的n次出现。<br />
n必须是一个非负数，当然如果是一个负数或小数也不会报语法错误。<br />
例子：<br />
var regx=/ab{2}c/;<br />
var rs=regx.exec(“abbcd”);<br />
结果：匹配成功，rs的值为：{abbc}。<br />
14&gt;{n,}：匹配前一个字符的至少n次出现。<br />
例子：<br />
var regx=/ab{2,}c/;<br />
var rs=regx.exec(“abbcdabbbc”);<br />
结果：匹配成功，rs的值为：{abbc}。注意为什么abbbc也符合条件为什么没有被记住，这与exec方法的行为有关，后面会统一讲解。<br />
15&gt;{n,m}：匹配前一个字符的至少n次最多m次的出现。<br />
只要n与m为数字，而且m&gt;=n就不会报语法错误。<br />
例子：<br />
var regx=/ab{2,5}c/;<br />
var rs=regx.exec(“abbbcd”);<br />
结果：匹配成功，rs的值为：{abbbc}。<br />
例子2：<br />
var regx=/ab{2,2}c/;<br />
var rs=regx.exec(“abbcd”);<br />
结果：匹配成功，rs的值为：{abbc}。<br />
例子3：<br />
var regx=/ab(2,5)/;<br />
var rs=regx.exec(“abbbbbbbbbb”);<br />
结果：匹配成功，rs的值为：{abbbbb}，这说明，如果前一个字符出现多于m次，则只匹配m次。另外：<br />
var regx=/ab(2,5)c/;<br />
var rs=regx.exec(“abbbbbbbbbbc”);<br />
结果：匹配失败，rs的值为：null，为什么匹配失败，因为b多于5个则b(2,5)会匹配前5个b，，而表达式/ab(2,5)c/中b后面是c，但字符串中5个b之后还是b所以会报错。<br />
16&gt;[xyz]：xyz表示一个字符串，该模式表示匹配[]中的一个字符，形式上[xyz]等同于[x-z]。<br />
例子：<br />
var regx=/a[bc]d/;<br />
var rs=regx.exec(“abddgg”);<br />
结果：匹配成功，rs的值为：{abd}<br />
例子2：<br />
var regx=/a[bc]d/;<br />
var rs=regx.exec(“abcd”);<br />
结果：匹配失败，rs的值为：null，之所以失败，是因为[bc]表示匹配b或c中的一个，但不会同时匹配。<br />
17&gt;[^xyz]：该模式表示匹配非[]中的一个字符，形式上[^xyz]等同于[^x-z]。<br />
例子：<br />
var regx=/a[^bc]d/;<br />
var rs=regx.exec(“afddgg”);<br />
结果：匹配成功，rs的值为：{afd}<br />
例子2：<br />
var regx=/a[^bc]d/;<br />
var rs=regx.exec(“abd”);<br />
结果：匹配失败，rs的值为：。<br />
18&gt;[\b]：匹配退格键。<br />
19&gt;\b：匹配一个词的边界符，例如空格和换行符等等，当然匹配换行符时，表达式应该附加参数m。<br />
例子：<br />
var regx=/\bc./;<br />
var rs=regx.exec(“Beijing is a beautiful city”);<br />
结果：匹配成功，rs的值为：{ci}，注意c前边的空格不会匹配到结果中，即{ ci}是不正确的。<br />
20&gt;\B：代表一个非单词边界。<br />
例子：<br />
var regx=/\Bi./;<br />
var rs=regx.exec(“Beijing is a beautiful city”);<br />
结果：匹配成功，rs的值为：{ij}，即匹配了Beijing中的ij。<br />
21&gt;\cX，匹配一个控制字符。例如， \cM 匹配一个 Control-M 或<br />
回车符。 x 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一<br />
个原义的 ’c’ 字符。（实际的例子还需补充）<br />
21&gt;\d：匹配一个数字字符，等同于[0-9]。<br />
例子：<br />
var regx=/user\d/;<br />
var rs=regx.exec(“user1”);<br />
结果：匹配成功，rs的值为：{user1}<br />
22&gt;\D：匹配一个非数字字符，等同于[^0-9]。<br />
例子：<br />
var regx=/user\D/;<br />
var rs=regx.exec(“userA”);<br />
结果：匹配成功，rs的值为：{userA}<br />
23&gt;\f：匹配一个换页符。<br />
24&gt;\n：匹配一个换行符。因为是换行符，所以在表达式中要加入m参数。<br />
例子：<br />
var regx=/a\nbc/m;<br />
var str=“a<br />
bc”;<br />
var rs=regx.exec(str);<br />
结果：匹配成功，rs的值为：{  }，如果表达式为/a\n\rbc/，则不会被匹配，因此在一般的编辑器中一个”Enter”键代表着“回车换行”，而非“换行回车”，至少在textarea域中是这样的。<br />
25&gt;\r：匹配一个回车符<br />
26&gt;\s：匹配一个空格符，等同于[ \f\n\r\t\v\u00A0\u2028\u2029].<br />
例子：<br />
var regx=/\si/;<br />
var rs=regx.exec(“Beijing is a city”);<br />
结果：匹配成功，rs的值为：{ i}<br />
27&gt;\S：匹配一个非空格符，等同于[ ^\f\n\r\t\v\u00A0\u2028\u2029].<br />
例子：<br />
var regx=/\Si/;<br />
var rs=regx.exec(“Beijing is a city”);<br />
结果：匹配成功，rs的值为：{ei}<br />
28&gt;\t：匹配一个tab<br />
例子：<br />
var regx=/a\tb/;<br />
var rs=regx.exec(“a bc”);<br />
结果：匹配成功，rs的值为： {a       bc}<br />
29&gt;\v：匹配一个竖向的tab<br />
30&gt;\w：匹配一个数字、_或字母表字符，即[A-Za-z0-9_ ]。<br />
例子：<br />
var regx=/\w/;<br />
var rs=regx.exec(“$25.23”);<br />
结果：匹配成功，rs的值为：{2}<br />
31&gt;\W：匹配一个非数字、_或字母表字符，即[^A-Za-z0-9_ ]。<br />
例子：<br />
var regx=/\w/;<br />
var rs=regx.exec(“$25.23”);<br />
结果：匹配成功，rs的值为：{$}<br />
32&gt;\n：注意不是\n，这里n是一个正整数，表示匹配第n个()中的字符。<br />
例子：<br />
var regx=/user([,-])group\1role/;<br />
var rs=regx.exec(“user-group-role”);<br />
结果：匹配成功，rs的值为：{user-group-role,-}，同样对user,group,role的匹配也是成功的，但像user-group,role等就不对了。<br />
33&gt;\0：匹配一个NUL字符。<br />
34&gt;\xhh：匹配一个由两位16进制数字所表达的字符。<br />
35&gt;\uhhhh：匹配一个由四位16进制数字所表达的字符。</p>
<p>3，表达式操作<br />
1）表达式操作，在这里是指和表达式相关的方法，我们将介绍六个方法。<br />
2）表达式对象（RegExp）方法：<br />
1&gt;exec(str)，返回str中与表达式相匹配的第一个字符串，而且以数组的形式表现，当然如果表达式中含有捕捉用的小括号，则返回的数组中也可能含有()中的匹配字符串，例如：<br />
var regx=/\d+/;<br />
var rs=regx.exec(“3432ddf53”);<br />
返回的rs值为：{3432}<br />
var regx2=new RegExp(“ab(\d+)c”);<br />
var rs2=regx2.exec(“ab234c44”);<br />
返回的rs值为：{ab234c,234}<br />
另外，如果有多个合适的匹配，则第一次执行exec返回一个第一个匹配，此时继续执行exec，则依次返回第二个第三个匹配。例如：<br />
var regx=/user\d/g;<br />
var rs=regx.exec(“ddduser1dsfuser2dd”);<br />
var rs1=regx.exec(“ddduser1dsfuser2dd”);<br />
则rs的值为{user1}，rs的值为{rs2}，当然注意regx中的g参数是必须的，否则无论exec执行多少次，都返回第一个匹配。后面还有相关内容涉及到对此想象的解释。<br />
2&gt;test(str)，判断字符串str是否匹配表达式，返回一个布尔值。例如：<br />
var regx=/user\d+/g;<br />
var flag=regx.test(“user12dd”);<br />
flag的值为true。<br />
3）String对象方法<br />
1&gt;match(expr)，返回与expr相匹配的一个字符串数组，如果没有加参数g，则返回第一个匹配，加入参数g则返回所有的匹配<br />
例子：<br />
var regx=/user\d/g;<br />
var str=“user13userddduser345”;<br />
var rs=str.match(regx);<br />
rs的值为：{user1,user3}<br />
2&gt;search(expr)，返回字符串中与expr相匹配的第一个匹配的index值。<br />
例子：<br />
var regx=/user\d/g;<br />
var str=“user13userddduser345”;<br />
var rs=str.search(regx);<br />
rs的值为：0<br />
3&gt;replace(expr,str)，将字符串中匹配expr的部分<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e6%9b%bf%e6%8d%a2" title="查看 替换 中的全部文章" target="_blank">替换</a></span>为str。另外在replace方法中，str中可以含有一种变量符号$，格式为$n，代表匹配中被记住的第n的匹配字符串（注意小括号可以记忆匹配）。<br />
例子：<br />
var regx=/user\d/g;<br />
var str=“user13userddduser345”;<br />
var rs=str.replace(regx,”00”);<br />
rs的值为：003userddd0045<br />
例子2：<br />
var regx=/u(se)r\d/g;<br />
var str=“user13userddduser345”;<br />
var rs=str.replace(regx,”$1”);<br />
rs的值为：se3userdddse45<br />
对于replace(expr,str)方法还要特别注意一点，如果expr是一个表达式对象则会进行全局<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e6%9b%bf%e6%8d%a2" title="查看 替换 中的全部文章" target="_blank">替换</a></span>（此时表达式必须附加参数g，否则也只是<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e6%9b%bf%e6%8d%a2" title="查看 替换 中的全部文章" target="_blank">替换</a></span>第一个匹配），如果expr是一个字符串对象，则只会替换第一个匹配的部分，例如：<br />
var regx=“user”<br />
var str=“user13userddduser345”;<br />
var rs=str.replace(regx,”00”);<br />
rs的值为： 0013userddduser345<br />
4&gt;split(expr)，将字符串以匹配expr的部分做分割，返回一个数组，而且表达式是否附加参数g都没有关系，结果是一样的。<br />
例子：<br />
var regx=/user\d/g;<br />
var str=“user13userddduser345”;<br />
var rs=str.split(regx);<br />
rs的值为：{3userddd,45}<br />
4，表达式相关属性<br />
1）表达式相关属性，是指和表达式相关的属性，如下面的形式：<br />
var regx=/myexpr/;<br />
var rs=regx.exec(str);<br />
其中，和表达式自身regx相关的属性有两个，和表达式匹配结果rs相关的属性有三个，下面将逐一介绍。<br />
2）和表达式自身相关的两个属性：<br />
1&gt;lastIndex，返回开始下一个匹配的位置，注意必须是全局匹配（表达式中带有g参数）时，lastIndex才会有不断返回下一个匹配值，否则该值为总是返回第一个下一个匹配位置，例如：<br />
var regx=/user\d/;<br />
var rs=regx.exec(“sdsfuser1dfsfuser2”);<br />
var lastIndex1=regx.lastIndex;<br />
rs=regx.exec(“sdsfuser1dfsfuser2”);<br />
var lastIndex2=regx.lastIndex;<br />
rs=regx.exec(“sdsfuser1dfsfuser2”);<br />
var lastIndex3=regx.lastIndex;<br />
上面lastIndex1为9，第二个lastIndex2也为9，第三个也是9；如果regx=/user\d/g，则第一个为9，第二个为18，第三个为0。<br />
2&gt;source，返回表达式字符串自身。例如：<br />
var regx=/user\d/;<br />
var rs=regx.exec(“sdsfuser1dfsfuser2”);<br />
var source=regx.source;<br />
source的值为user\d<br />
3）和匹配结果相关的三个属性：<br />
1&gt;index，返回当前匹配的位置。例如：<br />
var regx=/user\d/;<br />
var rs=regx.exec(“sdsfuser1dfsfuser2”);<br />
var index1=rs.index;<br />
rs=regx.exec(“sdsfuser1dfsfuser2”);<br />
var index2=rs.index;<br />
rs=regx.exec(“sdsfuser1dfsfuser2”);<br />
var index3=rs.index;<br />
index1为4，index2为4，index3为4，如果表达式加入参数g，则index1为4，index2为13，index3会报错（index为空或不是对象）。<br />
2&gt;input，用于匹配的字符串。例如：<br />
var regx=/user\d/;<br />
var rs=regx.exec(“sdsfuser1dfsfuser2”);<br />
var input=rs.input;<br />
input的值为sdsfuser1dfsfuser2。<br />
3&gt;[0]，返回匹配结果中的第一个匹配值，对于match而言可能返回一个多值的数字，则除了[0]外，还可以取[1]、[2]等等。例如：<br />
var regx=/user\d/;<br />
var rs=regx.exec(“sdsfuser1dfsfuser2”);<br />
var value1=rs[0];<br />
rs=regx.exec(“sdsfuser1dfsfuser2”);<br />
var value2=rs[0];<br />
value1的值为user1,value2的值为user2<br />
5，实际应用</p>
<div id="_mcePaste">1）实际应用一</div>
<div id="_mcePaste">描述：有一表单，其中有一个“用户名”input域</div>
<div id="_mcePaste">要求：汉字，而且不能少于2个汉字，不能多于4个汉字。</div>
<div id="_mcePaste">实现：</div>
<div id="_mcePaste">&lt;script&gt;</div>
<div id="_mcePaste">function checkForm(obj){</div>
<div id="_mcePaste">var username=obj.username.value;</div>
<div id="_mcePaste">var regx=/^[\u4e00-\u9fa5]{2,4}$/g</div>
<div id="_mcePaste">if(!regx.test(username)){</div>
<div id="_mcePaste">alert(“Invalid username!”);</div>
<div id="_mcePaste">return false;</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">return true;</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">&lt;/script&gt;</div>
<div id="_mcePaste">&lt;form name=“myForm”onSubmit=“return checkForm(this)”&gt;</div>
<div id="_mcePaste">&lt;input type=“text” name=“username”/&gt;</div>
<div id="_mcePaste">&lt;input type=“submit” vlaue=“submit”/&gt;</div>
<div id="_mcePaste">&lt;/form&gt;</div>
<div id="_mcePaste">2）实际应用二</div>
<div id="_mcePaste">描述：给定一个含有html标记的字符串，要求将其中的html标记去掉。</div>
<div id="_mcePaste">实现：</div>
<div id="_mcePaste">&lt;script&gt;</div>
<div id="_mcePaste">function toPlainText(htmlStr){</div>
<div id="_mcePaste">var regx=/&lt;[^&gt;]*&gt;|&lt;\/[^&gt;]*&gt;/gm;</div>
<div id="_mcePaste">var str=htmlStr.replace(regx,”");</div>
<div id="_mcePaste">return str;</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">&lt;/script&gt;</div>
<div id="_mcePaste">&lt;form name=“myForm”&gt;</div>
<div id="_mcePaste">&lt;textarea id=“htmlInput”&gt;&lt;/textarea&gt;</div>
<div id="_mcePaste">&lt;input type=“button” value=“submit” onclick=“toPlainText(document.getElementById(‘htmlInput’).value”/&gt;</div>
<div id="_mcePaste">&lt;/form&gt;</div>
<p>1）实际应用一描述：有一表单，其中有一个“用户名”input域要求：汉字，而且不能少于2个汉字，不能多于4个汉字。实现：&lt;script&gt;function checkForm(obj){     var username=obj.username.value;     var regx=/^[\u4e00-\u9fa5]{2,4}$/g     if(!regx.test(username)){               alert(“Invalid username!”);               return false;      }     return true;}&lt;/script&gt;&lt;form name=“myForm”onSubmit=“return checkForm(this)”&gt;    &lt;input type=“text” name=“username”/&gt;    &lt;input type=“submit” vlaue=“submit”/&gt;&lt;/form&gt;2）实际应用二描述：给定一个含有html标记的字符串，要求将其中的html标记去掉。实现：&lt;script&gt;function toPlainText(htmlStr){     var regx=/&lt;[^&gt;]*&gt;|&lt;\/[^&gt;]*&gt;/gm;     var str=htmlStr.replace(regx,”");     return str;}&lt;/script&gt;&lt;form name=“myForm”&gt;    &lt;textarea id=“htmlInput”&gt;&lt;/textarea&gt;    &lt;input type=“button” value=“submit” onclick=“toPlainText(document.getElementById(‘htmlInput’).value”/&gt;&lt;/form&gt;</p>
<p>三，小结<br />
1，Javascript正则表达式，我想在一般的程序员之中，使用者应该不是很多，因为我们处理的页面一般都不是很复杂，而复杂的逻辑一般我们都在后台处理完成了。但是目前趋势已经出现了扭转，富客户端已经被越来越多的人接受，而Javascript就是其中的关键技术，对于复杂的客户端逻辑而言，正则表达式的作用也是很关键的，同时它也是Javascript高手必须要掌握的重要技术之一。<br />
2，为了能够便于大家对前面讲述的内容有一个更为综合和深刻的认识，我将前面的一些关键点和容易犯糊涂的地方再系统总结一下，这部分很关键！<br />
总结1：附件参数g的用法<br />
表达式加上参数g之后，表明可以进行全局匹配，注意这里“可以”的含义。我们详细叙述：<br />
1）对于表达式对象的exec方法，不加入g，则只返回第一个匹配，无论执行多少次均是如此，如果加入g，则第一次执行也返回第一个匹配，再执行返回第二个匹配，依次类推。例如<br />
var regx=/user\d/;<br />
var str=“user18dsdfuser2dsfsd”;<br />
var rs=regx.exec(str);//此时rs的值为{user1}<br />
var rs2=regx.exec(str);//此时rs的值依然为{user1}<br />
如果regx=/user\d/g；则rs的值为{user1}，rs2的值为{user2}<br />
通过这个例子说明：对于exec方法，表达式加入了g，并不是说执行exec方法就可以返回所有的匹配，而是说加入了g之后，我可以通过某种方式得到所有的匹配，这里的“方式”对于exec而言，就是依次执行这个方法即可。<br />
2）对于表达式对象的test方法，加入g于不加上g没有什么区别。<br />
3）对于String对象的match方法，不加入g，也只是返回第一个匹配，一直执行match方法也总是返回第一个匹配，加入g，则一次返回所有的匹配（注意这与表达式对象的exec方法不同，对于exec而言，表达式即使加上了g，也不会一次返回所有的匹配）。例如：<br />
var regx=/user\d/;<br />
var str=“user1sdfsffuser2dfsdf”;<br />
var rs=str.match(regx);//此时rs的值为{user1}<br />
var rs2=str.match(regx);//此时rs的值依然为{user1}<br />
如果regx=/user\d/g，则rs的值为{user1,user2}，rs2的值也为{user1,user2}<br />
4）对于String对象的replace方法，表达式不加入g，则只替换第一个匹配，如果加入g，则替换所有匹配。（开头的三道测试题能很好的说明这一点）<br />
5）对于String对象的split方法，加上g与不加g是一样的，即：<br />
var sep=/user\d/;<br />
var array=“user1dfsfuser2dfsf”.split(sep);<br />
则array的值为{dfsf, dfsf}<br />
此时sep=/user\d/g，返回值是一样的。<br />
6）对于String对象的search方法，加不加g也是一样的。<br />
总结2：附加参数m的用法<br />
附加参数m，表明可以进行多行匹配，但是这个只有当使用^和$模式时才会起作用，在其他的模式中，加不加入m都可以进行多行匹配（其实说多行的字符串也是一个普通字符串），我们举例说明这一点<br />
1）使用^的例子<br />
var regx=/^b./g;<br />
var str=“bd76 dfsdf<br />
sdfsdfs dffs<br />
b76dsf  sdfsdf”;<br />
var rs=str.match(regx);<br />
此时加入g和不加入g，都只返回第一个匹配{bd}，如果regx=/^b./gm，则返回所有的匹配{bd,b7}，注意如果regx=/^b./m，则也只返回第一个匹配。所以，加入m表明可以进行多行匹配，加入g表明可以进行全局匹配，综合到一起就是可以进行多行全局匹配<br />
2）使用其他模式的例子，例如<br />
var regx=/user\d/;<br />
var str=“sdfsfsdfsdf<br />
sdfsuser3 dffs<br />
b76dsf  user6”;<br />
var rs=str.match(regx);<br />
此时不加参数g，则返回{user3}，加入参数g返回{user3,user6}，加不加入m对此没有影响。<br />
3）因此对于m我们要清楚它的使用，记住它只对^和$模式起作用，在这两种模式中，m的作用为：如果不加入m，则只能在第一行进行匹配，如果加入m则可以在所有的行进行匹配。我们再看一个^的例子<br />
var regx=/^b./;<br />
var str=“ret76 dfsdf<br />
bjfsdfs dffs<br />
b76dsf  sdfsdf”;<br />
var rs=str.match(regx);<br />
此时rs的值为null，如果加入g，rs的值仍然为null，如果加入m，则rs的值为{bj}（也就是说，在第一行没有找到匹配，因为有参数m，所以可以继续去下面的行去找是否有匹配），如果m和g都加上，则返回{bj,b7}（只加m不加g说明，可以去多行进行匹配，但是找到一个匹配后就返回，加入g 表明将多行中所有的匹配返回，当然对于match方法是如此，对于exec呢，则需要执行多次才能依次返回）<br />
总结3：在HTML的textarea输入域中，按一个Enter键，对应的控制字符为“\r\n”，即“回车换行”，而不是“\n\r”，即“换行回车”，我们看一个前面我们举过的例子：<br />
var regx=/a\r\nbc/;<br />
var str=“a<br />
bc”;<br />
var rs=regx.exec(str);<br />
结果：匹配成功，rs的值为：{      }，如果表达式为/a\n\rbc/，则不会被匹配，因此在一般的编辑器中一个”Enter”键代表着“回车换行”，而非“换行回车”，至少在textarea域中是这样的。</p>
<h2  class="related_post_title">您可能感兴趣的文章</h2><ul class="related_post"><li><a href="http://www.52shidai.com/web-front/801.html" title="Web 前端优化最佳实践之 JavaScript 篇">Web 前端优化最佳实践之 JavaScript 篇</a></li><li><a href="http://www.52shidai.com/javascript/759.html" title="31个Javascript的实用工具">31个Javascript的实用工具</a></li><li><a href="http://www.52shidai.com/javascript/614.html" title="高质量JavaScript代码书写基本要点|值得收藏">高质量JavaScript代码书写基本要点|值得收藏</a></li><li><a href="http://www.52shidai.com/javascript/609.html" title="javascript的正则表达式集合">javascript的正则表达式集合</a></li><li><a href="http://www.52shidai.com/javascript/585.html" title="js入门学习：Javascript的学习笔记">js入门学习：Javascript的学习笔记</a></li><li><a href="http://www.52shidai.com/javascript/583.html" title="学习JavaScript三件必须了解的事">学习JavaScript三件必须了解的事</a></li><li><a href="http://www.52shidai.com/javascript/556.html" title="JavaScript操作iframe里的dom">JavaScript操作iframe里的dom</a></li><li><a href="http://www.52shidai.com/javascript/323.html" title="javascript中的107个基础知识收集整理">javascript中的107个基础知识收集整理</a></li><li><a href="http://www.52shidai.com/javascript/62.html" title="JavaScript面向对象之静态与非静态类">JavaScript面向对象之静态与非静态类</a></li><li><a href="http://www.52shidai.com/javascript/56.html" title="JavaScript trim函数的十二种实现">JavaScript trim函数的十二种实现</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.52shidai.com/javascript/661.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>高质量JavaScript代码书写基本要点&#124;值得收藏</title>
		<link>http://www.52shidai.com/javascript/614.html</link>
		<comments>http://www.52shidai.com/javascript/614.html#comments</comments>
		<pubDate>Tue, 09 Nov 2010 10:45:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[作用域]]></category>
		<category><![CDATA[函数]]></category>
		<category><![CDATA[原型]]></category>
		<category><![CDATA[变量]]></category>
		<category><![CDATA[命名]]></category>
		<category><![CDATA[对象]]></category>
		<category><![CDATA[循环]]></category>
		<category><![CDATA[扩展性]]></category>
		<category><![CDATA[注释]]></category>
		<category><![CDATA[空格]]></category>
		<category><![CDATA[类型转换]]></category>
		<category><![CDATA[缩进]]></category>
		<category><![CDATA[翻译]]></category>
		<category><![CDATA[规范]]></category>

		<guid isPermaLink="false">http://www.52shidai.com/?p=614</guid>
		<description><![CDATA[才华横溢的Stoyan Stefanov，在他写的由O’Reilly初版的新书《JavaScript Patterns》(JavaScript模式)中，我想要是为我们的读者贡献其摘要，那会是件很美妙的事情。具体一点就是编写高质量JavaScript的一些要素，例如避免全局变量，使用单变量声明，在循环中预缓存length(长度)，遵循代码阅读，以及更多。 此摘要也包括一些与代码不太相关的习惯，但对整体代码的创建息息相关，包括撰写API文档、执行同行评审以及运行JSLint。这些习惯和最佳做法可以帮助你写出更好的，更易于理解和维护的代码，这些代码在几个月或是几年之后再回过头看看也是会觉得很自豪的。 书写可维护的代码(Writing Maintainable Code ) 软件bug的修复是昂贵的，并且随着时间的推移，这些bug的成本也会增加，尤其当这些bug潜伏并慢慢出现在已经发布的软件中时。当你发现bug的时候就立即修复它是最好的，此时你代码要解决的问题在你脑中还是很清晰的。否则，你转移到其他任务，忘了那个特定的代码，一段时间后再去查看这些代码就需要： 花时间学习和理解这个问题 化时间是了解应该解决的问题代码 还有问题，特别对于大的项目或是公司，修复bug的这位伙计不是写代码的那个人（且发现bug和修复bug的不是同一个人）。因此，必须降低理解代码花费的时间，无论是一段时间前你自己写的代码还是团队中的其他成员写的代码。这关系到底线（营业收入）和开发人员的幸福，因为我们更应该去开发新的激动人心的事物而不是花几小时几天的时间去维护遗留代码。 另一个相关软件开发生命的事实是，读代码花费的时间要比写来得多。有时候，当你专注并深入思考某个问题的时候，你可以坐下来，一个下午写大量的代码。 你的代码很能很快就工作了，但是，随着应用的成熟，还会有很多其他的事情发生，这就要求你的进行进行审查，修改，和调整。例如： bug是暴露的 新功能被添加到应用程序 程序在新的环境下工作（例如，市场上出现新想浏览器） 代码改变用途 代码得完全从头重新，或移植到另一个架构上或者甚至使用另一种语言 由于这些变化，很少人力数小时写的代码最终演变成花数周来阅读这些代码。这就是为什么创建可维护的代码对应用程序的成功至关重要。 可维护的代码意味着： 可读的 一致的 可预测的 看上去就像是同一个人写的 已记录 最小全局变量(Minimizing Globals) JavaScript通过函数管理作用域。在函数内部声明的变量只在这个函数内部，函数外面不可用。另一方面，全局变量就是在任何函数外面声明的或是未声明直接简单使用的。 每个JavaScript环境有一个全局对象，当你在任意的函数外面使用this的时候可以访问到。你创建的每一个全部变量都成了这个全局对象的属性。在浏览器中，方便起见，该全局对象有个附加属性叫做window，此window(通常)指向该全局对象本身。下面的代码片段显示了如何在浏览器环境中创建和访问的全局变量： myglobal = “hello”; // 不推荐写法 console.log(myglobal); // “hello” console.log(window.myglobal); // “hello” console.log(window["myglobal"]); // “hello” console.log(this.myglobal); // “hello” 全局变量的问题 全局变量的问题在于，你的JavaScript应用程序和web页面上的所有代码都共享了这些全局变量，他们住在同一个全局命名空间，所以当程序的两个不同部分定义同名但不同作用的全局变量的时候，命名冲突在所难免。 web页面包含不是该页面开发者所写的代码也是比较常见的，例如： 第三方的JavaScript库 广告方的脚本代码 第三方用户跟踪和分析脚本代码 不同类型的小组件，标志和按钮 比方说，该第三方脚本定义了一个全局变量，叫做result；接着，在你的函数中也定义一个名为result的全局变量。其结果就是后面的变量覆盖前面的，第三方脚本就一下子嗝屁啦！ [...]]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste">才华横溢的Stoyan Stefanov，在他写的由O’Reilly初版的新书《<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/javascript" title="查看 JavaScript 中的全部文章" target="_blank">JavaScript</a></span> Patterns》(<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/javascript" title="查看 JavaScript 中的全部文章" target="_blank">JavaScript</a></span>模式)中，我想要是为我们的读者贡献其摘要，那会是件很美妙的事情。具体一点就是编写高质量<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/javascript" title="查看 JavaScript 中的全部文章" target="_blank">JavaScript</a></span>的一些要素，例如避免全局<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e5%8f%98%e9%87%8f" title="查看 变量 中的全部文章" target="_blank">变量</a></span>，使用单<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e5%8f%98%e9%87%8f" title="查看 变量 中的全部文章" target="_blank">变量</a></span>声明，在<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e5%be%aa%e7%8e%af" title="查看 循环 中的全部文章" target="_blank">循环</a></span>中预缓存length(长度)，遵循代码阅读，以及更多。</div>
<div></div>
<div id="_mcePaste">此摘要也包括一些与代码不太相关的习惯，但对整体代码的创建息息相关，包括撰写API文档、执行同行评审以及运行JSLint。这些习惯和最佳做法可以帮助你写出更好的，更易于理解和维护的代码，这些代码在几个月或是几年之后再回过头看看也是会觉得很自豪的。</div>
<div></div>
<div id="_mcePaste"><strong>书写可维护的代码(Writing Maintainable Code )</strong></div>
<div></div>
<div id="_mcePaste">软件bug的修复是昂贵的，并且随着时间的推移，这些bug的成本也会增加，尤其当这些bug潜伏并慢慢出现在已经发布的软件中时。当你发现bug的时候就立即修复它是最好的，此时你代码要解决的问题在你脑中还是很清晰的。否则，你转移到其他任务，忘了那个特定的代码，一段时间后再去查看这些代码就需要：</div>
<div></div>
<div id="_mcePaste">花时间学习和理解这个问题</div>
<div></div>
<div id="_mcePaste">化时间是了解应该解决的问题代码</div>
<div></div>
<div id="_mcePaste">还有问题，特别对于大的项目或是公司，修复bug的这位伙计不是写代码的那个人（且发现bug和修复bug的不是同一个人）。因此，必须降低理解代码花费的时间，无论是一段时间前你自己写的代码还是团队中的其他成员写的代码。这关系到底线（营业收入）和开发人员的幸福，因为我们更应该去开发新的激动人心的事物而不是花几小时几天的时间去维护遗留代码。</div>
<div></div>
<div id="_mcePaste">另一个相关软件开发生命的事实是，读代码花费的时间要比写来得多。有时候，当你专注并深入思考某个问题的时候，你可以坐下来，一个下午写大量的代码。</div>
<div></div>
<div id="_mcePaste">你的代码很能很快就工作了，但是，随着应用的成熟，还会有很多其他的事情发生，这就要求你的进行进行审查，修改，和调整。例如：</div>
<div id="_mcePaste">bug是暴露的</div>
<div></div>
<div id="_mcePaste">新功能被添加到应用程序</div>
<div></div>
<div id="_mcePaste">程序在新的环境下工作（例如，市场上出现新想浏览器）</div>
<div></div>
<div id="_mcePaste">代码改变用途</div>
<div></div>
<div id="_mcePaste">代码得完全从头重新，或移植到另一个架构上或者甚至使用另一种语言</div>
<div></div>
<div id="_mcePaste">由于这些变化，很少人力数小时写的代码最终演变成花数周来阅读这些代码。这就是为什么创建可维护的代码对应用程序的成功至关重要。</div>
<div></div>
<div id="_mcePaste">可维护的代码意味着：</div>
<div></div>
<div id="_mcePaste">可读的</div>
<div id="_mcePaste">一致的</div>
<div id="_mcePaste">可预测的</div>
<div id="_mcePaste">看上去就像是同一个人写的</div>
<div id="_mcePaste">已记录</div>
<div></div>
<div id="_mcePaste"><strong>最小全局变量(Minimizing Globals)</strong></div>
<div id="_mcePaste">JavaScript通过<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e5%87%bd%e6%95%b0" title="查看 函数 中的全部文章" target="_blank">函数</a></span>管理<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e4%bd%9c%e7%94%a8%e5%9f%9f" title="查看 作用域 中的全部文章" target="_blank">作用域</a></span>。在<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e5%87%bd%e6%95%b0" title="查看 函数 中的全部文章" target="_blank">函数</a></span>内部声明的变量只在这个函数内部，函数外面不可用。另一方面，全局变量就是在任何函数外面声明的或是未声明直接简单使用的。</div>
<div></div>
<div id="_mcePaste">每个JavaScript环境有一个全局<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e5%af%b9%e8%b1%a1" title="查看 对象 中的全部文章" target="_blank">对象</a></span>，当你在任意的函数外面使用this的时候可以访问到。你创建的每一个全部变量都成了这个全局<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e5%af%b9%e8%b1%a1" title="查看 对象 中的全部文章" target="_blank">对象</a></span>的属性。在浏览器中，方便起见，该全局<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e5%af%b9%e8%b1%a1" title="查看 对象 中的全部文章" target="_blank">对象</a></span>有个附加属性叫做window，此window(通常)指向该全局对象本身。下面的代码片段显示了如何在浏览器环境中创建和访问的全局变量：</div>
<div></div>
<div id="_mcePaste">myglobal = “hello”; // 不推荐写法</div>
<div id="_mcePaste">console.log(myglobal); // “hello”</div>
<div id="_mcePaste">console.log(window.myglobal); // “hello”</div>
<div id="_mcePaste">console.log(window["myglobal"]); // “hello”</div>
<div id="_mcePaste">console.log(this.myglobal); // “hello”</div>
<div></div>
<div id="_mcePaste"><strong>全局变量的问题</strong></div>
<div></div>
<div id="_mcePaste">全局变量的问题在于，你的JavaScript应用程序和web页面上的所有代码都共享了这些全局变量，他们住在同一个全局<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e5%91%bd%e5%90%8d" title="查看 命名 中的全部文章" target="_blank">命名</a></span>空间，所以当程序的两个不同部分定义同名但不同作用的全局变量的时候，<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e5%91%bd%e5%90%8d" title="查看 命名 中的全部文章" target="_blank">命名</a></span>冲突在所难免。</div>
<div></div>
<div id="_mcePaste">web页面包含不是该页面开发者所写的代码也是比较常见的，例如：</div>
<div></div>
<div id="_mcePaste">第三方的JavaScript库</div>
<div id="_mcePaste">广告方的脚本代码</div>
<div id="_mcePaste">第三方用户跟踪和分析脚本代码</div>
<div id="_mcePaste">不同类型的小组件，标志和按钮</div>
<div></div>
<div id="_mcePaste">比方说，该第三方脚本定义了一个全局变量，叫做result；接着，在你的函数中也定义一个名为result的全局变量。其结果就是后面的变量覆盖前面的，第三方脚本就一下子嗝屁啦！</div>
<div></div>
<div id="_mcePaste">因此，要想和其他脚本成为好邻居的话，尽可能少的使用全局变量是很重要的。在书中后面提到的一些减少全局变量的策略，例如<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e5%91%bd%e5%90%8d" title="查看 命名 中的全部文章" target="_blank">命名</a></span>空间模式或是函数立即自动执行，但是要想让全局变量少最重要的还是始终使用var来声明变量。</div>
<div></div>
<div id="_mcePaste">由于JavaScript的两个特征，不自觉地创建出全局变量是出乎意料的容易。首先，你可以甚至不需要声明就可以使用变量；第二，JavaScript有隐含的全局概念，意味着你不声明的任何变量都会成为一个全局对象属性。参考下面的代码：</div>
<div></div>
<div id="_mcePaste">function sum(x, y) {</div>
<div id="_mcePaste">// 不推荐写法: 隐式全局变量</div>
<div id="_mcePaste">result = x + y;</div>
<div id="_mcePaste">return result;</div>
<div id="_mcePaste">}</div>
<div></div>
<div id="_mcePaste">此段代码中的result没有声明。代码照样运作正常，但在调用函数后你最后的结果就多一个全局命名空间，这可以是一个问题的根源。</div>
<div></div>
<div id="_mcePaste">经验法则是始终使用var声明变量，正如改进版的sum()函数所演示的：</div>
<div></div>
<div id="_mcePaste">function sum(x, y) {</div>
<div id="_mcePaste">var result = x + y;</div>
<div id="_mcePaste">return result;</div>
<div id="_mcePaste">}</div>
<div></div>
<div id="_mcePaste">另一个创建隐式全局变量的反例就是使用任务链进行部分var声明。下面的片段中，a是本地变量但是b确实全局变量，这可能不是你希望发生的：</div>
<div></div>
<div id="_mcePaste">// 反例，勿使用</div>
<div id="_mcePaste">function foo() {</div>
<div id="_mcePaste">var a = b = 0;</div>
<div id="_mcePaste">// &#8230;</div>
<div id="_mcePaste">}</div>
<div></div>
<div id="_mcePaste">此现象发生的原因在于这个从右到左的赋值，首先，是赋值表达式b = 0，此情况下b是未声明的。这个表达式的返回值是0，然后这个0就分配给了通过var定义的这个局部变量a。换句话说，就好比你输入了：</div>
<div></div>
<div id="_mcePaste">var a = (b = 0);</div>
<div></div>
<div id="_mcePaste">如果你已经准备好声明变量，使用链分配是比较好的做法，不会产生任何意料之外的全局变量，如：</div>
<div></div>
<div id="_mcePaste">function foo() {</div>
<div id="_mcePaste">var a, b;</div>
<div id="_mcePaste">// &#8230; a = b = 0; // 两个均局部变量</div>
<div id="_mcePaste">}</div>
<div></div>
<div id="_mcePaste">然而，另外一个避免全局变量的原因是可移植性。如果你想你的代码在不同的环境下（主机下）运行，使用全局变量如履薄冰，因为你会无意中覆盖你最初环境下不存在的主机对象（所以你原以为名称可以放心大胆地使用，实际上对于有些情况并不适用）。</div>
<div></div>
<div id="_mcePaste"><strong>忘记var的副作用(Side Effects When Forgetting var)</strong></div>
<div></div>
<div id="_mcePaste">隐式全局变量和明确定义的全局变量间有些小的差异，就是通过delete操作符让变量未定义的能力。</div>
<div></div>
<div id="_mcePaste">通过var创建的全局变量（任何函数之外的程序中创建）是不能被删除的。</div>
<div></div>
<div id="_mcePaste">无var创建的隐式全局变量（无视是否在函数中创建）是能被删除的。</div>
<div></div>
<div id="_mcePaste">这表明，在技术上，隐式全局变量并不是真正的全局变量，但它们是全局对象的属性。属性是可以通过delete操作符删除的，而变量是不能的：</div>
<div></div>
<div id="_mcePaste">// 定义三个全局变量</div>
<div id="_mcePaste">var global_var = 1;</div>
<div id="_mcePaste">global_novar = 2; // 反面教材</div>
<div id="_mcePaste">(function () {</div>
<div id="_mcePaste">global_fromfunc = 3; // 反面教材</div>
<div id="_mcePaste">}());</div>
<div id="_mcePaste">// 试图删除</div>
<div id="_mcePaste">delete global_var; // false</div>
<div id="_mcePaste">delete global_novar; // true</div>
<div id="_mcePaste">delete global_fromfunc; // true</div>
<div id="_mcePaste">// 测试该删除</div>
<div id="_mcePaste">typeof global_var; // “number”</div>
<div id="_mcePaste">typeof global_novar; // “undefined”</div>
<div id="_mcePaste">typeof global_fromfunc; // “undefined”</div>
<div></div>
<div id="_mcePaste">在ES5严格模式下，未声明的变量（如在前面的代码片段中的两个反面教材）工作时会抛出一个错误。</div>
<div></div>
<div id="_mcePaste"><strong>访问全局对象(Access to the Global Object)</strong></div>
<div></div>
<div id="_mcePaste">在浏览器中，全局对象可以通过window属性在代码的任何位置访问（除非你做了些比较出格的事情，像是声明了一个名为window的局部变量）。但是在其他环境下，这个方便的属性可能被叫做其他什么东西（甚至在程序中不可用）。如果你需要在没有硬编码的window标识符下访问全局对象，你可以在任何层级的函数<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e4%bd%9c%e7%94%a8%e5%9f%9f" title="查看 作用域 中的全部文章" target="_blank">作用域</a></span>中做如下操作：</div>
<div></div>
<div id="_mcePaste">var global = (function () {</div>
<div id="_mcePaste">return this;</div>
<div id="_mcePaste">}());</div>
<div></div>
<div id="_mcePaste">这种方法可以随时获得全局对象，因为其在函数中被当做函数调用了（不是通过new构造），this总是指向全局对象。实际上这个病不适用于ECMAScript 5严格模式，所以，在严格模式下时，你必须采取不同的形式。例如，你正在开发一个JavaScript库，你可以将你的代码包裹在一个即时函数中，然后从全局<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e4%bd%9c%e7%94%a8%e5%9f%9f" title="查看 作用域 中的全部文章" target="_blank">作用域</a></span>中，传递一个引用指向this作为你即时函数的参数。</div>
<div></div>
<div id="_mcePaste"><strong>单var形式（Single var Pattern）</strong></div>
<div></div>
<div id="_mcePaste">在函数顶部使用单var语句是比较有用的一种形式，其好处在于：</div>
<div></div>
<div id="_mcePaste">提供了一个单一的地方去寻找功能所需要的所有局部变量</div>
<div id="_mcePaste">防止变量在定义之前使用的逻辑错误</div>
<div id="_mcePaste">帮助你记住声明的全局变量，因此较少了全局变量//zxx:此处我自己是有点晕乎的…</div>
<div id="_mcePaste">少代码（类型啊传值啊单线完成）</div>
<div></div>
<div id="_mcePaste">单var形式长得就像下面这个样子：</div>
<div></div>
<div id="_mcePaste">function func() {</div>
<div id="_mcePaste">var a = 1,</div>
<div id="_mcePaste">b = 2,</div>
<div id="_mcePaste">sum = a + b,</div>
<div id="_mcePaste">myobject = {},</div>
<div id="_mcePaste">i,</div>
<div id="_mcePaste">j;</div>
<div id="_mcePaste">// function body&#8230;</div>
<div id="_mcePaste">}</div>
<div></div>
<div id="_mcePaste">您可以使用一个var语句声明多个变量，并以逗号分隔。像这种初始化变量同时初始化值的做法是很好的。这样子可以防止逻辑错误（所有未初始化但声明的变量的初始值是undefined）和增加代码的可读性。在你看到代码后，你可以根据初始化的值知道这些变量大致的用途，例如是要当作对象呢还是当作整数来使。</div>
<div></div>
<div id="_mcePaste">你也可以在声明的时候做一些实际的工作，例如前面代码中的sum = a + b这个情况，另外一个例子就是当你使用DOM（文档对象模型）引用时，你可以使用单一的var把DOM引用一起指定为局部变量，就如下面代码所示的：</div>
<div></div>
<div id="_mcePaste">function updateElement() {</div>
<div id="_mcePaste">var el = document.getElementById(“result”),</div>
<div id="_mcePaste">style = el.style;</div>
<div id="_mcePaste">// 使用el和style干点其他什么事&#8230;</div>
<div id="_mcePaste">}</div>
<div></div>
<div id="_mcePaste"><strong>预解析：var散布的问题(Hoisting: A Problem with Scattered vars)</strong></div>
<div></div>
<div id="_mcePaste">JavaScript中，你可以在函数的任何位置声明多个var语句，并且它们就好像是在函数顶部声明一样发挥作用，这种行为称为hoisting（悬置/置顶解析/预解析）。当你使用了一个变量，然后不久在函数中又重新声明的话，就可能产生逻辑错误。对于JavaScript，只要你的变量是在同一个作用域中（同一函数），它都被当做是声明的，即使是它在var声明前使用的时候。看下面这个例子：</div>
<div></div>
<div id="_mcePaste">// 反例</div>
<div id="_mcePaste">myname = “global”; // 全局变量</div>
<div id="_mcePaste">function func() {</div>
<div id="_mcePaste">alert(myname); // “undefined”</div>
<div id="_mcePaste">var myname = “local”;</div>
<div id="_mcePaste">alert(myname); // “local”</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">func();</div>
<div></div>
<div id="_mcePaste">在这个例子中，你可能会以为第一个alert弹出的是”global”，第二个弹出”loacl”。这种期许是可以理解的，因为在第一个alert的时候，myname未声明，此时函数肯定很自然而然地看全局变量myname，但是，实际上并不是这么工作的。第一个alert会弹出”undefined”是因为myname被当做了函数的局部变量（尽管是之后声明的），所有的变量声明当被悬置到函数的顶部了。因此，为了避免这种混乱，最好是预先声明你想使用的全部变量。</div>
<div></div>
<div id="_mcePaste">上面的代码片段执行的行为可能就像下面这样：</div>
<div id="_mcePaste">myname = “global”; // global variable</div>
<div id="_mcePaste">function func() {</div>
<div id="_mcePaste">var myname; // 等同于 -&gt; var myname = undefined;</div>
<div id="_mcePaste">alert(myname); // “undefined”</div>
<div id="_mcePaste">myname = “local”;</div>
<div id="_mcePaste">alert(myname); // “local”}</div>
<div id="_mcePaste">func();</div>
<div id="_mcePaste">//zxx:关于JavaScript的置顶解析，我上周专门<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e7%bf%bb%e8%af%91" title="查看 翻译 中的全部文章" target="_blank">翻译</a></span>了篇文章，您有兴趣可以看看：“<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e7%bf%bb%e8%af%91" title="查看 翻译 中的全部文章" target="_blank">翻译</a></span> – 解释JavaScript的置顶解析”。</div>
<div></div>
<div id="_mcePaste">为了完整，我们再提一提执行层面的稍微复杂点的东西。代码处理分两个阶段，第一阶段是变量，函数声明，以及正常格式的参数创建，这是一个解析和进入上下文的阶段。第二个阶段是代码执行，函数表达式和不合格的标识符（为声明的变量）被创建。但是，出于实用的目的，我们就采用了”hoisting”这个概念，这种ECMAScript标准中并未定义，通常用来描述行为。</div>
<div></div>
<div id="_mcePaste"><strong>for<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e5%be%aa%e7%8e%af" title="查看 循环 中的全部文章" target="_blank">循环</a></span>(for Loops)</strong></div>
<div></div>
<div id="_mcePaste">在for<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e5%be%aa%e7%8e%af" title="查看 循环 中的全部文章" target="_blank">循环</a></span>中，你可以循环取得数组或是数组类似对象的值，譬如arguments和HTMLCollection对象。通常的循环形式如下：</div>
<div id="_mcePaste">// 次佳的循环</div>
<div id="_mcePaste">for (var i = 0; i &lt; myarray.length; i++) {</div>
<div id="_mcePaste">// 使用myarray[i]做点什么</div>
<div id="_mcePaste">}</div>
<div></div>
<div id="_mcePaste">这种形式的循环的不足在于每次循环的时候数组的长度都要去获取下。这回降低你的代码，尤其当myarray不是数组，而是一个HTMLCollection对象的时候。</div>
<div id="_mcePaste">HTMLCollections指的是DOM方法返回的对象，例如：</div>
<div id="_mcePaste">document.getElementsByName()</div>
<div id="_mcePaste">document.getElementsByClassName()</div>
<div id="_mcePaste">document.getElementsByTagName()</div>
<div id="_mcePaste">还有其他一些HTMLCollections，这些是在DOM标准之前引进并且现在还在使用的。有：</div>
<div id="_mcePaste">document.images: 页面上所有的图片元素</div>
<div id="_mcePaste">document.links : 所有a标签元素</div>
<div id="_mcePaste">document.forms : 所有表单</div>
<div id="_mcePaste">document.forms[0].elements : 页面上第一个表单中的所有域</div>
<div id="_mcePaste">集合的麻烦在于它们实时查询基本文档（HTML页面）。这意味着每次你访问任何集合的长度，你要实时查询DOM，而DOM操作一般都是比较昂贵的。</div>
<div></div>
<div id="_mcePaste">这就是为什么当你循环获取值时，缓存数组(或集合)的长度是比较好的形式，正如下面代码显示的：</div>
<div id="_mcePaste">for (var i = 0, max = myarray.length; i &lt; max; i++) {</div>
<div id="_mcePaste">// 使用myarray[i]做点什么</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">这样，在这个循环过程中，你只检索了一次长度值。</div>
<div id="_mcePaste">在所有浏览器下，循环获取内容时缓存HTMLCollections的长度是更快的，2倍(Safari3)到190倍(IE7)之间。//zxx:此数据貌似很老，仅供参考</div>
<div id="_mcePaste">注意到，当你明确想要修改循环中的集合的时候（例如，添加更多的DOM元素），你可能更喜欢长度更新而不是常量。</div>
<div id="_mcePaste">伴随着单var形式，你可以把变量从循环中提出来，就像下面这样：</div>
<div id="_mcePaste">function looper() {</div>
<div id="_mcePaste">var i = 0,</div>
<div id="_mcePaste">max,</div>
<div id="_mcePaste">myarray = [];</div>
<div id="_mcePaste">// &#8230;</div>
<div id="_mcePaste">for (i = 0, max = myarray.length; i &lt; max; i++) {</div>
<div id="_mcePaste">// 使用myarray[i]做点什么</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">这种形式具有一致性的好处，因为你坚持了单一var形式。不足在于当重构代码的时候，复制和粘贴整个循环有点困难。例如，你从一个函数复制了一个循环到另一个函数，你不得不去确定你能够把i和max引入新的函数（如果在这里没有用的话，很有可能你要从原函数中把它们删掉）。</div>
<div></div>
<div id="_mcePaste">最后一个需要对循环进行调整的是使用下面表达式之一来替换i++。</div>
<div id="_mcePaste">i = i + 1</div>
<div id="_mcePaste">i += 1</div>
<div id="_mcePaste">JSLint提示您这样做，原因是++和–-促进了“过分棘手(excessive trickiness)”。//zxx:这里比较难翻译，我想本意应该是让代码变得更加的棘手</div>
<div></div>
<div id="_mcePaste">如果你直接无视它，JSLint的plusplus选项会是false（默认是default）。</div>
<div></div>
<div id="_mcePaste">还有两种变化的形式，其又有了些微改进，因为：</div>
<div></div>
<div id="_mcePaste">少了一个变量(无max)</div>
<div id="_mcePaste">向下数到0，通常更快，因为和0做比较要比和数组长度或是其他不是0的东西作比较更有效率</div>
<div id="_mcePaste">第一种变化的形式：</div>
<div id="_mcePaste">var i, myarray = [];</div>
<div id="_mcePaste">for (i = myarray.length; i–-;) {</div>
<div id="_mcePaste">// 使用myarray[i]做点什么</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">第二种使用while循环：</div>
<div id="_mcePaste">var myarray = [],</div>
<div id="_mcePaste">i = myarray.length;</div>
<div id="_mcePaste">while (i–-) {</div>
<div id="_mcePaste">// 使用myarray[i]做点什么</div>
<div id="_mcePaste">}</div>
<div></div>
<div id="_mcePaste">这些小的改进只体现在性能上，此外JSLint会对使用i–-加以抱怨。</div>
<div></div>
<div id="_mcePaste"><strong>for-in循环(for-in Loops)</strong></div>
<div></div>
<div id="_mcePaste">for-in循环应该用在非数组对象的遍历上，使用for-in进行循环也被称为“枚举”。</div>
<div id="_mcePaste">从技术上将，你可以使用for-in循环数组（因为JavaScript中数组也是对象），但这是不推荐的。因为如果数组对象已被自定义的功能增强，就可能发生逻辑错误。另外，在for-in中，属性列表的顺序（序列）是不能保证的。所以最好数组使用正常的for循环，对象使用for-in循环。</div>
<div id="_mcePaste">有个很重要的hasOwnProperty()方法，当遍历对象属性的时候可以过滤掉从<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e5%8e%9f%e5%9e%8b" title="查看 原型 中的全部文章" target="_blank">原型</a></span>链上下来的属性。</div>
<div id="_mcePaste">思考下面一段代码：</div>
<div></div>
<div id="_mcePaste">// 对象</div>
<div id="_mcePaste">var man = {</div>
<div id="_mcePaste">hands: 2,</div>
<div id="_mcePaste">legs: 2,</div>
<div id="_mcePaste">heads: 1</div>
<div id="_mcePaste">};</div>
<div id="_mcePaste">// 在代码的某个地方</div>
<div id="_mcePaste">// 一个方法添加给了所有对象</div>
<div id="_mcePaste">if (typeof Object.prototype.clone === “undefined”) {</div>
<div id="_mcePaste">Object.prototype.clone = function () {};</div>
<div id="_mcePaste">}</div>
<div></div>
<div id="_mcePaste">在这个例子中，我们有一个使用对象字面量定义的名叫man的对象。在man定义完成后的某个地方，在对象<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e5%8e%9f%e5%9e%8b" title="查看 原型 中的全部文章" target="_blank">原型</a></span>上增加了一个很有用的名叫clone()的方法。此原型链是实时的，这就意味着所有的对象自动可以访问新的方法。为了避免枚举man的时候出现clone()方法，你需要应用hasOwnProperty()方法过滤原型属性。如果不做过滤，会导致clone()函数显示出来，在大多数情况下这是不希望出现的。</div>
<div></div>
<div id="_mcePaste">// 1.</div>
<div id="_mcePaste">// for-in 循环</div>
<div id="_mcePaste">for (var i in man) {</div>
<div id="_mcePaste">if (man.hasOwnProperty(i)) { // 过滤</div>
<div id="_mcePaste">console.log(i, “:”, man[i]);</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">/* 控制台显示结果</div>
<div id="_mcePaste">hands : 2</div>
<div id="_mcePaste">legs : 2</div>
<div id="_mcePaste">heads : 1</div>
<div id="_mcePaste">*/</div>
<div id="_mcePaste">// 2.</div>
<div id="_mcePaste">// 反面例子:</div>
<div id="_mcePaste">// for-in loop without checking hasOwnProperty()</div>
<div id="_mcePaste">for (var i in man) {</div>
<div id="_mcePaste">console.log(i, “:”, man[i]);</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">/*</div>
<div id="_mcePaste">控制台显示结果</div>
<div id="_mcePaste">hands : 2</div>
<div id="_mcePaste">legs : 2</div>
<div id="_mcePaste">heads : 1</div>
<div id="_mcePaste">clone: function()</div>
<div id="_mcePaste">*/</div>
<div id="_mcePaste">另外一种使用hasOwnProperty()的形式是取消Object.prototype上的方法。像是：</div>
<div id="_mcePaste">for (var i in man) {</div>
<div id="_mcePaste">if (Object.prototype.hasOwnProperty.call(man, i)) { // 过滤</div>
<div id="_mcePaste">console.log(i, “:”, man[i]);</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">其好处在于在man对象重新定义hasOwnProperty情况下避免命名冲突。也避免了长属性查找对象的所有方法，你可以使用局部变量“缓存”它。</div>
<div id="_mcePaste">var i, hasOwn = Object.prototype.hasOwnProperty;</div>
<div id="_mcePaste">for (i in man) {</div>
<div id="_mcePaste">if (hasOwn.call(man, i)) { // 过滤</div>
<div id="_mcePaste">console.log(i, “:”, man[i]);</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">}</div>
<div></div>
<div id="_mcePaste">严格来说，不使用hasOwnProperty()并不是一个错误。根据任务以及你对代码的自信程度，你可以跳过它以提高些许的循环速度。但是当你对当前对象内容（和其原型链）不确定的时候，添加hasOwnProperty()更加保险些。</div>
<div></div>
<div id="_mcePaste">格式化的变化（通不过JSLint）会直接忽略掉花括号，把if语句放到同一行上。其优点在于循环语句读起来就像一个完整的想法（每个元素都有一个自己的属性”X”，使用”X”干点什么）：</div>
<div></div>
<div id="_mcePaste">// 警告： 通不过JSLint检测</div>
<div id="_mcePaste">var i, hasOwn = Object.prototype.hasOwnProperty;</div>
<div id="_mcePaste">for (i in man) if (hasOwn.call(man, i)) { // 过滤</div>
<div id="_mcePaste">console.log(i, “:”, man[i]);</div>
<div id="_mcePaste">}</div>
<div></div>
<div id="_mcePaste"><strong>（不）扩展内置原型((Not) Augmenting Built-in Prototypes)</strong></div>
<div></div>
<div id="_mcePaste">扩增构造函数的prototype属性是个很强大的增加功能的方法，但有时候它太强大了。</div>
<div></div>
<div id="_mcePaste">增加内置的构造函数原型（如Object(), Array(), 或Function()）挺诱人的，但是这严重降低了可维护性，因为它让你的代码变得难以预测。使用你代码的其他开发人员很可能更期望使用内置的JavaScript方法来持续不断地工作，而不是你另加的方法。</div>
<div></div>
<div id="_mcePaste">另外，属性添加到原型中，可能会导致不使用hasOwnProperty属性时在循环中显示出来，这会造成混乱。</div>
<div></div>
<div id="_mcePaste">因此，不增加内置原型是最好的。你可以指定一个规则，仅当下面的条件均满足时例外：</div>
<div></div>
<div id="_mcePaste">可以预期将来的ECMAScript版本或是JavaScript实现将一直将此功能当作内置方法来实现。例如，你可以添加ECMAScript 5中描述的方法，一直到各个浏览器都迎头赶上。这种情况下，你只是提前定义了有用的方法。</div>
<div></div>
<div id="_mcePaste">如果您检查您的自定义属性或方法已不存在——也许已经在代码的其他地方实现或已经是你支持的浏览器JavaScript引擎部分。</div>
<div></div>
<div id="_mcePaste">你清楚地文档记录并和团队交流了变化。</div>
<div></div>
<div id="_mcePaste">如果这三个条件得到满足，你可以给原型进行自定义的添加，形式如下：</div>
<div></div>
<div id="_mcePaste">if (typeof Object.protoype.myMethod !== “function”) {</div>
<div id="_mcePaste">Object.protoype.myMethod = function () {</div>
<div id="_mcePaste">// 实现&#8230;</div>
<div id="_mcePaste">};</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">switch形式(switch Pattern )</div>
<div id="_mcePaste">你可以通过类似下面形式的switch语句增强可读性和健壮性：</div>
<div id="_mcePaste">var inspect_me = 0,</div>
<div id="_mcePaste">result = ”;</div>
<div id="_mcePaste">switch (inspect_me) {</div>
<div id="_mcePaste">case 0:</div>
<div id="_mcePaste">result = “zero”;</div>
<div id="_mcePaste">break;</div>
<div id="_mcePaste">case 1:</div>
<div id="_mcePaste">result = “one”;</div>
<div id="_mcePaste">break;</div>
<div id="_mcePaste">default:</div>
<div id="_mcePaste">result = “unknown”;</div>
<div id="_mcePaste">}</div>
<div></div>
<div id="_mcePaste">这个简单的例子中所遵循的风格约定如下：</div>
<div></div>
<div id="_mcePaste">每个case和switch对齐（花括号<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e7%bc%a9%e8%bf%9b" title="查看 缩进 中的全部文章" target="_blank">缩进</a></span>规则除外）</div>
<div id="_mcePaste">每个case中代码<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e7%bc%a9%e8%bf%9b" title="查看 缩进 中的全部文章" target="_blank">缩进</a></span></div>
<div id="_mcePaste">每个case以break清除结束</div>
<div id="_mcePaste">避免贯穿（故意忽略break）。如果你非常确信贯穿是最好的方法，务必记录此情况，因为对于有些阅读人而言，它们可能看起来是错误的。</div>
<div id="_mcePaste">以default结束switch：确保总有健全的结果，即使无情况匹配。</div>
<div id="_mcePaste">避免隐式<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e7%b1%bb%e5%9e%8b%e8%bd%ac%e6%8d%a2" title="查看 类型转换 中的全部文章" target="_blank">类型转换</a></span>(Avoiding Implied Typecasting )</div>
<div id="_mcePaste">JavaScript的变量在比较的时候会隐式<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e7%b1%bb%e5%9e%8b%e8%bd%ac%e6%8d%a2" title="查看 类型转换 中的全部文章" target="_blank">类型转换</a></span>。这就是为什么一些诸如：false == 0 或 “” == 0 返回的结果是true。为避免引起混乱的隐含类型转换，在你比较值和表达式类型的时候始终使用===和!==操作符。</div>
<div id="_mcePaste">var zero = 0;</div>
<div id="_mcePaste">if (zero === false) {</div>
<div id="_mcePaste">// 不执行，因为zero为0, 而不是false</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">// 反面示例</div>
<div id="_mcePaste">if (zero == false) {</div>
<div id="_mcePaste">// 执行了&#8230;</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">还有另外一种思想观点认为==就足够了===是多余的。例如，当你使用typeof你就知道它会返回一个字符串，所以没有使用严格相等的理由。然而，JSLint要求严格相等，它使代码看上去更有一致性，可以降低代码阅读时的精力消耗。（“==是故意的还是一个疏漏？”）</div>
<div></div>
<div id="_mcePaste"><strong>避免(Avoiding) eval()</strong></div>
<div></div>
<div id="_mcePaste">如果你现在的代码中使用了eval()，记住该咒语“eval()是魔鬼”。此方法接受任意的字符串，并当作JavaScript代码来处理。当有问题的代码是事先知道的（不是运行时确定的），没有理由使用eval()。如果代码是在运行时动态生成，有一个更好的方式不使用eval而达到同样的目标。例如，用方括号表示法来访问动态属性会更好更简单：</div>
<div></div>
<div id="_mcePaste">// 反面示例</div>
<div id="_mcePaste">var property = “name”;</div>
<div id="_mcePaste">alert(eval(“obj.” + property));</div>
<div id="_mcePaste">// 更好的</div>
<div id="_mcePaste">var property = “name”;</div>
<div id="_mcePaste">alert(obj[property]);</div>
<div id="_mcePaste">使用eval()也带来了安全隐患，因为被执行的代码（例如从网络来）可能已被篡改。这是个很常见的反面教材，当处理Ajax请求得到的JSON 相应的时候。在这些情况下，最好使用JavaScript内置方法来解析JSON相应，以确保安全和有效。若浏览器不支持JSON.parse()，你可以使用来自JSON.org的库。</div>
<div></div>
<div id="_mcePaste">同样重要的是要记住，给setInterval(), setTimeout()和Function()构造函数传递字符串，大部分情况下，与使用eval()是类似的，因此要避免。在幕后，JavaScript仍需要评估和执行你给程序传递的字符串：</div>
<div></div>
<div id="_mcePaste">// 反面示例</div>
<div id="_mcePaste">setTimeout(“myFunc()”, 1000);</div>
<div id="_mcePaste">setTimeout(“myFunc(1, 2, 3)”, 1000);</div>
<div id="_mcePaste">// 更好的</div>
<div id="_mcePaste">setTimeout(myFunc, 1000);</div>
<div id="_mcePaste">setTimeout(function () {</div>
<div id="_mcePaste">myFunc(1, 2, 3);</div>
<div id="_mcePaste">}, 1000);</div>
<div></div>
<div id="_mcePaste">使用新的Function()构造就类似于eval()，应小心接近。这可能是一个强大的构造，但往往被误用。如果你绝对必须使用eval()，你可以考虑使用new Function()代替。有一个小的潜在好处，因为在新Function()中作代码评估是在局部函数作用域中运行，所以代码中任何被评估的通过var定义的变量都不会自动变成全局变量。另一种方法来阻止自动全局变量是封装eval()调用到一个即时函数中。</div>
<div></div>
<div id="_mcePaste">考虑下面这个例子，这里仅un作为全局变量污染了命名空间。</div>
<div id="_mcePaste">console.log(typeof un);	// “undefined”</div>
<div id="_mcePaste">console.log(typeof deux); // “undefined”</div>
<div id="_mcePaste">console.log(typeof trois); // “undefined”</div>
<div id="_mcePaste">var jsstring = “var un = 1; console.log(un);”;</div>
<div id="_mcePaste">eval(jsstring); // logs “1&#8243;</div>
<div id="_mcePaste">jsstring = “var deux = 2; console.log(deux);”;</div>
<div id="_mcePaste">new Function(jsstring)(); // logs “2&#8243;</div>
<div id="_mcePaste">jsstring = “var trois = 3; console.log(trois);”;</div>
<div id="_mcePaste">(function () {</div>
<div id="_mcePaste">eval(jsstring);</div>
<div id="_mcePaste">}()); // logs “3&#8243;</div>
<div id="_mcePaste">console.log(typeof un); // number</div>
<div id="_mcePaste">console.log(typeof deux); // “undefined”</div>
<div id="_mcePaste">console.log(typeof trois); // “undefined”</div>
<div id="_mcePaste">另一间eval()和Function构造不同的是eval()可以干扰作用域链，而Function()更安分守己些。不管你在哪里执行Function()，它只看到全局作用域。所以其能很好的避免本地变量污染。在下面这个例子中，eval()可以访问和修改它外部作用域中的变量，这是Function做不来的（注意到使用Function和new Function是相同的）。</div>
<div></div>
<div id="_mcePaste">(function () {</div>
<div id="_mcePaste">var local = 1;</div>
<div id="_mcePaste">eval(“local = 3; console.log(local)”); // logs “3&#8243;</div>
<div id="_mcePaste">console.log(local); // logs “3&#8243;</div>
<div id="_mcePaste">}());</div>
<div id="_mcePaste">(function () {</div>
<div id="_mcePaste">var local = 1;</div>
<div id="_mcePaste">Function(“console.log(typeof local);”)(); // logs undefined</div>
<div id="_mcePaste">}());</div>
<div id="_mcePaste">parseInt()下的数值转换(Number Conversions with parseInt())</div>
<div id="_mcePaste">使用parseInt()你可以从字符串中获取数值，该方法接受另一个基数参数，这经常省略，但不应该。当字符串以”0″开头的时候就有可能会出问题，例如，部分时间进入表单域，在ECMAScript 3中，开头为”0″的字符串被当做8进制处理了，但这已在ECMAScript 5中改变了。为了避免矛盾和意外的结果，总是指定基数参数。</div>
<div></div>
<div id="_mcePaste">var month = “06&#8243;,</div>
<div id="_mcePaste">year = “09&#8243;;</div>
<div id="_mcePaste">month = parseInt(month, 10);</div>
<div id="_mcePaste">year = parseInt(year, 10);</div>
<div id="_mcePaste">此例中，如果你忽略了基数参数，如parseInt(year)，返回的值将是0，因为“09”被当做8进制（好比执行 parseInt( year, 8 )），而09在8进制中不是个有效数字。</div>
<div id="_mcePaste">替换方法是将字符串转换成数字，包括：</div>
<div id="_mcePaste">+”08&#8243; // 结果是 8</div>
<div id="_mcePaste">Number(“08&#8243;) // 8</div>
<div id="_mcePaste">这些通常快于parseInt()，因为parseInt()方法，顾名思意，不是简单地解析与转换。但是，如果你想输入例如“08 hello”，parseInt()将返回数字，而其它以NaN告终。</div>
<div id="_mcePaste">编码<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e8%a7%84%e8%8c%83" title="查看 规范 中的全部文章" target="_blank">规范</a></span>(Coding Conventions)</div>
<div id="_mcePaste">建立和遵循编码<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e8%a7%84%e8%8c%83" title="查看 规范 中的全部文章" target="_blank">规范</a></span>是很重要的，这让你的代码保持一致性，可预测，更易于阅读和理解。一个新的开发者加入这个团队可以通读规范，理解其它团队成员书写的代码，更快上手干活。</div>
<div></div>
<div id="_mcePaste">许多激烈的争论发生会议上或是邮件列表上，问题往往针对某些代码规范的特定方面（例如代码缩进，是Tab制表符键还是space<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e7%a9%ba%e6%a0%bc" title="查看 空格 中的全部文章" target="_blank">空格</a></span>键）。如果你是你组织中建议采用规范的，准备好面对各种反对的或是听起来不同但很强烈的观点。要记住，建立和坚定不移地遵循规范要比纠结于规范的细节重要的多。</div>
<div></div>
<div id="_mcePaste"><strong>缩进(Indentation)</strong></div>
<div></div>
<div id="_mcePaste">代码没有缩进基本上就不能读了。唯一糟糕的事情就是不一致的缩进，因为它看上去像是遵循了规范，但是可能一路上伴随着混乱和惊奇。重要的是规范地使用缩进。</div>
<div></div>
<div id="_mcePaste">一些开发人员更喜欢用tab制表符缩进，因为任何人都可以调整他们的编辑器以自己喜欢的<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e7%a9%ba%e6%a0%bc" title="查看 空格 中的全部文章" target="_blank">空格</a></span>数来显示Tab。有些人喜欢空格——通常四个，这都无所谓，只要团队每个人都遵循同一个规范就好了。这本书，例如，使用四个空格缩进，这也是JSLint中默认的缩进。</div>
<div id="_mcePaste">什么应该缩进呢？规则很简单——花括号里面的东西。这就意味着函数体，循环 (do, while, for, for-in)，if，switch，以及对象字面量中的对象属性。下面的代码就是使用缩进的示例：</div>
<div></div>
<div id="_mcePaste">function outer(a, b) {</div>
<div id="_mcePaste">var c = 1,</div>
<div id="_mcePaste">d = 2,</div>
<div id="_mcePaste">inner;</div>
<div id="_mcePaste">if (a &gt; b) {</div>
<div id="_mcePaste">inner = function () {</div>
<div id="_mcePaste">return {</div>
<div id="_mcePaste">r: c &#8211; d</div>
<div id="_mcePaste">};</div>
<div id="_mcePaste">};</div>
<div id="_mcePaste">} else {</div>
<div id="_mcePaste">inner = function () {</div>
<div id="_mcePaste">return {</div>
<div id="_mcePaste">r: c + d</div>
<div id="_mcePaste">};</div>
<div id="_mcePaste">};</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">return inner;</div>
<div id="_mcePaste">}</div>
<div></div>
<div id="_mcePaste"><strong>花括号{}(Curly Braces)</strong></div>
<div></div>
<div id="_mcePaste">花括号（亦称大括号，下同）应总被使用，即使在它们为可选的时候。技术上将，在in或是for中如果语句仅一条，花括号是不需要的，但是你还是应该总是使用它们，这会让代码更有持续性和易于更新。</div>
<div></div>
<div id="_mcePaste">想象下你有一个只有一条语句的for循环，你可以忽略花括号，而没有解析的错误。</div>
<div id="_mcePaste">// 糟糕的实例</div>
<div id="_mcePaste">for (var i = 0; i &lt; 10; i += 1)</div>
<div id="_mcePaste">alert(i);</div>
<div id="_mcePaste">但是，如果，后来，主体循环部分又增加了行代码？</div>
<div id="_mcePaste">// 糟糕的实例</div>
<div id="_mcePaste">for (var i = 0; i &lt; 10; i += 1)</div>
<div id="_mcePaste">alert(i);</div>
<div id="_mcePaste">alert(i + ” is ” + (i % 2 ? “odd” : “even”));</div>
<div id="_mcePaste">第二个alert已经在循环之外，缩进可能欺骗了你。为了长远打算，最好总是使用花括号，即时值一行代码：</div>
<div id="_mcePaste">// 好的实例</div>
<div id="_mcePaste">for (var i = 0; i &lt; 10; i += 1) {</div>
<div id="_mcePaste">alert(i);</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">if条件类似：</div>
<div id="_mcePaste">// 坏</div>
<div id="_mcePaste">if (true)</div>
<div id="_mcePaste">alert(1);</div>
<div id="_mcePaste">else</div>
<div id="_mcePaste">alert(2);</div>
<div id="_mcePaste">// 好</div>
<div id="_mcePaste">if (true) {</div>
<div id="_mcePaste">alert(1);</div>
<div id="_mcePaste">} else {</div>
<div id="_mcePaste">alert(2);</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">左花括号的位置(Opening Brace Location)</div>
<div id="_mcePaste">开发人员对于左大括号的位置有着不同的偏好——在同一行或是下一行。</div>
<div id="_mcePaste">if (true) {</div>
<div id="_mcePaste">alert(“It&#8217;s TRUE!”);</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">或</div>
<div id="_mcePaste">if (true)</div>
<div id="_mcePaste">{</div>
<div id="_mcePaste">alert(“It&#8217;s TRUE!”);</div>
<div id="_mcePaste">}</div>
<div></div>
<div id="_mcePaste">这个实例中，仁者见仁智者见智，但也有个案，括号位置不同会有不同的行为表现。这是因为分号插入机制(semicolon insertion mechanism)——JavaScript是不挑剔的，当你选择不使用分号结束一行代码时JavaScript会自己帮你补上。这种行为可能会导致麻烦，如当你返回对象字面量，而左括号却在下一行的时候：</div>
<div></div>
<div id="_mcePaste">// 警告： 意外的返回值</div>
<div id="_mcePaste">function func() {</div>
<div id="_mcePaste">return</div>
<div id="_mcePaste">// 下面代码不执行</div>
<div id="_mcePaste">{</div>
<div id="_mcePaste">name : “Batman”</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">}</div>
<div></div>
<div id="_mcePaste">如果你希望函数返回一个含有name属性的对象，你会惊讶。由于隐含分号，函数返回undefined。前面的代码等价于：</div>
<div id="_mcePaste">// 警告： 意外的返回值</div>
<div id="_mcePaste">function func() {</div>
<div id="_mcePaste">return undefined;</div>
<div id="_mcePaste">// 下面代码不执行</div>
<div id="_mcePaste">{</div>
<div id="_mcePaste">name : “Batman”</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">}</div>
<div></div>
<div id="_mcePaste">总之，总是使用花括号，并始终把在与之前的语句放在同一行：</div>
<div id="_mcePaste">function func() {</div>
<div id="_mcePaste">return {</div>
<div id="_mcePaste">name : “Batman”</div>
<div id="_mcePaste">};</div>
<div id="_mcePaste">}</div>
<div></div>
<div id="_mcePaste">关于分号注：就像使用花括号，你应该总是使用分号，即使他们可由JavaScript解析器隐式创建。这不仅促进更科学和更严格的代码，而且有助于解决存有疑惑的地方，就如前面的例子显示。</div>
<div></div>
<div id="_mcePaste"><strong>空格(White Space)</strong></div>
<div></div>
<div id="_mcePaste">空格的使用同样有助于改善代码的可读性和一致性。在写英文句子的时候，在逗号和句号后面会使用间隔。在JavaScript中，你可以按照同样的逻辑在列表模样表达式（相当于逗号）和结束语句（相对于完成了“想法”）后面添加间隔。</div>
<div></div>
<div id="_mcePaste">适合使用空格的地方包括：</div>
<div></div>
<div id="_mcePaste">for循环分号分开后的的部分：如for (var i = 0; i &lt; 10; i += 1) {&#8230;}</div>
<div id="_mcePaste">for循环中初始化的多变量(i和max)：for (var i = 0, max = 10; i &lt; max; i += 1) {&#8230;}</div>
<div id="_mcePaste">分隔数组项的逗号的后面：var a = [1, 2, 3];</div>
<div id="_mcePaste">对象属性逗号的后面以及分隔属性名和属性值的冒号的后面：var o = {a: 1, b: 2};</div>
<div id="_mcePaste">限定函数参数：myFunc(a, b, c)</div>
<div id="_mcePaste">函数声明的花括号的前面：function myFunc() {}</div>
<div id="_mcePaste">匿名函数表达式function的后面：var myFunc = function () {};</div>
<div id="_mcePaste">使用空格分开所有的操作符和操作对象是另一个不错的使用，这意味着在+, -, *, =, &lt;, &gt;, &lt;=, &gt;=, ===, !==, &amp;&amp;, ||, +=等前后都需要空格。</div>
<div id="_mcePaste">// 宽松一致的间距</div>
<div id="_mcePaste">// 使代码更易读</div>
<div id="_mcePaste">// 使得更加“透气”</div>
<div id="_mcePaste">var d = 0,</div>
<div id="_mcePaste">a = b + 1;</div>
<div id="_mcePaste">if (a &amp;&amp; b &amp;&amp; c) {</div>
<div id="_mcePaste">d = a % c;</div>
<div id="_mcePaste">a += d;</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">// 反面例子</div>
<div id="_mcePaste">// 缺失或间距不一</div>
<div id="_mcePaste">// 使代码变得疑惑</div>
<div id="_mcePaste">var d = 0,</div>
<div id="_mcePaste">a = b + 1;</div>
<div id="_mcePaste">if (a &amp;&amp; b &amp;&amp; c) {</div>
<div id="_mcePaste">d = a % c;</div>
<div id="_mcePaste">a += d;</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">//zxx:我就琢磨着这正面和反面例子不长得一样吗&#8230;原文就是如此，我也不好擅自改动。</div>
<div></div>
<div id="_mcePaste">最后需要注意的一个空格——花括号间距。最好使用空格：</div>
<div></div>
<div id="_mcePaste">函数、if-else语句、循环、对象字面量的左花括号的前面({)</div>
<div id="_mcePaste">else或while之间的右花括号(})</div>
<div id="_mcePaste">空格使用的一点不足就是增加了文件的大小，但是压缩无此问题。</div>
<div id="_mcePaste">有一个经常被忽略的代码可读性方面是垂直空格的使用。你可以使用空行来分隔代码单元，就像是文学作品中使用段落分隔一样。</div>
<div></div>
<div id="_mcePaste"><strong>命名规范(Naming Conventions)</strong></div>
<div></div>
<div id="_mcePaste">另一种方法让你的代码更具可预测性和可维护性是采用命名规范。这就意味着你需要用同一种形式给你的变量和函数命名。</div>
<div id="_mcePaste">下面是建议的一些命名规范，你可以原样采用，也可以根据自己的喜好作调整。同样，遵循规范要比规范是什么更重要。</div>
<div></div>
<div id="_mcePaste"><strong>以大写字母写构造函数(Capitalizing Constructors)</strong></div>
<div></div>
<div id="_mcePaste">JavaScript并没有类，但有new调用的构造函数：</div>
<div id="_mcePaste">var adam = new Person();</div>
<div id="_mcePaste">因为构造函数仍仅仅是函数，仅看函数名就可以帮助告诉你这应该是一个构造函数还是一个正常的函数。</div>
<div id="_mcePaste">命名构造函数时首字母大写具有暗示作用，使用小写命名的函数和方法不应该使用new调用：</div>
<div id="_mcePaste">function MyConstructor() {&#8230;}</div>
<div id="_mcePaste">function myFunction() {&#8230;}</div>
<div id="_mcePaste">分隔单词(Separating Words)</div>
<div></div>
<div id="_mcePaste">当你的变量或是函数名有多个单词的时候，最好单词的分离遵循统一的规范，有一个常见的做法被称作“驼峰(Camel)命名法”，就是单词小写，每个单词的首字母大写。</div>
<div></div>
<div id="_mcePaste">对于构造函数，可以使用大驼峰式命名法(upper camel case)，如MyConstructor()。对于函数和方法名称，你可以使用小驼峰式命名法(lower camel case)，像是myFunction(), calculateArea()和getFirstName()。</div>
<div></div>
<div id="_mcePaste">要是变量不是函数呢？开发者通常使用小驼峰式命名法，但还有另外一种做法就是所有单词小写以下划线连接：例如，first_name,</div>
<div>favorite_bands, 和 old_company_name，这种标记法帮你直观地区分函数和其他标识——原型和对象。</div>
<div></div>
<div id="_mcePaste">ECMAScript的属性和方法均使用Camel标记法，尽管多字的属性名称是罕见的（正则表达式对象的lastIndex和ignoreCase属性）。</div>
<div></div>
<div id="_mcePaste"><strong>其它命名形式(Other Naming Patterns)</strong></div>
<div></div>
<div id="_mcePaste">有时，开发人员使用命名规范来弥补或替代语言特性。</div>
<div id="_mcePaste">例如，JavaScript中没有定义常量的方法（尽管有些内置的像Number, MAX_VALUE），所以开发者都采用全部单词大写的规范来命名这个程序生命周期中都不会改变的变量，如：</div>
<div></div>
<div id="_mcePaste">// 珍贵常数，只可远观</div>
<div id="_mcePaste">var PI = 3.14,</div>
<div id="_mcePaste">MAX_WIDTH = 800;</div>
<div id="_mcePaste">还有另外一个完全大写的惯例：全局变量名字全部大写。全部大写命名全局变量可以加强减小全局变量数量的实践，同时让它们易于区分。</div>
<div id="_mcePaste">另外一种使用规范来模拟功能的是私有成员。虽然可以在JavaScript中实现真正的私有，但是开发者发现仅仅使用一个下划线前缀来表示一个私有属性或方法会更容易些。考虑下面的例子：</div>
<div></div>
<div id="_mcePaste">var person = {</div>
<div id="_mcePaste">getName: function () {</div>
<div id="_mcePaste">return this._getFirst() + &#8216; &#8216; + this._getLast();</div>
<div id="_mcePaste">},</div>
<div id="_mcePaste">_getFirst: function () {</div>
<div id="_mcePaste">// &#8230;</div>
<div id="_mcePaste">},</div>
<div id="_mcePaste">_getLast: function () {</div>
<div id="_mcePaste">// &#8230;</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">};</div>
<div></div>
<div id="_mcePaste">在此例中，getName()就表示公共方法，部分稳定的API。而_getFirst()和_getLast()则表明了私有。它们仍然是正常的公共方法，但是使用下划线前缀来警告person对象的使用者这些方法在下一个版本中时不能保证工作的，是不能直接使用的。注意，JSLint有些不鸟下划线前缀，除非你设置了noman选项为:false。</div>
<div></div>
<div id="_mcePaste"><strong>下面是一些常见的_private规范：</strong></div>
<div></div>
<div id="_mcePaste">使用尾下划线表示私有，如name_和getElements_()</div>
<div id="_mcePaste">使用一个下划线前缀表_protected（保护）属性，两个下划线前缀表示__private （私有）属性</div>
<div id="_mcePaste">Firefox中一些内置的变量属性不属于该语言的技术部分，使用两个前下划线和两个后下划线表示，如：__proto__和__parent__。</div>
<div></div>
<div id="_mcePaste"><strong><span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e6%b3%a8%e9%87%8a" title="查看 注释 中的全部文章" target="_blank">注释</a></span>(Writing Comments)</strong></div>
<div></div>
<div id="_mcePaste">你必须<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e6%b3%a8%e9%87%8a" title="查看 注释 中的全部文章" target="_blank">注释</a></span>你的代码，即使不会有其他人向你一样接触它。通常，当你深入研究一个问题，你会很清楚的知道这个代码是干嘛用的，但是，当你一周之后再回来看的时候，想必也要耗掉不少脑细胞去搞明白到底怎么工作的。</div>
<div></div>
<div id="_mcePaste">很显然，注释不能走极端：每个单独变量或是单独一行。但是，你通常应该记录所有的函数，它们的参数和返回值，或是任何不寻常的技术和方法。要想到注释可以给你代码未来的阅读者以诸多提示；阅读者需要的是（不要读太多的东西）仅注释和函数属性名来理解你的代码。例如，当你有五六行程序执行特定的任务，如果你提供了一行代码目的以及为什么在这里的描述的话，阅读者就可以直接跳过这段细节。没有硬性规定注释代码比，代码的某些部分（如正则表达式）可能注释要比代码多。</div>
<div></div>
<div id="_mcePaste">最重要的习惯，然而也是最难遵守的，就是保持注释的及时更新，因为过时的注释比没有注释更加的误导人。</div>
<div></div>
<div id="_mcePaste"><strong>关于作者（About the Author ）</strong></div>
<div></div>
<div id="_mcePaste">Stoyan Stefanov是Yahoo!web开发人员，多个O&#8217;Reilly书籍的作者、投稿者和技术评审。他经常在会议和他的博客www.phpied.com上发表web开发主题的演讲。Stoyan还是smush.it图片优化工具的创造者，YUI贡献者，雅虎性能优化工具YSlow 2.0的架构设计师。</div>
<h2  class="related_post_title">您可能感兴趣的文章</h2><ul class="related_post"><li><a href="http://www.52shidai.com/javascript/62.html" title="JavaScript面向对象之静态与非静态类">JavaScript面向对象之静态与非静态类</a></li><li><a href="http://www.52shidai.com/web-front/801.html" title="Web 前端优化最佳实践之 JavaScript 篇">Web 前端优化最佳实践之 JavaScript 篇</a></li><li><a href="http://www.52shidai.com/javascript/759.html" title="31个Javascript的实用工具">31个Javascript的实用工具</a></li><li><a href="http://www.52shidai.com/javascript/661.html" title="javascript 正则表达式-替换">javascript 正则表达式-替换</a></li><li><a href="http://www.52shidai.com/javascript/585.html" title="js入门学习：Javascript的学习笔记">js入门学习：Javascript的学习笔记</a></li><li><a href="http://www.52shidai.com/javascript/583.html" title="学习JavaScript三件必须了解的事">学习JavaScript三件必须了解的事</a></li><li><a href="http://www.52shidai.com/javascript/556.html" title="JavaScript操作iframe里的dom">JavaScript操作iframe里的dom</a></li><li><a href="http://www.52shidai.com/wordpress/441.html" title="WordPress分类列表函数:wp_list_categories">WordPress分类列表函数:wp_list_categories</a></li><li><a href="http://www.52shidai.com/javascript/323.html" title="javascript中的107个基础知识收集整理">javascript中的107个基础知识收集整理</a></li><li><a href="http://www.52shidai.com/javascript/jquery/310.html" title="jQuery中10个非常有用的遍历函数[4]">jQuery中10个非常有用的遍历函数[4]</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.52shidai.com/javascript/614.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>js入门学习：Javascript的学习笔记</title>
		<link>http://www.52shidai.com/javascript/585.html</link>
		<comments>http://www.52shidai.com/javascript/585.html#comments</comments>
		<pubDate>Tue, 27 Jul 2010 01:16:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[入门]]></category>
		<category><![CDATA[学习]]></category>

		<guid isPermaLink="false">http://www.52shidai.com/?p=585</guid>
		<description><![CDATA[网上看到一篇没有出处的javascript学习笔记，非常适合初学者，就转载过来给大家看看。 一、在页面中怎么添加javascript   &#60;script language=”javascript”&#62;   //这行是javascript脚本标记，斜杠后面的就是注释了   document.write(”在页面显示的javascript”) //在页面显示一句话   &#60;/script&#62; /*这也是注释*/ 二、javascript的数据类型 1、字符串（string）：字符串就是由一连串的字符组成的序列。包括字母、数字以及标点符号。当然还可以是汉字等。简单一点就是表示文本信息。 2、数字（number）：数字又分为两类：整型数字和浮点型数字。     整数包括正整数，零和负整数。     javascript中的数字可以使用十进制、八进制和十六进制来书写。方法如下：     十进制：15（直接写数字即可）     八进制：017（要以零做为引导数字）     十六进制：0xf（要以0x做为引导数字）     浮点型数字也叫实数，为了方便，也可以使用科学记数法来表示：     1.13e1、1.5e3（等价于1.5乘10的3次方）     javascript的数字范围大约为10的负308次方到10的308次方之间。     javascript中还有一个特殊的数字值NaN（not a number），javascript 用nan表示这个无意义的结果。 3、布尔值（boolean）：true和false，在计算机中一般用1表示true，用0表示false。 三、alert()方法的使用：   &#60;script language=”javascript”&#62;   alert(”在页面上显示警告对话框”);   &#60;/script&#62;   alert()是javascript产生一个带确认按钮的对话框，上面显示括号内的信息。 四、confirm()方法的使用：   &#60;script language=”javascript”&#62;   confirm(”在页面上显示确认对话框”);   &#60;/script&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>网上看到一篇没有出处的javascript<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e5%ad%a6%e4%b9%a0" title="查看 学习 中的全部文章" target="_blank">学习</a></span>笔记，非常适合初学者，就转载过来给大家看看。</p>
<p>一、在页面中怎么添加javascript<br />
  &lt;script language=”javascript”&gt;   //这行是javascript脚本标记，斜杠后面的就是注释了<br />
  document.write(”在页面显示的javascript”) //在页面显示一句话<br />
  &lt;/script&gt;<br />
/*这也是注释*/</p>
<p>二、javascript的数据类型<br />
1、字符串（string）：字符串就是由一连串的字符组成的序列。包括字母、数字以及标点符号。当然还可以是汉字等。简单一点就是表示文本信息。</p>
<p>2、数字（number）：数字又分为两类：整型数字和浮点型数字。<br />
    整数包括正整数，零和负整数。<br />
    javascript中的数字可以使用十进制、八进制和十六进制来书写。方法如下：<br />
    十进制：15（直接写数字即可）<br />
    八进制：017（要以零做为引导数字）<br />
    十六进制：0xf（要以0x做为引导数字）<br />
    浮点型数字也叫实数，为了方便，也可以使用科学记数法来表示：<br />
    1.13e1、1.5e3（等价于1.5乘10的3次方）<br />
    javascript的数字范围大约为10的负308次方到10的308次方之间。<br />
    javascript中还有一个特殊的数字值NaN（not a number），javascript 用nan表示这个无意义的结果。</p>
<p>3、布尔值（boolean）：true和false，在计算机中一般用1表示true，用0表示false。</p>
<p>三、alert()方法的使用：<br />
  &lt;script language=”javascript”&gt;<br />
  alert(”在页面上显示警告对话框”);<br />
  &lt;/script&gt;<br />
  alert()是javascript产生一个带确认按钮的对话框，上面显示括号内的信息。</p>
<p>四、confirm()方法的使用：<br />
  &lt;script language=”javascript”&gt;<br />
  confirm(”在页面上显示确认对话框”);<br />
  &lt;/script&gt;<br />
  confirm()和alert()差不多，不同的就是多了个取消按钮。按确定返回true，按取消返回false。<br />
  &lt;script language=”javascript”&gt;<br />
  var con;<br />
  con=confirm(”你们喜欢这样的教程吗？”);<br />
  if (con==true) alert(”喜欢”);<br />
  else alert(”不喜欢”);<br />
  &lt;/script&gt;</p>
<p>五、prompt()方法的使用：<br />
  &lt;script language=”javascript”&gt;<br />
    var name,age;<br />
    name=prompt(”请问您的名字？”);<br />
    alert(name);<br />
    age=prompt(”多大？”);<br />
    alert(age);<br />
   &lt;/script&gt;<br />
    它不但可以显示信息，而且可以输入信息。</p>
<p>六、javascript变量<br />
    用var加上为变量指定的名称来声明变量，变量类型可以通过给变量赋值来确定。由于javascript采用的是弱类型的样式，对数据类型要求不太严格，在程序执行的过程中，会根据需要自动转换。<br />
字符串变量，可以通过“变量名.length”来获得该变量中字符串的长度，如<br />
    var name;<br />
    name=”javascript”;<br />
    那么name.length的值就是10。<br />
    若在一行中创建多个变量时，记住用逗号来隔开变量名。各语句用分号隔开。(使用分号是个好习惯, 大家在<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e5%ad%a6%e4%b9%a0" title="查看 学习 中的全部文章" target="_blank">学习</a></span>的时候尽量养成加分号的习惯)<br />
    类型转换：javascript允许在程序中改变变量的类型，最常见的两个类型转换符Number和String。<br />
    Number(x)是字符型值——〉数字值型。String与之相反。相对于javascript的自动类型转换，可以将这种转换成为强制类型转换。（强制类型转换需要在javascript1.2及以上版本才可以使用）</p>
<p>变量的命名：<br />
1.必须以字母或下划线开头，中间可以有字母数字和或下划线。不能使用空格、+、-等其他符号。<br />
    作为连字符外，变量名称不能有空格、（＋）、（－）、（，）或其它符号。<br />
2.不能使用<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/javascript" title="查看 JavaScript 中的全部文章" target="_blank">JavaScript</a></span>中的关键字作为变量。<br />
  （javascript变量名是区分大小写的，name和Name是不一样的。）</p>
<p>对于变量还有一个重要性──那就是变量的作用域。在<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/javascript" title="查看 JavaScript 中的全部文章" target="_blank">JavaScript</a></span>中同样有全局变量和局部变量。全局变量是定义在所有函数体之外，其作用范围是整个函数；而局部变量是定义在函数体之内，只对其该函数是可见的，而对其它函数则是不可见的。<br />
如果局部变量和全局变量重名，则局部变量优先。js没有块级作用域。函数中声明的所有的变量，作用域是相同的。</p>
<p>变量的类型规则<br />
javascript是无类型的，他的变量可以放任何数据类型的值。<br />
变量的声明<br />
在javascript程序中，在使用变量之前，必须先声明它。变量是使用关键字var声明的。而实际上，不一定要先声明变量，在某些情况下，变量声明是可选的。<br />
    var i；<br />
    var sum；<br />
也可以使用一个var关键字声明多个变量；<br />
    var i，sum；<br />
而且还可以将变量声明和变量初始化绑定在一起：<br />
    var message = ‘hello’；<br />
    var i = 0，j=0，k=0；<br />
    由var声明的变量是永久的，因为各浏览器对是否可以删除全局性的变量的态度是不同的，（都可以删除局部变量）为了安全，最好假设全局变量不可删除。<br />
    可以使用var多次声明同一个变量，当你给一个没有声明的变量赋值时，js会自动用哪个变量为你创建一个全局变量。如果你想在函数内部创建一个局部变量。那就必须用var在函数内部声明。</p>
<p>七、javascript表达式和运算符<br />
表达式：在定义完变量后，就可以对它们进行赋值、改变、计算等一系列操作，这一过程通常由表达式来完成，可以说它是变量、常量、布尔及运算符的集合，因此表达式可以分为算术表述式、字串表达式、赋值表达式以及布尔表达式等。<br />
1.算术运算符：+（加） 、-（减）、 *（乘）、 /（除）、 %（取模） -（取反）、++（递加1）、–（递减1）。<br />
例：11%2=1 ； 如果x=2   ++x+4=7     x+++4=6（++x是先执行加1，x++是执行完语句之后x在自加1)<br />
例子：<br />
&lt;script&gt;<br />
var i=0, j=0;<br />
alert(i++ + ” ” + ++j + ” ” + i);<br />
// 输出 “0 1 1”，可见i++是先输出了i，然后进行运算，而++j是先对j进行了自加运算，然后输出j的值<br />
&lt;/script&gt;<br />
2.比较运算符：&lt;(小于)、&gt;(大于)、&lt;=(小于等于)、&gt;=(大于等于)、==(等于)、!=(不等于)<br />
               （基本操作过程是，首先对它的操作数进行比较，然后再返回一个true或False值。）<br />
3.逻辑运算符：!（取反)、&amp;=（与之后赋值）、 &amp;（逻辑与）、 |=（或之后赋值）、 |（逻辑或）、^=（异或之后赋值）、 ^（逻辑异或）、 ?:（三目操作符）、||（或）、&amp;&amp; （与）==(等于)、|=(不等于)。<br />
4.字符串运算符：只有+   （”my“+”javascript“结果等于”my javascript“）<br />
5.赋值运算符：即=，将右边的值赋给左边的变量。<br />
6.条件运算符：（？：）例：status=(age&gt;=18)?”adult”:”child”;如果大于18，则表达式的值为adult。<br />
7.typeof()运算符：用来返回变量或数据的类型。</p>
<p>八、IF语句。<br />
if (条件)<br />
语句段１<br />
else<br />
语句段２<br />
功能：若表达式为true，则执行语句段１；否则执行语句段２。<br />
说明：<br />
if -else 语句是JavaScript中最基本的控制语句，通过它可以改变语句的执行顺序。<br />
表达式中必须使用关系语句，来实现判断，它是作为一个布尔值来估算的。<br />
它将零和非零的数分别转化成false和true。<br />
若if后的语句有多行，则必须使用花括号将其括起来。</p>
<p>九、window.com()的用法<br />
1、基本语法<br />
  window.open(pageURL,name,parameters)<br />
  其中：<br />
    pageURL 为子窗口路径<br />
    name 为子窗口句柄<br />
    parameters 为窗口参数(各参数用逗号分隔)<br />
2. 窗口参数<br />
   其中yes/no也可使用1/0； value为具体的数值，单位象素。<br />
   toolbar=yes,no 是否显示工具条<br />
   location=yes,no 是否显示网址栏<br />
   directories=yes,no 是否显示导航条<br />
   status=yes,no 是否显示状态条<br />
   menubar=yes,no 是否显示菜单<br />
   scrollbars=yes,no 是否显示滚动条<br />
   resizable=yes,no 是否可以改变公告窗口大小<br />
   copyhistory=yes,no 是否显示历史按钮<br />
   width=value 公告窗口的宽<br />
   height=value 公告窗口的高<br />
   left=value 公告窗口的左上顶点距屏幕左边100像素<br />
   top=value 公告窗口的左上顶点距屏幕顶端100像素<br />
例：<br />
&lt;script language=”javascript”&gt;<br />
&lt;!–<br />
window.open(”00000.html”,”newwindow”,”toolbar=no,location=no,directories=no,status=no,menubar=no,<br />
scrollbars=no,resizable=no,copyhistory=no,width=500,height=500,left=100,top=100″)  //–&gt;<br />
&lt;/script&gt;</p>
<p>十、for循环。另外就是数据类型。既for  in<br />
将字符串转换为数值：<br />
javascript语言提供两个内置函数将表示数值的字符串转换为真实的数值：parseInt()和parseFloat()。<br />
为了使用这些函数，需要将进行转换的字符串作为参数传入函数，例：<br />
    parseInt(”42″)     //result=42<br />
    parseInt(”42.33″)   //result=42<br />
不过是浮点数还是整数，函数返回的值都是整数。不存在四舍五入，小数点和它后面的数字将被舍弃。<br />
而parseFloat()则返回浮点数（如果是整数就返回整数），例：<br />
    parseFloat(”42″)   //result=42<br />
    parseFloat(”42.33″) //result=42.33<br />
如果在某处需要进行字符串的转换，只需将函数插入该初即可。如：<br />
    3+3+parseInt(”3″)   //result=9</p>
<p>将数值转换为字符串：<br />
虽然当遇到表达式中含有混合数据类型时，js会倾向于字符串。但为了防止潜在的问题发生，最好先转换以下。在数值中加入空字符串就可以把数值转换为字符串了：<br />
(””+2500)         //result=”2500″<br />
(””+2500).length   //result=4</p>
<p>For循环:<br />
javascript中最常用的循环结构称之为for循环，关键词放在循环结构的开始位置。正式语法结构如下：<br />
for ([initial expression];[condition];[update expression]){<br />
  statement[s] inside loop<br />
}<br />
例：<br />
for(var i=0;i&lt;9;i++)<br />
{<br />
n+=i<br />
myfunc(n)<br />
}<br />
for…in循环:<br />
这个语句完全依照变量var所设定的值决定运行次数。你可以用for…in语句在一个对象或一个数组上建立循环<br />
for(var in [obj | array])<br />
{<br />
statements<br />
}<br />
例：<br />
&lt;script language=”javascript”&gt;<br />
document.write(”The properties of the document object”)<br />
for(var element in document){<br />
document.write(element+”=”+document[element])<br />
}<br />
&lt;/script&gt;</p>
<p>十一、鼠标事件<br />
主要内容就是基于鼠标的事件,有如下几种：<br />
1.mouseover（鼠标移至）<br />
2.mouseout（鼠标移出）<br />
3.mousemove（鼠标移动）<br />
4.mousedown（鼠标按下）<br />
5.mouseup（鼠标弹起）<br />
6.click（单击）<br />
7.dblclick（双击）<br />
例子：<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;test&lt;/title&gt;<br />
&lt;script language=”javascript”&gt;<br />
function text_onmouseover(){<br />
mytext.style.fontSize=”30pt”;<br />
mytext.style.color=”red”;<br />
mytext.style.fontStyle=”italic”;<br />
}<br />
function text_onmouseout(){<br />
mytext.style.fontSize=”20pt”;<br />
mytext.style.color=”blue”;<br />
mytext.style.fontStyle=”normal”;<br />
}<br />
&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;p id=mytext onmouseover=”text_onmouseover()” onmouseout=”text_onmouseout()”&gt;http://www.javascript.com.cn&lt;/p&gt;<br />
&lt;p&gt;看看字体样式有什么变化&lt;/p&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
8.mouseDown事件和mouseUp事件<br />
    大家知道，mouseDown事件和mouseUp事件的组合就是click事件，但是如果在链接上按下鼠标，并移到链接之外在放开鼠标，那么就只有mouseDown事件了。这两个事件可以增加图标按钮的图像效果，<br />
    至于mouseDown和mouseUp的属性，它们是伴随着Click事件发生的，这和keyPress事件是keyDown事件和keyUp事件组合而成的机制是一样的，这3个鼠标事件也有modifier属性。<br />
    （注意：如果在onClick事件处理中使用return语句，它可以接收任何数值。只要这个值不是False，浏览器就可以完成提交。但如果浏览器得到的是False值，表单提交操作就会被取消。）<br />
9.Click事件和dbClick事件<br />
    onClick是单击事件，onDblClick是双击事件，而实际上很难分清连续的单击和双击。它们会互相干扰。而且在ie和其他浏览器的情况还有不同。有的浏览器是双击事件的每一次单击都会触发单击事件，而在ie中，只有双击事件的第一次单击会触发单击事件。不管怎么样，单击事件都不会自动的取消或被忽略。因此，如果想使用单击和双击一个链接时触发两个完全不同的过程，则必须通过编程来延迟单击的动作知道双击。<br />
&lt;script&gt;<br />
var timer=null;<br />
document.onclick=new Function(”timer=setTimeout(click,500)”)<br />
document.ondblclick=new Function(”clearTimeout(timer);dblclick()”)<br />
function click(){<br />
alert(”click”)<br />
}<br />
function dblclick(){<br />
alert(”dblclick”)<br />
}<br />
&lt;/script&gt;</p>
<p>十二、javascript函数.<br />
函数是有function加函数名和一对带有参数括号,以及大括号组成的，其中大括号里是主体javascript语句.<br />
例:<br />
function hanshuname(js) //hanshuname是函数名.<br />
{<br />
document.write(js,”&lt;br&gt;”); //是函数的主体语句.<br />
}<br />
函数可以嵌套,如下:<br />
function qiantao(a,b){<br />
function lqiantao(x){return x*x;}<br />
return Math.sqrt(lqiantao(a)+lqiantao(b));<br />
}<br />
函数还可以作为数据来应用,因此可以象处理其他数据那样来处理函数,如:赋值,存储,传递等.<br />
例:<br />
    function zhi(x){return x*x;}<br />
实际上,函数名没有什么意义,不过是保存函数的变量名而已.<br />
    a=zhi(6);//a存放的是数字36;<br />
    b=zhi;//现在b和zhi引用同一个函数.<br />
    c=b(5);//c存放的是数字25.<br />
在一个函数体内,标识符arguments总是具有特殊含义,它是调用对象的一个特殊属性,用来引用实际参数对象.这个实际参数对象具有大量有用的属性.除此之外,它还兼有数组的角色.<br />
尽管定义javascript函数时都有固定的参数，但调用这个函数时,传递给它的参数数目却可以是任意的，数组arguments[]允许完全存取那些实际参数值.另外,arguments有一个length属性,看如下例子:<br />
    function zhi(x,y,z)<br />
    {<br />
    if(arguments.length !=3){<br />
    alert(”function zhi called with”+arguments.length+”arguments,but it expects 3 arguments.”);<br />
    return null;<br />
    }<br />
    }<br />
数组arguments[ ]还为javascript函数开发了一项重要的可能性,既可以将函数编写为能够接受任意数目的实际参数.<br />
    function zhi()<br />
    {<br />
    var m=Number.NEGATIVE_INFINITY;<br />
    //遍历所有参数<br />
    //检索并记忆最大的一个.<br />
    for(var i=0;i&lt;arguments.length;i++)<br />
    if(arguments&gt;m)m=arguments;<br />
    //返回最大的参数值.<br />
    return m;<br />
    }<br />
    var lazgest=zhi(1,10,100,2,3,1000,4,5,10000,6);<br />
    也可以使用arguments[]数组来编写一个函数.</p>
<p>    调用js函数<br />
    &lt;a href=”#” onClick=”functionName()”&gt;Link text&lt;/a&gt;<br />
    &lt;a href=”javascript:functionName()”&gt;Link text&lt;/a&gt;</p>
<h2  class="related_post_title">您可能感兴趣的文章</h2><ul class="related_post"><li><a href="http://www.52shidai.com/javascript/583.html" title="学习JavaScript三件必须了解的事">学习JavaScript三件必须了解的事</a></li><li><a href="http://www.52shidai.com/web-front/801.html" title="Web 前端优化最佳实践之 JavaScript 篇">Web 前端优化最佳实践之 JavaScript 篇</a></li><li><a href="http://www.52shidai.com/javascript/759.html" title="31个Javascript的实用工具">31个Javascript的实用工具</a></li><li><a href="http://www.52shidai.com/javascript/661.html" title="javascript 正则表达式-替换">javascript 正则表达式-替换</a></li><li><a href="http://www.52shidai.com/javascript/614.html" title="高质量JavaScript代码书写基本要点|值得收藏">高质量JavaScript代码书写基本要点|值得收藏</a></li><li><a href="http://www.52shidai.com/javascript/556.html" title="JavaScript操作iframe里的dom">JavaScript操作iframe里的dom</a></li><li><a href="http://www.52shidai.com/javascript/323.html" title="javascript中的107个基础知识收集整理">javascript中的107个基础知识收集整理</a></li><li><a href="http://www.52shidai.com/javascript/62.html" title="JavaScript面向对象之静态与非静态类">JavaScript面向对象之静态与非静态类</a></li><li><a href="http://www.52shidai.com/javascript/56.html" title="JavaScript trim函数的十二种实现">JavaScript trim函数的十二种实现</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.52shidai.com/javascript/585.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>学习JavaScript三件必须了解的事</title>
		<link>http://www.52shidai.com/javascript/583.html</link>
		<comments>http://www.52shidai.com/javascript/583.html#comments</comments>
		<pubDate>Mon, 26 Jul 2010 11:09:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[学习]]></category>

		<guid isPermaLink="false">http://www.52shidai.com/?p=583</guid>
		<description><![CDATA[JavaScript可算是世界上最流行的编程语言，如今也越来越被开发者们所重视，对任何JavaScript开发者而言，有三件必须了解的事。 首先开发者必须知道如何正确地使用JavaScript语言。很多开发者还不熟悉这个语言时，就开始使用它，所以会衍生很多问题。 对开发者而言，必须了解语言特性后，再开始运用它。因为JavaScript是非常强大的语言，开发过程要处理很多工作，只有真正了解语言特性，才可以拥有更多生产力，开发者才能更快乐。   JavaScript是一种函数语言(Functional Language)，可用来控制动态对象，也提供开发者熟悉的语法，这反映出它的功能特殊性，从对象角度来看，其实JavaScript语言比Java、C++或C#语言更优秀。 但是很多人痛恨JavaScript，其实是因为不了解JavaScript所工作的环境，这正是开发者必须知道的第二件事。开发者之所以痛恨JavaScript，其实他们痛恨的是浏览器提供的DOM组件。DOM的确是一种恐怖的API，若将任何开发语言的标准函式换成DOM以后，任谁都会痛恨这个语言，这就是JavaScript的处境。 浏览器是JavaScript的工作环境，开发者唯有了解浏览器的特性，才能顺利掌握它。新一代的JavaScript标准ECMAScript 5已经初露锋芒了，旨在用更合理的API来取代DOM。 最后一项重点是JavaScript的安全知识。对浏览器应用程序而言，安全永远是最重要的。因为不论用户是否清楚网页程序的确切用途，浏览器都会执行程序，而网页程序很容易加载用户所不知道的程序片段。 我们总是在功能强大和危险之间挣扎，浏览器的功能有限是好事。这样就能区分出程序到底考虑用户还是网站的利益，这是浏览器的重要创新。可是，浏览器只能分辨出使用者、网站或浏览器本身的意图，无法分辨出其他程序的意图，例如浏览器无法预料跨站脚本攻击(XSS)可以透过混搭程序渗透到网页中。 在混搭的网络应用中， 每一个外挂组件代表了不同的利益和意图。软件界过去几十年一直在寻找这类组件，JavaScript和浏览器是第一个成功者。但是，浏览器最大问题是让每一个组件取得所有权限，所以混搭组件会衍生出跨站脚本攻击。 您可能感兴趣的文章js入门学习：Javascript的学习笔记Web 前端优化最佳实践之 JavaScript 篇31个Javascript的实用工具javascript 正则表达式-替换高质量JavaScript代码书写基本要点&#124;值得收藏JavaScript操作iframe里的domjavascript中的107个基础知识收集整理JavaScript面向对象之静态与非静态类JavaScript trim函数的十二种实现]]></description>
			<content:encoded><![CDATA[<p><span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/javascript" title="查看 JavaScript 中的全部文章" target="_blank">JavaScript</a></span>可算是世界上最流行的编程语言，如今也越来越被开发者们所重视，对任何<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/javascript" title="查看 JavaScript 中的全部文章" target="_blank">JavaScript</a></span>开发者而言，有三件必须了解的事。</p>
<p>首先开发者必须知道如何正确地使用<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/javascript" title="查看 JavaScript 中的全部文章" target="_blank">JavaScript</a></span>语言。很多开发者还不熟悉这个语言时，就开始使用它，所以会衍生很多问题。</p>
<p>对开发者而言，必须了解语言特性后，再开始运用它。因为JavaScript是非常强大的语言，开发过程要处理很多工作，只有真正了解语言特性，才可以拥有更多生产力，开发者才能更快乐。<br />
 <br />
JavaScript是一种函数语言(Functional Language)，可用来控制动态对象，也提供开发者熟悉的语法，这反映出它的功能特殊性，从对象角度来看，其实JavaScript语言比Java、C++或C#语言更优秀。</p>
<p>但是很多人痛恨JavaScript，其实是因为不了解JavaScript所工作的环境，这正是开发者必须知道的第二件事。开发者之所以痛恨JavaScript，其实他们痛恨的是浏览器提供的DOM组件。DOM的确是一种恐怖的API，若将任何开发语言的标准函式换成DOM以后，任谁都会痛恨这个语言，这就是JavaScript的处境。</p>
<p>浏览器是JavaScript的工作环境，开发者唯有了解浏览器的特性，才能顺利掌握它。新一代的JavaScript标准ECMAScript 5已经初露锋芒了，旨在用更合理的API来取代DOM。</p>
<p>最后一项重点是JavaScript的安全知识。对浏览器应用程序而言，安全永远是最重要的。因为不论用户是否清楚网页程序的确切用途，浏览器都会执行程序，而网页程序很容易加载用户所不知道的程序片段。</p>
<p>我们总是在功能强大和危险之间挣扎，浏览器的功能有限是好事。这样就能区分出程序到底考虑用户还是网站的利益，这是浏览器的重要创新。可是，浏览器只能分辨出使用者、网站或浏览器本身的意图，无法分辨出其他程序的意图，例如浏览器无法预料跨站脚本攻击(XSS)可以透过混搭程序渗透到网页中。</p>
<p>在混搭的网络应用中， 每一个外挂组件代表了不同的利益和意图。软件界过去几十年一直在寻找这类组件，JavaScript和浏览器是第一个成功者。但是，浏览器最大问题是让每一个组件取得所有权限，所以混搭组件会衍生出跨站脚本攻击。</p>
<h2  class="related_post_title">您可能感兴趣的文章</h2><ul class="related_post"><li><a href="http://www.52shidai.com/javascript/585.html" title="js入门学习：Javascript的学习笔记">js入门学习：Javascript的学习笔记</a></li><li><a href="http://www.52shidai.com/web-front/801.html" title="Web 前端优化最佳实践之 JavaScript 篇">Web 前端优化最佳实践之 JavaScript 篇</a></li><li><a href="http://www.52shidai.com/javascript/759.html" title="31个Javascript的实用工具">31个Javascript的实用工具</a></li><li><a href="http://www.52shidai.com/javascript/661.html" title="javascript 正则表达式-替换">javascript 正则表达式-替换</a></li><li><a href="http://www.52shidai.com/javascript/614.html" title="高质量JavaScript代码书写基本要点|值得收藏">高质量JavaScript代码书写基本要点|值得收藏</a></li><li><a href="http://www.52shidai.com/javascript/556.html" title="JavaScript操作iframe里的dom">JavaScript操作iframe里的dom</a></li><li><a href="http://www.52shidai.com/javascript/323.html" title="javascript中的107个基础知识收集整理">javascript中的107个基础知识收集整理</a></li><li><a href="http://www.52shidai.com/javascript/62.html" title="JavaScript面向对象之静态与非静态类">JavaScript面向对象之静态与非静态类</a></li><li><a href="http://www.52shidai.com/javascript/56.html" title="JavaScript trim函数的十二种实现">JavaScript trim函数的十二种实现</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.52shidai.com/javascript/583.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript操作iframe里的dom</title>
		<link>http://www.52shidai.com/javascript/556.html</link>
		<comments>http://www.52shidai.com/javascript/556.html#comments</comments>
		<pubDate>Fri, 09 Jul 2010 11:05:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[iframe]]></category>

		<guid isPermaLink="false">http://www.52shidai.com/?p=556</guid>
		<description><![CDATA[一、父级窗口操作iframe里的dom JS操作iframe里的dom可是使用contentWindow属性，contentWindow属性是指指定的frame或者iframe所在的window对象，在IE中iframe或者frame的contentWindow属性可以省略，但在Firefox中如果要对iframe对象进行编辑则，必须指定contentWindow属性，contentWindow属性支持所有主流浏览器。 相关的还有一个contentDocument属性，这个属性是指指定的frame或者iframe所在的document对象，但是悲剧的是，ie6-ie7并不支持这个属性。 ie6和ie7还可以使用document.frames["iframe Name"]或者document.frames["iframe ID"]来获取相当于contentWindow属性，而firefox和chrome并不支持这些document.frames["iframe Name"]或者document.frames["iframe ID"]，但是window.frames["iframe Name"]或window.frames[index]（index是索引值）也支持所有主流浏览器； 这个可以看实例：http://www.css88.com/demo/iframe-correspond/index-test.html 我们知道document对象是window对象的一个子对象，所以我们可以通过document.getElementById(“iframe ID”).contentWindow.document来获取iframe的document对象，相当于contentDocument属性。 二、iframe里的js操作父级窗口的dom iframe里的js要操作父级窗口的dom，必须搞懂几个对象： parent是父窗口（如果窗口是顶级窗口，那么parent==self==top）， top是最顶级父窗口（有的窗口中套了好几层frameset或者iframe）， self是当前窗口（等价window）， opener是用open方法打开当前窗口的那个窗口； 这样iframe里的js要操作父级窗口的dom可以通过parent，top这些对象来获取父窗口的window对象，例如： parent.document.getElementById(“dom ID”)； parent，top还能调用父级窗口的的js方法，比如，getIFrameDOM(iID）是父级窗口的一个方法，那么iframe里可以使用parent.getIFrameDOM(“wIframeA”)来调用父级窗口的getIFrameDOM(iID）方法； ———————————————— 查看一下JS操作iframe里的dom的demo：http://www.css88.com/demo/iframe-correspond/ 虽然iframe在现在WEB开发中越来越少用到了，但是iframe还有很多值得使用的地方，比如使用iframe解决跨域问题.关于iframe还有很多东西要学习，比如iframe自适应高度，使用iframe解决跨域问题，iframe加载问题，iframe加载性能问题等等，还有很多东西要学习， 您可能感兴趣的文章Web 前端优化最佳实践之 JavaScript 篇31个Javascript的实用工具javascript 正则表达式-替换高质量JavaScript代码书写基本要点&#124;值得收藏js入门学习：Javascript的学习笔记学习JavaScript三件必须了解的事javascript中的107个基础知识收集整理jsDom 事件处理函数JavaScript面向对象之静态与非静态类JavaScript trim函数的十二种实现]]></description>
			<content:encoded><![CDATA[<h2>一、父级窗口操作<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/iframe" title="查看 iframe 中的全部文章" target="_blank">iframe</a></span>里的<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/dom" title="查看 dom 中的全部文章" target="_blank">dom</a></span></h2>
<p>JS操作<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/iframe" title="查看 iframe 中的全部文章" target="_blank">iframe</a></span>里的<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/dom" title="查看 dom 中的全部文章" target="_blank">dom</a></span>可是使用contentWindow属性，contentWindow属性是指指定的frame或者<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/iframe" title="查看 iframe 中的全部文章" target="_blank">iframe</a></span>所在的window对象，在IE中iframe或者frame的contentWindow属性可以省略，但在Firefox中如果要对iframe对象进行编辑则，必须指定contentWindow属性，<strong>contentWindow属性支持所有主流浏览器</strong>。</p>
<p>相关的还有一个contentDocument属性，这个属性是指指定的frame或者iframe所在的document对象，但是悲剧的是，ie6-ie7并不支持这个属性。</p>
<p>ie6和ie7还可以使用document.frames["iframe Name"]或者document.frames["iframe ID"]来获取相当于contentWindow属性，而firefox和chrome并不支持这些document.frames["iframe Name"]或者document.frames["iframe ID"]，<strong>但是window.frames["iframe Name"]或window.frames[index]（index是索引值）也支持所有主流浏览器</strong>；</p>
<p>这个可以看实例：<a href="http://www.css88.com/demo/iframe-correspond/index-test.html" target="_blank">http://www.css88.com/demo/iframe-correspond/index-test.html</a></p>
<p>我们知道document对象是window对象的一个子对象，所以我们可以通过document.getElementById(“iframe ID”).contentWindow.document来获取iframe的document对象，相当于contentDocument属性。</p>
<h2>二、iframe里的js操作父级窗口的dom</h2>
<p>iframe里的js要操作父级窗口的dom，必须搞懂几个对象：</p>
<p>parent是父窗口（如果窗口是顶级窗口，那么parent==self==top），</p>
<p>top是最顶级父窗口（有的窗口中套了好几层frameset或者iframe），</p>
<p>self是当前窗口（等价window），</p>
<p>opener是用open方法打开当前窗口的那个窗口；</p>
<p>这样iframe里的js要操作父级窗口的dom可以通过parent，top这些对象来获取父窗口的window对象，例如：</p>
<p>parent.document.getElementById(“dom ID”)；</p>
<p>parent，top还能调用父级窗口的的js方法，比如，getIFrameDOM(iID）是父级窗口的一个方法，那么iframe里可以使用parent.getIFrameDOM(“wIframeA”)来调用父级窗口的getIFrameDOM(iID）方法；</p>
<p>————————————————</p>
<p>查看一下JS操作iframe里的dom的demo：<a href="http://www.css88.com/demo/iframe-correspond/" target="_blank">http://www.css88.com/demo/iframe-correspond/</a></p>
<p>虽然iframe在现在WEB开发中越来越少用到了，但是iframe还有很多值得使用的地方，比如使用iframe解决跨域问题.关于iframe还有很多东西要学习，比如iframe自适应高度，使用iframe解决跨域问题，iframe加载问题，iframe加载性能问题等等，还有很多东西要学习，</p>
<h2  class="related_post_title">您可能感兴趣的文章</h2><ul class="related_post"><li><a href="http://www.52shidai.com/web-front/801.html" title="Web 前端优化最佳实践之 JavaScript 篇">Web 前端优化最佳实践之 JavaScript 篇</a></li><li><a href="http://www.52shidai.com/javascript/759.html" title="31个Javascript的实用工具">31个Javascript的实用工具</a></li><li><a href="http://www.52shidai.com/javascript/661.html" title="javascript 正则表达式-替换">javascript 正则表达式-替换</a></li><li><a href="http://www.52shidai.com/javascript/614.html" title="高质量JavaScript代码书写基本要点|值得收藏">高质量JavaScript代码书写基本要点|值得收藏</a></li><li><a href="http://www.52shidai.com/javascript/585.html" title="js入门学习：Javascript的学习笔记">js入门学习：Javascript的学习笔记</a></li><li><a href="http://www.52shidai.com/javascript/583.html" title="学习JavaScript三件必须了解的事">学习JavaScript三件必须了解的事</a></li><li><a href="http://www.52shidai.com/javascript/323.html" title="javascript中的107个基础知识收集整理">javascript中的107个基础知识收集整理</a></li><li><a href="http://www.52shidai.com/javascript/244.html" title="jsDom 事件处理函数">jsDom 事件处理函数</a></li><li><a href="http://www.52shidai.com/javascript/62.html" title="JavaScript面向对象之静态与非静态类">JavaScript面向对象之静态与非静态类</a></li><li><a href="http://www.52shidai.com/javascript/56.html" title="JavaScript trim函数的十二种实现">JavaScript trim函数的十二种实现</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.52shidai.com/javascript/556.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>javascript中的107个基础知识收集整理</title>
		<link>http://www.52shidai.com/javascript/323.html</link>
		<comments>http://www.52shidai.com/javascript/323.html#comments</comments>
		<pubDate>Tue, 30 Mar 2010 05:34:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[基础]]></category>
		<category><![CDATA[整理]]></category>

		<guid isPermaLink="false">http://www.52shidai.com/?p=323</guid>
		<description><![CDATA[1.document.write(""); 输出语句 
2.JS中的注释为// 
3.传统的HTML文档顺序是:document->html->(head,body) 
4.一个浏览器窗口中的DOM顺序是:window->(navigator,screen,history,location,document) 
5.得到表单中元素的名称和值:document.getElementById("表单中元素的ID号").name(或value) 
6.一个小写转大写的js: document.getElementById("output").value = document.getElementById("i 
nput").value.toUpperCase(); ]]></description>
			<content:encoded><![CDATA[<p>1.document.write(“”); 输出语句<br />
2.JS中的注释为//<br />
3.传统的HTML文档顺序是:document->html->(head,body)<br />
4.一个浏览器窗口中的DOM顺序是:window->(navigator,screen,history,location,document)<br />
5.得到表单中元素的名称和值:document.getElementById(“表单中元素的ID号”).name(或value)<br />
6.一个小写转大写的js: document.getElementById(“output”).value = document.getElementById(“i<br />
nput”).value.toUpperCase();<br />
7.JS中的值类型:String,Number,Boolean,Null,Object,Function<br />
8.JS中的字符型转换成数值型:parseInt(),parseFloat()<br />
9.JS中的数字转换成字符型:(“”+变量)<br />
10.JS中的取字符串长度是:(length)<br />
11.JS中的字符与字符相连接使用+号.<br />
12.JS中的比较操作符有:==等于,!=不等于,>,>=,<.<=<br />
13.JS中声明变量使用:var来进行声明<br />
14.JS中的判断语句结构:if(condition){}else{}<br />
15.JS中的循环结构:for([initial expression];[condition];[upadte expression]) {inside loop}<br />
16.循环中止的命令是:break<br />
17.JS中的函数定义:function functionName([parameter],&#8230;)<br />
18.当文件中出现多个form表单时.可以用document.forms[0],document.forms[1]来代替.<br />
//http://www.devdao.com<br />
19.窗口:打开窗口window.open(), 关闭一个窗口:window.close(), 窗口本身:self<br />
20.状态栏的设置:window.status=”字符”;<br />
21.弹出提示信息:window.alert(“字符”);<br />
22.弹出确认框:window.confirm();<br />
23.弹出输入提示框:window.prompt();<br />
24.指定当前显示链接的位置:window.location.href=”URL”<br />
25.取出窗体中的所有表单的数量:document.forms.length<br />
26.关闭文档的输出流:document.close();<br />
27.字符串追加连接符:+=<br />
28.创建一个文档元素:document.createElement(),document.createTextNode()<br />
29.得到元素的方法:document.getElementById()<br />
30.设置表单中所有文本型的成员的值为空:<br />
var form = window.document.forms[0]<br />
for (var i = 0; i if (form.elements.type == “text”){<br />
form.elements.value = “”;<br />
}<br />
}<br />
31.复选按钮在JS中判断是否选中:document.forms[0].checkThis.checked (checked属性代表为是否选中<br />
返回TRUE或FALSE)<br />
32.单选按钮组(单选按钮的名称必须相同):取单选按钮组的长度document.forms[0].groupName.length<br />
33.单选按钮组判断是否被选中也是用checked.<br />
34.下拉列表框的值:document.forms[0].selectName.options[n].value (n有时用下拉列表框名称加上.sel<br />
ectedIndex来确定被选中的值)<br />
35.字符串的定义:var myString = new String(“This is lightsword”);<br />
36.字符串转成大写:string.toUpperCase(); 字符串转成小写:string.toLowerCase();<br />
37.返回字符串2在字符串1中出现的位置:String1.indexOf(“String2&#8243;)!=-1则说明没找到.<br />
38.取字符串中指定位置的一个字符:StringA.charAt(9);<br />
39.取出字符串中指定起点和终点的子字符串:stringA.substring(2,6);<br />
40.数学函数:Math.PI(返回圆周率),Math.SQRT2(返回开方),Math.max(value1,value2)返回两个数中的最<br />
在值,Math.pow(value1,10)返回value1的十次方,Math.round(value1)四舍五入函数,Math.floor(Math.ra<br />
ndom()*(n+1))返回随机数<br />
41.定义日期型变量:var today = new Date();<br />
42.日期函数列表:dateObj.getTime()得到时间,dateObj.getYear()得到年份,dateObj.getFullYear()得到<br />
四位的年份,dateObj.getMonth()得到月份,dateObj.getDate()得到日,dateObj.getDay()得到日期几,dat<br />
eObj.getHours()得到小时,dateObj.getMinutes()得到分,dateObj.getSeconds()得到秒,dateObj.setTi<br />
me(value)设置时间,dateObj.setYear(val)设置年,dateObj.setMonth(val)设置月,dateObj.setDate(va<br />
l)设置日,dateObj.setDay(val)设置星期几,dateObj.setHours设置小时,dateObj.setMinutes(val)设置分,<br />
dateObj.setSeconds(val)设置秒 [注意:此日期时间从0开始计]<br />
43.FRAME的表示方式: [window.]frames[n].ObjFuncVarName,frames["frameName"].ObjFuncVarN<br />
ame,frameName.ObjFuncVarName<br />
44.parent代表父亲对象,top代表最顶端对象<br />
45.打开子窗口的父窗口为:opener<br />
46.表示当前所属的位置:this<br />
47.当在超链接中调用JS函数时用:(javascript <img src='http://www.52shidai.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> 来开头后面加函数名<br />
48.在老的浏览器中不执行此js:<br />
49.引用一个文件式的js:<br />
50.指定在不支持脚本的浏览器显示的HTML:<br />
51.当超链和onCLICK事件都有时,则老版本的浏览器转向a.html,否则转向b.html.例:dfsadf<br />
52.JS的内建对象有:Array,Boolean,Date,Error,EvalError,Function,Math,Number,Object,RangeError,<br />
ReferenceError,RegExp,String,SyntaxError,TypeError,URIError<br />
53.JS中的换行:\n<br />
54.窗口全屏大小:<br />
55.JS中的all代表其下层的全部元素<br />
56.JS中的焦点顺序:document.getElementByid(“表单元素”).tabIndex = 1<br />
57.innerHTML的值是表单元素的值:如<br />
“how are you” </p>
<p>,则innerHTML的值就是:how are you<br />
58.innerTEXT的值和上面的一样,只不过不会把这种标记显示出来.<br />
59.contentEditable可设置元素是否可被修改,isContentEditable返回是否可修改的状态.<br />
60.isDisabled判断是否为禁止状态.disabled设置禁止状态<br />
61.length取得长度,返回整型数值<br />
62.addBehavior()是一种JS调用的外部函数文件其扩展名为.htc<br />
63.window.focus()使当前的窗口在所有窗口之前.<br />
64.blur()指失去焦点.与FOCUS()相反.<br />
65.select()指元素为选中状态.<br />
66.防止用户对文本框中输入文本:onfocus=”this.blur()”<br />
67.取出该元素在页面中出现的数量:document.all.tags(“div(或其它HTML标记符)”).length<br />
68.JS中分为两种窗体输出:模态和非模态.window.showModaldialog(),window.showModeless()<br />
69.状态栏文字的设置:window.status=&#8217;文字&#8217;,默认的状态栏文字设置:window.defaultStatus = &#8216;文字.&#8217;;<br />
70.添加到收藏夹:external.AddFavorite(“http://www.dannyg.com”t;,”jaskdlf”);<br />
71.JS中遇到脚本错误时不做任何操作:window.onerror = doNothing; 指定错误句柄的语法为:window.on<br />
error = handleError;<br />
72.JS中指定当前打开窗口的父窗口:window.opener,支持opener.opener&#8230;的多重继续.<br />
73.JS中的self指的是当前的窗口<br />
74.JS中状态栏显示内容:window.status=”内容”<br />
75.JS中的top指的是框架集中最顶层的框架<br />
76.JS中关闭当前的窗口:window.close();<br />
77.JS中提出是否确认的框:if(confirm(“Are you sure?”))else{alert(“Not Ok”);}<br />
78.JS中的窗口重定向:window.navigate(“http://www.sina.com.cn”t;);<br />
79.JS中的打印:window.print()<br />
80.JS中的提示输入框:window.prompt(“message”,”defaultReply”);<br />
81.JS中的窗口滚动条:window.scroll(x,y)<br />
82.JS中的窗口滚动到位置:window.scrollby<br />
83.JS中设置时间间隔:setInterval(“expr”,msecDelay)或setInterval(funcRef,msecDelay)或setTimeou<br />
t<br />
84.JS中的模态显示在IE4+行,在NN中不行:showModalDialog(“URL”[,arguments][,features]);<br />
85.JS中的退出之前使用的句柄:function verifyClose(){event.returnValue=”we really like you and ho<br />
pe you will stay longer.”;}} window.onbeforeunload=verifyClose;<br />
86.当窗体第一次调用时使用的文件句柄:onload()<br />
87.当窗体关闭时调用的文件句柄:onunload()<br />
88.window.location的属性: protocol(http:),hostname(example.com),port(80),host(e<br />
xample.com:80),pathname(“/a/a.html”),hash(“#giantGizmo”,指跳转到相应的锚记),href(全部的信<br />
息)<br />
89.window.location.reload()刷新当前页面.<br />
90.window.history.back()返回上一页,window.history.forward()返回下一页,window.history.go(返回<br />
第几页,也可以使用访问过的URL)<br />
91.document.write()不换行的输出,document.writeln()换行输出<br />
92.document.body.noWrap=true;防止链接文字折行.<br />
93.变量名.charAt(第几位),取该变量的第几位的字符.<br />
94.”abc”.charCodeAt(第几个),返回第几个字符的ASCii码值.<br />
95.字符串连接:string.concat(string2),或用+=进行连接<br />
96.变量.indexOf(“字符”,起始位置),返回第一个出现的位置(从0开始计算)<br />
97.string.lastIndexOf(searchString[,startIndex])最后一次出现的位置.<br />
98.string.match(regExpression),判断字符是否匹配.<br />
99.string.replace(regExpression,replaceString)替换现有字符串.<br />
100.string.split(分隔符)返回一个数组存储值.<br />
101.string.substr(start[,length])取从第几位到指定长度的字符串.<br />
102.string.toLowerCase()使字符串全部变为小写.<br />
103.string.toUpperCase()使全部字符变为大写.<br />
104.parseInt(string[,radix(代表进制)])强制转换成整型.<br />
105.parseFloat(string[,radix])强制转换成浮点型.<br />
106.isNaN(变量):测试是否为数值型.<br />
107.定义常量的关键字:const,定义变量的关键字:var </p>
<h2  class="related_post_title">您可能感兴趣的文章</h2><ul class="related_post"><li><a href="http://www.52shidai.com/web-front/801.html" title="Web 前端优化最佳实践之 JavaScript 篇">Web 前端优化最佳实践之 JavaScript 篇</a></li><li><a href="http://www.52shidai.com/javascript/759.html" title="31个Javascript的实用工具">31个Javascript的实用工具</a></li><li><a href="http://www.52shidai.com/javascript/661.html" title="javascript 正则表达式-替换">javascript 正则表达式-替换</a></li><li><a href="http://www.52shidai.com/javascript/614.html" title="高质量JavaScript代码书写基本要点|值得收藏">高质量JavaScript代码书写基本要点|值得收藏</a></li><li><a href="http://www.52shidai.com/javascript/585.html" title="js入门学习：Javascript的学习笔记">js入门学习：Javascript的学习笔记</a></li><li><a href="http://www.52shidai.com/javascript/583.html" title="学习JavaScript三件必须了解的事">学习JavaScript三件必须了解的事</a></li><li><a href="http://www.52shidai.com/javascript/556.html" title="JavaScript操作iframe里的dom">JavaScript操作iframe里的dom</a></li><li><a href="http://www.52shidai.com/javascript/jquery/255.html" title="2009年度最佳jQuery插件整理">2009年度最佳jQuery插件整理</a></li><li><a href="http://www.52shidai.com/javascript/62.html" title="JavaScript面向对象之静态与非静态类">JavaScript面向对象之静态与非静态类</a></li><li><a href="http://www.52shidai.com/javascript/56.html" title="JavaScript trim函数的十二种实现">JavaScript trim函数的十二种实现</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.52shidai.com/javascript/323.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript面向对象之静态与非静态类</title>
		<link>http://www.52shidai.com/javascript/62.html</link>
		<comments>http://www.52shidai.com/javascript/62.html#comments</comments>
		<pubDate>Sun, 07 Feb 2010 01:50:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[对象]]></category>
		<category><![CDATA[静态]]></category>
		<category><![CDATA[非静态]]></category>

		<guid isPermaLink="false">http://52shidai.com/?p=62</guid>
		<description><![CDATA[使用JavaScript面向对象完全出于偶然，因为大部分时间我都是在无图形界面的环境下工作，有时候就算是介入了web客户端的工作的时候，在写js和ajax时，最多的也只是写写function，从没有考虑过要使用JavaScript面向对象这么高级的技巧。 直到有那么一天，我开始在js中拼凑DOM标签，而且需要不停的拼凑，我发现我的代码变得愈发的丑陋，不仅上是代码简洁的问题，甚至有时候还引发了性能问题。长此以往，不出三个月，上帝都将会不知道我写过些什么，本篇的目的完全出于记录使用心得。 首先，还是来看一下促使我改变书写JavaScript习惯的垃圾代码，在练习、测试、调试、甚至正式项目中，大量的充斥着下面的代码。 复制代码 代码如下: Function finduser(userId) { } Function showmessage(msg) { Var message=”提示，出错了，错误原因”+msg; Alert(message); } Function append(obj) { Var onclick=”createdom()”; Var title=”你好”; $(obj).append(“&#60;a href=&#8217;javascript:void(0)&#8217; onclick=&#8217;”+onclick+”&#8217; title=&#8217;”+title+”&#8217;&#62;”+title+”&#60;/a&#62;”); } 不要告诉我你没有见过上面的代码，说实话，上面的代码确实写得快，调用简单，如果前两个函数还不足以引发你的愤慨，那么第三个函数应该让你有点想问候写这代码创建者的冲动了。是的，第三个函数直接触发了我决定使用面向对象。 实际上，我完全可以把第三个函数改造成下面这样。 复制代码 代码如下: function append(obj) { var a=document.craeteElement(“a”); a.title=”你好”; a.href=”javascript:void(0);”; a.innerHTML=a.title; a.click=function(){createdom();}; $(obj).append(a); } 这样如何？有进步吧，好，这就是我想要的代码，但是还不够简洁。我希望可以把创建DOM对象封装到一个类中，并且把以上的三个方法都装到一个对象中；那好吧，动手起来是很简单的事情，这种工作不需要上网搜索代码和示例的，直接应用C#的面向对象思维就可以完成。 首先是封装以上的三个方法到一个对象中,封装很简单，应该不用我多废话的，直接上代码。 封装后的三个函数 复制代码 代码如下: User={ Function finduser(userId) { }, Function showmessage(msg) [...]]]></description>
			<content:encoded><![CDATA[<p>使用<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/javascript" title="查看 JavaScript 中的全部文章" target="_blank">JavaScript</a></span>面向<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e5%af%b9%e8%b1%a1" title="查看 对象 中的全部文章" target="_blank">对象</a></span>完全出于偶然，因为大部分时间我都是在无图形界面的环境下工作，有时候就算是介入了web客户端的工作的时候，在写js和ajax时，最多的也只是写写function，从没有考虑过要使用<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/javascript" title="查看 JavaScript 中的全部文章" target="_blank">JavaScript</a></span>面向<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e5%af%b9%e8%b1%a1" title="查看 对象 中的全部文章" target="_blank">对象</a></span>这么高级的技巧。<br />
直到有那么一天，我开始在js中拼凑DOM标签，而且需要不停的拼凑，我发现我的代码变得愈发的丑陋，不仅上是代码简洁的问题，甚至有时候还引发了性能问题。长此以往，不出三个月，上帝都将会不知道我写过些什么，本篇的目的完全出于记录使用心得。<br />
首先，还是来看一下促使我改变书写JavaScript习惯的垃圾代码，在练习、测试、调试、甚至正式项目中，大量的充斥着下面的代码。<br />
复制代码 代码如下:<br />
Function finduser(userId)<br />
{<br />
}<br />
Function showmessage(msg)<br />
{<br />
Var message=”提示，出错了，错误原因”+msg;<br />
Alert(message);<br />
}<br />
Function append(obj)<br />
{<br />
Var onclick=”createdom()”;<br />
Var title=”你好”;<br />
$(obj).append(“&lt;a href=&#8217;javascript:void(0)&#8217; onclick=&#8217;”+onclick+”&#8217; title=&#8217;”+title+”&#8217;&gt;”+title+”&lt;/a&gt;”);<br />
}</p>
<p>不要告诉我你没有见过上面的代码，说实话，上面的代码确实写得快，调用简单，如果前两个函数还不足以引发你的愤慨，那么第三个函数应该让你有点想问候写这代码创建者的冲动了。是的，第三个函数直接触发了我决定使用面向对象。<br />
实际上，我完全可以把第三个函数改造成下面这样。<br />
复制代码 代码如下:<br />
function append(obj)<br />
{<br />
var a=document.craeteElement(“a”);<br />
a.title=”你好”;<br />
a.href=”javascript:void(0);”;<br />
a.innerHTML=a.title;<br />
a.click=function(){createdom();};<br />
$(obj).append(a);<br />
}</p>
<p>这样如何？有进步吧，好，这就是我想要的代码，但是还不够简洁。我希望可以把创建DOM对象封装到一个类中，并且把以上的三个方法都装到一个对象中；那好吧，动手起来是很简单的事情，这种工作不需要上网搜索代码和示例的，直接应用C#的面向对象思维就可以完成。<br />
首先是封装以上的三个方法到一个对象中,封装很简单，应该不用我多废话的，直接上代码。<br />
封装后的三个函数<br />
复制代码 代码如下:<br />
User={<br />
Function finduser(userId)<br />
{<br />
},<br />
Function showmessage(msg)<br />
{<br />
Var message=”提示，出错了，错误原因”+msg;<br />
Alert(message);<br />
},<br />
Function append(obj)<br />
{<br />
Var a=document.craeteElement(“a”);<br />
a.title=”你好”;<br />
a.href=”javascript:void(0);”;<br />
a.innerHTML=a.title;<br />
a.click=function(){createdom();};<br />
$(obj).append(a);<br />
}<br />
}</p>
<p>只需要声明一个User变量来存储上面的三个方法即可，不同的方法间使用逗号分隔，需要注意的是，这时候的User是一个<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e9%9d%99%e6%80%81" title="查看 静态 中的全部文章" target="_blank">静态</a></span>的类，无构造函数或者构造函数私有（我猜的），反正不可new了。<br />
其次，我再创建一个封装创建DOM对象的<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e9%9d%99%e6%80%81" title="查看 静态 中的全部文章" target="_blank">静态</a></span>类，代码如下：<br />
复制代码 代码如下:<br />
createElement={<br />
element=function(targetName){return document.createElement(targetName);},<br />
a=document. createElement(“a”)<br />
}</p>
<p>相当简单，这样我就可以测试一下上面的CreateElement对象是否可正常工作，这次测试是在append方法中进行测试。append方法再次被改造成下面的代码。<br />
复制代码 代码如下:<br />
function append(obj)<br />
{<br />
Var a= createElement .a;<br />
a.title=”你好”;<br />
a.href=”javascript:void(0);”;<br />
a.innerHTML=a.title;<br />
a.click=function(){createdom();};<br />
$(obj).append(a);<br />
}</p>
<p>目前看来，append工作得相当的良好，好吧，我需要作出一点小改动，我需要在append函数中创建三个a并把它依次添加到obj对象中，代码如下：<br />
代码<br />
复制代码 代码如下:<br />
function append(obj)<br />
{<br />
For(i=0;i&lt;3;i++)<br />
{<br />
Var a= createElement .a;<br />
a.title=”你好”;<br />
a.href=”javascript:void(0);”;<br />
a.innerHTML=a.title;<br />
a.click=function(){createdom();};<br />
$(obj).append(a);<br />
}<br />
}</p>
<p>最后显示的结果是obj对象中只得到了一个a我十分的不理解，这一个a让我觉得我又回到了C#的怀抱，多么美好呀，经过分析，当我通过Var a= CreateElement .a;<br />
第一次调用在CreateElement.a来获取a对象时，a属性中的document.createElement(“a”)就已经把a对象驻留到内存中，这之后不管我再怎么调用CreateElement.a，实际上都只是得到了内存中a的一个引用，改变的都竟然是同一个对象，这就是静态类的特别之处，但是，当我通过调用CreateElement.element函数来获取对象时，每次我得到的都是一个新的对象，方法不会保存对象的引用，这是肯定的，解决方法就是通过调用CreateElement.element函数来创建新的对象，但是这种方法非面向对象推荐。<br />
另外一种比较好的解决办法是使用<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e9%9d%9e%e9%9d%99%e6%80%81" title="查看 非静态 中的全部文章" target="_blank">非静态</a></span>类，即实体类的方式，创建<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/%e9%9d%9e%e9%9d%99%e6%80%81" title="查看 非静态 中的全部文章" target="_blank">非静态</a></span>类的方式也是相当的简单，代码如下：<br />
复制代码 代码如下:<br />
createElement=function(){<br />
element=function(targetName){return document.createElement(targetName);};<br />
a=document. createElement(“a”);<br />
}</p>
<p>直接声明createElement对象，并使之有构造函数，成员间以分号进行分隔，当然如果你喜欢，还可以直接这样写，也是没有一样的效果。<br />
复制代码 代码如下:<br />
function createElement (){<br />
element=function(targetName){return document.createElement(targetName);};<br />
a=document. createElement(“a”);<br />
}</p>
<p>经过上面的声明，我们就可以在append函数中像C#一样使用createElement类来创建DOM对象了。<br />
函数<br />
复制代码 代码如下:<br />
function append(obj)<br />
{<br />
for(i=0;i&lt;3;i++)<br />
{<br />
var ele=new createElement();<br />
var a=ele.a;<br />
a.title=”你好”;<br />
a.href=”javascript:void(0);”;<br />
a.innerHTML=a.title;<br />
a.click=function(){createdom();};<br />
$(obj).append(a);<br />
}<br />
}</p>
<p>这样每次new createElement()都是一个新的对象，不存在引用的问题了。<br />
实际上，上面提到的就是Javascript中静态类和非静态类的区别；当然也从中得知，使用静态类非静态类的效率上还是有些差别的，而且调用的时候肯定也是静态类方便一些，如果不计较引用冲突问题，我觉得静态类应该是首选的。</p>
<h2  class="related_post_title">您可能感兴趣的文章</h2><ul class="related_post"><li><a href="http://www.52shidai.com/javascript/614.html" title="高质量JavaScript代码书写基本要点|值得收藏">高质量JavaScript代码书写基本要点|值得收藏</a></li><li><a href="http://www.52shidai.com/web-front/801.html" title="Web 前端优化最佳实践之 JavaScript 篇">Web 前端优化最佳实践之 JavaScript 篇</a></li><li><a href="http://www.52shidai.com/javascript/759.html" title="31个Javascript的实用工具">31个Javascript的实用工具</a></li><li><a href="http://www.52shidai.com/javascript/661.html" title="javascript 正则表达式-替换">javascript 正则表达式-替换</a></li><li><a href="http://www.52shidai.com/javascript/585.html" title="js入门学习：Javascript的学习笔记">js入门学习：Javascript的学习笔记</a></li><li><a href="http://www.52shidai.com/javascript/583.html" title="学习JavaScript三件必须了解的事">学习JavaScript三件必须了解的事</a></li><li><a href="http://www.52shidai.com/javascript/556.html" title="JavaScript操作iframe里的dom">JavaScript操作iframe里的dom</a></li><li><a href="http://www.52shidai.com/javascript/323.html" title="javascript中的107个基础知识收集整理">javascript中的107个基础知识收集整理</a></li><li><a href="http://www.52shidai.com/javascript/56.html" title="JavaScript trim函数的十二种实现">JavaScript trim函数的十二种实现</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.52shidai.com/javascript/62.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript trim函数的十二种实现</title>
		<link>http://www.52shidai.com/javascript/56.html</link>
		<comments>http://www.52shidai.com/javascript/56.html#comments</comments>
		<pubDate>Sun, 07 Feb 2010 01:39:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[trim]]></category>

		<guid isPermaLink="false">http://52shidai.com/?p=56</guid>
		<description><![CDATA[实现1 1.String.prototype.trim = function() { 2.  return this.replace(/^\s\s*/, ”).replace(/\s\s*$/, ”); 3.} 看起来不怎么样，动用了两次正则替换，实际速度非常惊人，主要得益于浏览器的内部优化。一个著名的例子字符串拼接，直接相加比用Array做成的StringBuffer还快。base2类库使用这种实现。 实现2 1.String.prototype.trim = function() { 2.  return this.replace(/^\s+/, ”).replace(/\s+$/, ”); 3.} 和实现1很相似，但稍慢一点，主要原因是它最先是假设至少存在一个空白符。Prototype.js使用这种实现，不过其名字为strip，因为Prototype的方法都是力求与Ruby同名。 实现3 1.String.prototype.trim = function() { 2.  return  this.substring(Math.max(this.search(/\S/), 0),this.search(/\S\s*$/) + 1); 3.} 以截取方式取得空白部分（当然允许中间存在空白符），总共调用了四个原生方法。设计得非常巧妙，substring以两个数字作为参数。Math.max以两个数字作参数，search则返回一个数字。速度比上面两个慢一点，但比下面大多数都快。 实现4 1.String.prototype.trim = function() { 2.  return  this.replace(/^\s+&#124;\s+$/g, ”); 3.} 这个可以称得上实现2的简化版，就是利用候选操作符连接两个正则。但这样做就失去了浏览器优化的机会，比不上实现3。由于看来很优雅，许多类库都使用它，如JQuery与mootools 实现5 1.String.prototype.trim = function() { 2.  var [...]]]></description>
			<content:encoded><![CDATA[<p>实现1<br />
1.String.prototype.<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/trim" title="查看 trim 中的全部文章" target="_blank">trim</a></span> = function() {<br />
2.  return this.replace(/^\s\s*/, ”).replace(/\s\s*$/, ”);<br />
3.}</p>
<p>看起来不怎么样，动用了两次正则替换，实际速度非常惊人，主要得益于浏览器的内部优化。一个著名的例子字符串拼接，直接相加比用Array做成的StringBuffer还快。base2类库使用这种实现。<br />
实现2<br />
1.String.prototype.<span class='wp_keywordlink_affiliate'><a href="http://www.52shidai.com/tag/trim" title="查看 trim 中的全部文章" target="_blank">trim</a></span> = function() {<br />
2.  return this.replace(/^\s+/, ”).replace(/\s+$/, ”);<br />
3.}</p>
<p>和实现1很相似，但稍慢一点，主要原因是它最先是假设至少存在一个空白符。Prototype.js使用这种实现，不过其名字为strip，因为Prototype的方法都是力求与Ruby同名。<br />
实现3<br />
1.String.prototype.trim = function() {<br />
2.  return  this.substring(Math.max(this.search(/\S/), 0),this.search(/\S\s*$/) + 1);<br />
3.}</p>
<p>以截取方式取得空白部分（当然允许中间存在空白符），总共调用了四个原生方法。设计得非常巧妙，substring以两个数字作为参数。Math.max以两个数字作参数，search则返回一个数字。速度比上面两个慢一点，但比下面大多数都快。<br />
实现4<br />
1.String.prototype.trim = function() {<br />
2.  return  this.replace(/^\s+|\s+$/g, ”);<br />
3.}</p>
<p>这个可以称得上实现2的简化版，就是利用候选操作符连接两个正则。但这样做就失去了浏览器优化的机会，比不上实现3。由于看来很优雅，许多类库都使用它，如JQuery与mootools<br />
实现5<br />
1.String.prototype.trim = function() {<br />
2.  var str = this;<br />
3.  str = str.match(/\S+(?:\s+\S+)*/);<br />
4.  return str ? str[0] : ”;<br />
5.}</p>
<p>match是返回一个数组，因此原字符串符合要求的部分就成为它的元素。为了防止字符串中间的空白符被排除，我们需要动用到非捕获性分组（?:exp）。由于数组可能为空，我们在后面还要做进一步的判定。好像浏览器在处理分组上比较无力，一个字慢。所以不要迷信正则，虽然它基本上是万能的。<br />
实现6<br />
1.String.prototype.trim = function() {<br />
2.  return this.replace(/^\s*(\S*(\s+\S+)*)\s*$/, &#8216;$1&#8242;);<br />
3.}</p>
<p>把符合要求的部分提供出来，放到一个空字符串中。不过效率很差，尤其是在IE6中。<br />
实现7<br />
1.String.prototype.trim = function() {<br />
2.  return this.replace(/^\s*(\S*(?:\s+\S+)*)\s*$/, &#8216;$1&#8242;);<br />
3.}</p>
<p>和实现6很相似，但用了非捕获分组进行了优点，性能效之有一点点提升。<br />
实现8<br />
1.String.prototype.trim = function() {<br />
2.  return this.replace(/^\s*((?:[\S\s]*\S)?)\s*$/, &#8216;$1&#8242;);<br />
3.}</p>
<p>沿着上面两个的思路进行改进，动用了非捕获分组与字符集合，用?顶替了*，效果非常惊人。尤其在IE6中，可以用疯狂来形容这次性能的提升，直接秒杀火狐。<br />
实现9<br />
1.String.prototype.trim = function() {<br />
2.  return this.replace(/^\s*([\S\s]*?)\s*$/, &#8216;$1&#8242;);<br />
3.}</p>
<p>这次是用懒惰匹配顶替非捕获分组，在火狐中得到改善，IE没有上次那么疯狂。<br />
实现10<br />
01.String.prototype.trim = function() {<br />
02.  var str = this,<br />
03.  whitespace = &#8216; \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000&#8242;;<br />
04.  for (var i = 0,len = str.length; i &lt; len; i++) {<br />
05.    if (whitespace.indexOf(str.charAt(i)) === -1) {<br />
06.      str = str.substring(i);<br />
07.      break;<br />
08.    }<br />
09.  }<br />
10.  for (i = str.length &#8211; 1; i &gt;= 0; i&#8211;) {<br />
11.    if (whitespace.indexOf(str.charAt(i)) === -1) {<br />
12.      str = str.substring(0, i + 1);<br />
13.      break;<br />
14.    }<br />
15.  }<br />
16.  return whitespace.indexOf(str.charAt(0)) === -1 ? str : ”;<br />
17.}</p>
<p>我只想说，搞出这个的人已经不是用牛来形容，已是神一样的级别。它先是把可能的空白符全部列出来，在第一次遍历中砍掉前面的空白，第二次砍掉后面的空白。全过程只用了indexOf与substring这个专门为处理字符串而生的原生方法，没有使用到正则。速度快得惊人，估计直逼上内部的二进制实现，并且在IE与火狐（其他浏览器当然也毫无疑问）都有良好的表现。速度都是零毫秒级别的。<br />
实现11<br />
01.String.prototype.trim = function() {<br />
02.  var str = this,<br />
03.  str = str.replace(/^\s+/, ”);<br />
04.  for (var i = str.length &#8211; 1; i &gt;= 0; i&#8211;) {<br />
05.    if (/\S/.test(str.charAt(i))) {<br />
06.      str = str.substring(0, i + 1);<br />
07.      break;<br />
08.    }<br />
09.  }<br />
10.  return str;<br />
11.}</p>
<p>实现10已经告诉我们普通的原生字符串截取方法是远胜于正则替换，虽然是复杂一点。但只要正则不过于复杂，我们就可以利用浏览器对正则的优化，改善程序执行效率，如实现8在IE的表现。我想通常不会有人在项目中应用实现10，因为那个whitespace 实现太长太难记了（当然如果你在打造一个类库，它绝对是首先）。实现11可谓其改进版，前面部分的空白由正则替换负责砍掉，后面用原生方法处理，效果不逊于原版，但速度都是非常逆天。<br />
实现12<br />
1.String.prototype.trim = function() {<br />
2.  var str = this,<br />
3.  str = str.replace(/^\s\s*/, ”),<br />
4.  ws = /\s/,<br />
5.  i = str.length;<br />
6.  while (ws.test(str.charAt(&#8211;i)));<br />
7.  return str.slice(0, i + 1);<br />
8.}</p>
<p>实现10与实现11在写法上更好的改进版，注意说的不是性能速度，而是易记与使用上。和它的两个前辈都是零毫秒级别的，以后就用这个来工作与吓人。</p>
<h2  class="related_post_title">您可能感兴趣的文章</h2><ul class="related_post"><li><a href="http://www.52shidai.com/web-front/801.html" title="Web 前端优化最佳实践之 JavaScript 篇">Web 前端优化最佳实践之 JavaScript 篇</a></li><li><a href="http://www.52shidai.com/javascript/759.html" title="31个Javascript的实用工具">31个Javascript的实用工具</a></li><li><a href="http://www.52shidai.com/javascript/661.html" title="javascript 正则表达式-替换">javascript 正则表达式-替换</a></li><li><a href="http://www.52shidai.com/javascript/614.html" title="高质量JavaScript代码书写基本要点|值得收藏">高质量JavaScript代码书写基本要点|值得收藏</a></li><li><a href="http://www.52shidai.com/javascript/585.html" title="js入门学习：Javascript的学习笔记">js入门学习：Javascript的学习笔记</a></li><li><a href="http://www.52shidai.com/javascript/583.html" title="学习JavaScript三件必须了解的事">学习JavaScript三件必须了解的事</a></li><li><a href="http://www.52shidai.com/javascript/556.html" title="JavaScript操作iframe里的dom">JavaScript操作iframe里的dom</a></li><li><a href="http://www.52shidai.com/javascript/323.html" title="javascript中的107个基础知识收集整理">javascript中的107个基础知识收集整理</a></li><li><a href="http://www.52shidai.com/javascript/62.html" title="JavaScript面向对象之静态与非静态类">JavaScript面向对象之静态与非静态类</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.52shidai.com/javascript/56.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

