<?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>welefen &#187; javascript</title>
	<atom:link href="http://www.welefen.com/tag/javascript/feed" rel="self" type="application/rss+xml" />
	<link>http://www.welefen.com</link>
	<description>风为人世在，在世人为风。</description>
	<lastBuildDate>Thu, 09 Sep 2010 11:29:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>javascript中toInt的几种方法</title>
		<link>http://www.welefen.com/javascript-toint-method.html</link>
		<comments>http://www.welefen.com/javascript-toint-method.html#comments</comments>
		<pubDate>Wed, 16 Dec 2009 08:20:26 +0000</pubDate>
		<dc:creator>welefen</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[tonumber]]></category>

		<guid isPermaLink="false">http://www.welefen.com/?p=166</guid>
		<description><![CDATA[在javascript中，如果要将一个字符串转变成数字，一般是通过parseInt这个函数进行。但如果对输入串有很高确定性的话，其实可以用更简单的方法。如：只是将字符串“123”变成数字123。下面给出具体的说明。 parseInt函数 parseInt函数是专门用来处理将字符串变成整型的。具体请见：ECMA-262 P114。 支持八进制和十六进制，如：&#8217;0111&#8242;，&#8217;0&#215;111&#8242;。 支持非正数。如：&#8217;-111&#8242;。 支持数字后还有字符串，如：&#8217;111abc&#8217;。 支持第二个参数，是传递的转换进制，数值为2到36。如：parseInt(&#8217;111&#8242;,2)，即将111转换为二进制。 忽略前面的空白字符，如：\n，\t，\r。 如果无法将字符串转换为一个数值，则返回NaN。 一元操作符“+” 在javascript中，“+”号即可以作为二元操作符，又可以作为一元操作符。作为一元操作符的时候，就是将对象变成数值形式的。具体见：ECMA-262 P82。 其实执行+的时候，调用JS引擎的ToNumber函数。 true/false转成1/0。 null转成0。 支持非正数。 忽略前面的空白字符。 支持16进制，八进制会当十进制处理。 &#8220;111&#8243;转换成111，其他情况基本都是 NaN。 Number构造器 当number构造器当函数使用时，是将其他对象转化成数值。转换原理跟一元操作符&#8221;+&#8221;完全一样，因为都是调用JS引擎ToNumber函数。所以这个方式基本不用，因为使用它比使用“+”要多7个字符。 二进制操作符“&#124;” 使用二进制操作符“&#124;”结合0可以将对象转换成整形的。如&#8217;111&#8242;&#124;0。 true/false转换成1/0。 忽略前面的特殊字符。 支持16进制，八进制会当十进制处理。 null转成0。 支持非正数。 不能转换成整型的，则返回为0。如：&#8217;111abc&#8217;结果为0。 二进制操作符“&#62;&#62;” 使用二进制操作符“&#62;&#62;”结合0可以将对象转换成整形的。如&#8217;111&#8242;&#62;&#62;0。 true/false转换成1/0。 忽略前面的特殊字符。 支持16进制，八进制会当十进制处理。 null转成0。 支持非正数。 不能转换成整型的，则返回为0。如：&#8217;111abc&#8217;结果为0。 二进制操作符“&#62;&#62;&#62;” 使用二进制操作符“&#62;&#62;&#62;”结合0可以将对象转换成整形的。如&#8217;111&#8242;&#62;&#62;&#62;0。 true/false转换成1/0。 忽略前面的特殊字符。 支持16进制，八进制会当十进制处理。 null转成0。 非正数的时候则转换为2^32-概数的绝对值。如：&#8217;-111&#8242;&#62;&#62;&#62;0为4294967185。 不能转换成整型的，则返回为0。如：&#8217;111abc&#8217;结果为0。 测试结果 对于转换的对象数字加字符或者其他类型的，只能用parseInt转换。 对于一般的转化，如将“123”转化成123时，有如下的测试结果： parseInt + &#124; &#62;&#62; &#62;&#62;&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>在javascript中，如果要将一个字符串转变成数字，一般是通过parseInt这个函数进行。但如果对输入串有很高确定性的话，其实可以用更简单的方法。如：只是将字符串“123”变成数字123。下面给出具体的说明。</p>
<h2>parseInt函数</h2>
<p>parseInt函数是专门用来处理将字符串变成整型的。具体请见：ECMA-262 P114。</p>
<ol>
<li>支持八进制和十六进制，如：&#8217;0111&#8242;，&#8217;0&#215;111&#8242;。</li>
<li>支持非正数。如：&#8217;-111&#8242;。</li>
<li>支持数字后还有字符串，如：&#8217;111abc&#8217;。</li>
<li>支持第二个参数，是传递的转换进制，数值为2到36。如：parseInt(&#8217;111&#8242;,2)，即将111转换为二进制。</li>
<li>忽略前面的空白字符，如：\n，\t，\r。</li>
<li>如果无法将字符串转换为一个数值，则返回NaN。</li>
</ol>
<p><span id="more-166"></span></p>
<h2>一元操作符“+”</h2>
<p>在javascript中，“+”号即可以作为二元操作符，又可以作为一元操作符。作为一元操作符的时候，就是将对象变成数值形式的。具体见：ECMA-262 P82。</p>
<p>其实执行+的时候，调用JS引擎的ToNumber函数。</p>
<ol>
<li>true/false转成1/0。</li>
<li>null转成0。</li>
<li>支持非正数。</li>
<li>忽略前面的空白字符。</li>
<li>支持16进制，八进制会当十进制处理。</li>
<li>&#8220;111&#8243;转换成111，其他情况基本都是 NaN。</li>
</ol>
<h2>Number构造器</h2>
<p>当number构造器当函数使用时，是将其他对象转化成数值。转换原理跟一元操作符&#8221;+&#8221;完全一样，因为都是调用JS引擎ToNumber函数。所以这个方式基本不用，因为使用它比使用“+”要多7个字符。</p>
<h2>二进制操作符“|”</h2>
<p>使用二进制操作符“|”结合0可以将对象转换成整形的。如&#8217;111&#8242;|0。</p>
<ol>
<li>true/false转换成1/0。</li>
<li>忽略前面的特殊字符。</li>
<li>支持16进制，八进制会当十进制处理。</li>
<li>null转成0。</li>
<li>支持非正数。</li>
<li>不能转换成整型的，则返回为0。如：&#8217;111abc&#8217;结果为0。</li>
</ol>
<h2>二进制操作符“&gt;&gt;”</h2>
<p>使用二进制操作符“&gt;&gt;”结合0可以将对象转换成整形的。如&#8217;111&#8242;&gt;&gt;0。</p>
<ol>
<li>true/false转换成1/0。</li>
<li>忽略前面的特殊字符。</li>
<li>支持16进制，八进制会当十进制处理。</li>
<li>null转成0。</li>
<li>支持非正数。</li>
<li>不能转换成整型的，则返回为0。如：&#8217;111abc&#8217;结果为0。</li>
</ol>
<h2>二进制操作符“&gt;&gt;&gt;”</h2>
<p>使用二进制操作符“&gt;&gt;&gt;”结合0可以将对象转换成整形的。如&#8217;111&#8242;&gt;&gt;&gt;0。</p>
<ol>
<li>true/false转换成1/0。</li>
<li>忽略前面的特殊字符。</li>
<li>支持16进制，八进制会当十进制处理。</li>
<li>null转成0。</li>
<li>非正数的时候则转换为2^32-概数的绝对值。如：&#8217;-111&#8242;&gt;&gt;&gt;0为<span>4294967185</span>。</li>
<li>不能转换成整型的，则返回为0。如：&#8217;111abc&#8217;结果为0。</li>
</ol>
<h2>测试结果</h2>
<p>对于转换的对象数字加字符或者其他类型的，只能用parseInt转换。</p>
<p>对于一般的转化，如将“123”转化成123时，有如下的测试结果：</p>
<table border="1" width="100%">
<tbody>
<tr>
<td></td>
<td>parseInt</td>
<td>+</td>
<td>|</td>
<td>&gt;&gt;</td>
<td>&gt;&gt;&gt;</td>
</tr>
<tr>
<td>IE8(执行10^5次)</td>
<td>96ms</td>
<td>65ms</td>
<td>61ms</td>
<td>59ms</td>
<td>58ms</td>
</tr>
<tr>
<td>FF3.5(执行10^7次)</td>
<td>49ms</td>
<td>48ms</td>
<td>52ms</td>
<td>48ms</td>
<td>53ms</td>
</tr>
<tr>
<td>Safari4(执行10^5次)</td>
<td>38ms</td>
<td>15ms</td>
<td>15ms</td>
<td>15ms</td>
<td>16ms</td>
</tr>
<tr>
<td>Chrome(执行10^5次)</td>
<td>25ms</td>
<td>33ms</td>
<td>37ms</td>
<td>38ms</td>
<td>37ms</td>
</tr>
<tr>
<td>Opera10(执行10^5次)</td>
<td>113ms</td>
<td>61ms</td>
<td>63ms</td>
<td>63ms</td>
<td>66ms</td>
</tr>
</tbody>
</table>
<p>从上面可以看出，除了FF和Chrome下parseInt和其他的没什么差别，其他的使用parseInt函数都要比操作符慢。</p>
<p>所以有时候可以使用“|”操作符来完成字符到数值的转换工作，并且转换默认是0，而不是NaN。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.welefen.com/javascript-toint-method.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>javascript中关于try,finally控制语句的使用</title>
		<link>http://www.welefen.com/javascript-try-finally.html</link>
		<comments>http://www.welefen.com/javascript-try-finally.html#comments</comments>
		<pubDate>Mon, 26 Oct 2009 15:17:40 +0000</pubDate>
		<dc:creator>welefen</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[finally]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[try]]></category>

		<guid isPermaLink="false">http://www.welefen.com/?p=47</guid>
		<description><![CDATA[几乎每个脚本语言都有try,catch,finally控制语句。try,catch控制语句主要是对有异常的程序控制，这里不在详细描述。主要讲述下try,finally的妙用。 在正文之前，给出2个已有的两个应用（2篇文章都是在51JS中），如下： 1、try finally 妙用,防止内存泄漏。 2、月影发的“某人发给我的邪恶代码”，可以看#16楼 lifesinger的回复。 问题的表面 也许你对上面2个应用还没有真正的明白，也可能你看到这样的代码心里忍不住和我一样惊叹一声“绝”。那么为什么能够写出这样的代码，这样的代码又是怎样工作的呢？一切从ECMA-262开始说起。 揭开面纱 如果你还不知道什么是ECMA-262或者还没有阅读过这个标准，那么我建议你还是尽快花点时间好好看看，有兴趣更要研究。你可以从它的官方网站下载，如果不想看PDF版本的话可以打印出来的。我以前看的时候就是打印出来慢慢研究的。 在ECMA262的12.14 (P70)The try statement有： The production TryStatement : try Block Finally is evaluated as follows: 1. Evaluate Block. 2. Evaluate Finally. 3. If Result(2) .type is normal, return Result(1). 4. Return Result(2). 上述中第一步和第二部分别是计算Block和Finally的值。第三步是进行第二步结果类型的判断，如果类型是normal的话，返回第一步的结果否则返回第二步的结果。 这里有两点比较特殊，一个是返回结果在进行计算Finally块后才进行的，二是第二步的结果类型是normal的时候，返回第一步的结果，否则返回第一步的结果。 对于第一点，前面的防止内存泄露就是一个很好的应用。充分使用了这一特性。 那第二步的结果类型什么时候是normal呢。这里的类型是实现JS引擎层面上的类型，用JS是获取不到的。 JS引擎层面的类型在ECMA262中的8.9进行了定义： 8.9 The Completion Type The internal Completion [...]]]></description>
			<content:encoded><![CDATA[<p>几乎每个脚本语言都有try,catch,finally控制语句。try,catch控制语句主要是对有异常的程序控制，这里不在详细描述。主要讲述下try,finally的妙用。</p>
<p>在正文之前，给出2个已有的两个应用（2篇文章都是在51JS中），如下：</p>
<p>1、<a href="http://bbs.51js.com/viewthread.php?tid=76615" target="_blank"><span>try finally 妙用,防止内存泄漏</span></a>。</p>
<p>2、月影发的“<a href="http://bbs.51js.com/viewthread.php?tid=85823" target="_blank"><span>某人发给我的邪恶代码</span></a>”，可以看#16楼 <a href="http://lifesinger.org/blog/" target="_blank">lifesinger</a>的回复。</p>
<p><span id="more-47"></span></p>
<h2>问题的表面</h2>
<p>也许你对上面2个应用还没有真正的明白，也可能你看到这样的代码心里忍不住和我一样惊叹一声“绝”。那么为什么能够写出这样的代码，这样的代码又是怎样工作的呢？一切从ECMA-262开始说起。</p>
<h2>揭开面纱</h2>
<p>如果你还不知道什么是ECMA-262或者还没有阅读过这个标准，那么我建议你还是尽快花点时间好好看看，有兴趣更要研究。你可以从<a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm" target="_blank">它的官方网站下载</a>，如果不想看PDF版本的话可以打印出来的。我以前看的时候就是打印出来慢慢研究的。</p>
<p>在ECMA262的12.14 (P70)The try statement有：</p>
<blockquote><p>The production TryStatement : try Block Finally is evaluated as follows:<br />
1. Evaluate Block.<br />
2. Evaluate Finally.<br />
3. If Result(2) .type is normal, return Result(1).<br />
4. Return Result(2).</p></blockquote>
<p>上述中第一步和第二部分别是计算Block和Finally的值。第三步是进行第二步结果类型的判断，如果类型是normal的话，返回第一步的结果否则返回第二步的结果。</p>
<p><strong>这里有两点比较特殊，一个是返回结果在进行计算Finally块后才进行的，二是第二步的结果类型是normal的时候，返回第一步的结果，否则返回第一步的结果。</strong></p>
<p>对于第一点，前面的防止内存泄露就是一个很好的应用。充分使用了这一特性。</p>
<p>那第二步的结果类型什么时候是normal呢。这里的类型是实现JS引擎层面上的类型，用JS是获取不到的。</p>
<p>JS引擎层面的类型在ECMA262中的8.9进行了定义：</p>
<blockquote><p>8.9 The Completion Type<br />
The internal Completion type is not a language data type. It is defined by this specification purely for<br />
expository purposes. An implementation of ECMAScript must behave as if it produced and operated upon<br />
Completion values in the manner described here. However, a value of the Completion type is used only as<br />
an intermediate result of statement evaluation and cannot be stored as the value of a variable or property.<br />
The Completion type is used to explain the behaviour of statements (<strong>break, continue, return and throw</strong>) that perform nonlocal transfers of control. Values of the Completion type are triples of the form<br />
(type, value, target), where type is one of normal, break, continue, return, or throw, value is any<br />
ECMAScript value or empty, and target is any ECMAScript identifier or empty.<br />
The term “abrupt completion” refers to any completion with a type other than normal.</p></blockquote>
<p>也就是说，在JS引擎中，有break, continue, return, throw和normal五种完成类型。那么我们就可以知道当finally语句块含有break, continue, return, throw语句被执行时，返回值是第二步的结果，否则为第一步的结果。</p>
<p>上面提到的第二个应用就是基于这一特性的，虽然应用中提到的知识简单的返回结果。但在实际项目中，可以根据这一特性得到不同的返回值。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.welefen.com/javascript-try-finally.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->