﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-J2EE学习笔记-随笔分类-javascript</title><link>http://www.blogjava.net/migrant/category/40545.html</link><description>我们的失落……</description><language>zh-cn</language><lastBuildDate>Fri, 14 May 2010 09:10:13 GMT</lastBuildDate><pubDate>Fri, 14 May 2010 09:10:13 GMT</pubDate><ttl>60</ttl><item><title>[转]在JScript中运算符"||"和"&amp;&amp;"的特殊特性</title><link>http://www.blogjava.net/migrant/archive/2010/05/13/320802.html</link><dc:creator>J2EE学习笔记</dc:creator><author>J2EE学习笔记</author><pubDate>Thu, 13 May 2010 07:11:00 GMT</pubDate><guid>http://www.blogjava.net/migrant/archive/2010/05/13/320802.html</guid><wfw:comment>http://www.blogjava.net/migrant/comments/320802.html</wfw:comment><comments>http://www.blogjava.net/migrant/archive/2010/05/13/320802.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/migrant/comments/commentRss/320802.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/migrant/services/trackbacks/320802.html</trackback:ping><description><![CDATA[<p>在JScript的众多运算符里，提供了三个逻辑运算符<strong>&amp;&amp;</strong>、<strong>||</strong>和<strong>!</strong>，噢?! 是高级语言都提供的<img border="0" src="http://www.cnblogs.com/Emoticons/emembarrassed.gif" width="19" height="19"  alt="" />。按我们对逻辑运算的正常认识，逻辑运算的结果因该是ture或者false。但是JScript的逻辑运算却不完全是这么定义的，这里只有!运算符总是返回<font color="#0000ff">true</font>|<font color="#0000ff">false</font>，而||和&amp;&amp;运算比较的好玩。<br />
<br />
&nbsp;&nbsp;&nbsp; JScript对于逻辑运算的<font color="#0000ff">true</font>|<font color="#0000ff">false</font>是这么定义的： </p>
<ul type="disc">
    <li>所有对象都被认为是 true。
    <li>字符串当且仅当为空(""或'')时才被认为是 false。
    <li><strong>null</strong> 和未定义的均被认为是 false。
    <li>数字当且仅当为 0 时才是 false。 </li>
</ul>
<p>&nbsp;&nbsp;&nbsp; 可是逻辑运算符<strong>||</strong>和<strong>&amp;&amp;</strong>虽然遵循上面的定义规则，但是它们返回的值却很有意思。<br />
&nbsp;&nbsp;&nbsp; 对于&amp;&amp;运算，按照上面的规则，表达式 if ( 'abc' &amp;&amp; '123' &amp;&amp; new Date() ) 是执行true分支，可是这个表达式如果写成：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;value&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;'abc'&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;'</span><span style="color: #000000">123</span><span style="color: #000000">'&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Date();</span></div>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 结果value=Fri Jan 21 00:01:17 UTC+0800 2005，原它从左到右检测，如果到了最后一个表达式也是为true的，就返回那个表达式。</p>
<p>&nbsp;&nbsp;&nbsp; 对于||运算同理，对于下面的表达式：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;value1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;'abc'&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;'</span><span style="color: #000000">123</span><span style="color: #000000">'&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;value2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;''&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;'ok';</span></div>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 结果value1='abc'，value2='ok'。这是因为||运算会有"短路"特性，他也是从左向右检测，只不过它是一但发现有为true的值，就立即返回该表达式。<br />
&nbsp;&nbsp;&nbsp; 这样的特性可以帮组我们写出精简的代码，可是同时也带来代码不便于阅读维护的问题。<br />
&nbsp;&nbsp;&nbsp; 由于我手头暂时没有NS和moz什么的浏览器，不知道标准JavaScript是否也是这样支持的？如果您方便的话，请告如我运行后的结果</p>
<img src ="http://www.blogjava.net/migrant/aggbug/320802.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/migrant/" target="_blank">J2EE学习笔记</a> 2010-05-13 15:11 <a href="http://www.blogjava.net/migrant/archive/2010/05/13/320802.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]JavaScript判断变量类型：typeof函数与constructor属性异同</title><link>http://www.blogjava.net/migrant/archive/2010/04/14/318262.html</link><dc:creator>J2EE学习笔记</dc:creator><author>J2EE学习笔记</author><pubDate>Wed, 14 Apr 2010 06:30:00 GMT</pubDate><guid>http://www.blogjava.net/migrant/archive/2010/04/14/318262.html</guid><wfw:comment>http://www.blogjava.net/migrant/comments/318262.html</wfw:comment><comments>http://www.blogjava.net/migrant/archive/2010/04/14/318262.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/migrant/comments/commentRss/318262.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/migrant/services/trackbacks/318262.html</trackback:ping><description><![CDATA[<p><span style="font-family: 新宋体"><span style="font-size: 10pt">有时你可能需要对变量进行类型检查，或者判断变量是否已定义。有两种方法可以使用：<strong>typeof</strong>函数与<strong>constructor</strong>属性。</span></span></p>
<p><span style="font-family: 新宋体"><span style="font-size: 10pt">typeof函数的用法可能不用我多说，大家都知道怎么用。而constructor属性大家可能就陌生点。在《精通JavaScript》这本书中有提到construct的用法，但我用自己的几个浏览器（IE7.0 / Firefox1.9 / Opera9.50）测试的结果却和书上说的不一样。但是仍然是有办法通过constructor属性来检查变量类型的。<br />
这里先补充一下，为什么明明有typeof函数可以很方便地用来检测类型，还要用constructor呢？<br />
因为typeof会把所有的数组类型以及用户自定义类型判断为object，从而无法知道更确切的信息。而constructor却可以解决这个问题。</span></span></p>
<p><span style="font-family: 新宋体"><span style="font-size: 10pt">ok，明白了我们为什么要用constructor，现在让我带大家一步步认识一下typeof和constructor用法之间的差异吧～</span></span></p>
<p><span style="font-family: 新宋体"><span style="font-size: 10pt">首先我们运行一下下面这段代码：<br />
</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;i;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />alert(</span><span style="color: #0000ff">typeof</span><span style="color: #000000">(i));<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />alert(i.constructor);</span></div>
<p><br />
</span></span></p>
<p><span style="font-family: 新宋体"><span style="font-size: 10pt">这3行代码告诉你什么情况下可以用constructor。<br />
你可以看到第2行返回了字符串'undefined'，而第三行则发生了错误，原因是i变量还没有类型定义，自然也没有constructor的存在。 <br />
从这一点上看，typeof可以检查到变量是否有定义，而<strong>construct只能检查已定义变量的类型</strong>。</span></span></p>
<p><span style="font-family: 新宋体"><span style="font-size: 10pt">再运行一下下面这段代码：<br />
</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />alert(</span><span style="color: #0000ff">typeof</span><span style="color: #000000">(i));<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />alert(i.constructor);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />alert(</span><span style="color: #0000ff">typeof</span><span style="color: #000000">(i.constructor));</span></div>
<p><br />
</span></span></p>
<p><span style="font-family: 新宋体"><span style="font-size: 10pt">你会看到第2行返回了字符串'number&#8217;，第3行返回了一串类似函数定义的代码字符串（这就是跟《精通JavaScript》一书中介绍的不一样的地方）。<br />
我们再用typeof检查一下constructor到底是个什么样类型的属性，第4行返回结果'function'，也就是说，实际上constructor是一个函数，更确切地说是一个构造函数。这时你就可以知道，为什么constructor可以检查出各种类型了。</span></span></p>
<p><span style="font-family: 新宋体"><span style="font-size: 10pt">有经验的程序员看到这里应该知道要怎么利用constructor来检查变量类型了。方法有多种，这里提供一种比较容易理解的方法。</span></span></p>
<p><span style="font-family: 新宋体"><span style="font-size: 10pt">其实想法很简单，就是<strong>把construcor转化为字符串，通过寻找匹配字符串（function名）来确定是否指定类型</strong>。如下例子：<br />
</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img id="Codehighlighter1_16_17_Open_Image" onclick="this.style.display='none'; Codehighlighter1_16_17_Open_Text.style.display='none'; Codehighlighter1_16_17_Closed_Image.style.display='inline'; Codehighlighter1_16_17_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_16_17_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_16_17_Closed_Text.style.display='none'; Codehighlighter1_16_17_Open_Image.style.display='inline'; Codehighlighter1_16_17_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;user()&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_16_17_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_16_17_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000">;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;user();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />alert((i.constructor</span><span style="color: #000000">+</span><span style="color: #000000">'').match(</span><span style="color: #000000">/</span><span style="color: #000000">user</span><span style="color: #000000">/</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">);</span></div>
<p><br />
</span></span></p>
<p><span style="font-family: 新宋体"><span style="font-size: 10pt">这仅仅是个简单的例子。如果返回true则变量i不是user类型，返回false则变量是user类型。<br />
</span></span><span style="font-family: 新宋体"><span style="font-size: 10pt">当然，这样检测是不够精确的，比如其实他是一个myuser类型的时候，同样会被认为是user类。所以你需要书写更精确的正则表达式去进行匹配。</span></span></p>
<p><span style="font-family: 新宋体"><span style="font-size: 10pt">可以这样简单改进你的正则表达式：<br />
</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">/</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;user\(\)</span><span style="color: #000000">/</span></div>
<p><br />
</span></span></p>
<p><span style="font-family: 新宋体"><span style="font-size: 10pt">替换上面代码段中的/user/。当然，如果你的构造函数原型是user(a)，那么应该这样书写你的正则表达式：<br />
</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">/</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;user\(a\)</span><span style="color: #000000">/</span></div>
<p><br />
<br />
</span></span><span style="font-family: 新宋体"><span style="font-size: 10pt">到这里你应该知道怎样使用constructor类型去检查变量类型了吧？</span></span></p>
<p><span style="font-family: 新宋体"><span style="font-size: 10pt">ok，最后再提个醒，如果你要用基于constructor的方法去检查一些基本类型，如<br />
Object / Array / Function / String / Number / Boolean<br />
在你的正则表达式中，一定要将这些单词的<strong>首字母大写</strong>！！而如果该类型是自定义类型，则根据你定义的时候标识符的写法确定。</span></span></p><img src ="http://www.blogjava.net/migrant/aggbug/318262.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/migrant/" target="_blank">J2EE学习笔记</a> 2010-04-14 14:30 <a href="http://www.blogjava.net/migrant/archive/2010/04/14/318262.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>