<?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>omiga &#187; and</title>
	<atom:link href="http://omiga.org/blog/archives/tag/and/feed" rel="self" type="application/rss+xml" />
	<link>http://omiga.org/blog</link>
	<description>简单就好</description>
	<lastBuildDate>Thu, 26 Apr 2012 04:18:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>逻辑AND(&amp;&amp;)运算符</title>
		<link>http://omiga.org/blog/archives/960</link>
		<comments>http://omiga.org/blog/archives/960#comments</comments>
		<pubDate>Tue, 03 Mar 2009 07:49:02 +0000</pubDate>
		<dc:creator>omiga</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[and]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[布尔运算]]></category>

		<guid isPermaLink="false">http://omiga.org/blog/?p=960</guid>
		<description><![CDATA[先看下面这段代码，注释有运行结果。 var t = true; var f = false; var i = 1; var s = "hello"; var a = [1,10,100]; alert("t&#38;&#38;i: " + (t &#38;&#38; i)); //1 alert("f&#38;&#38;i: " + (f &#38;&#38; i)); //false alert("i&#38;&#38;t: " + (i &#38;&#38; t)); //true alert("i&#38;&#38;f: " + (i &#38;&#38; f)); //false alert("i&#38;&#38;s: " + (i &#38;&#38; s)); [...]]]></description>
			<content:encoded><![CDATA[<p>先看下面这段代码，注释有运行结果。</p>
<pre>var t = true;
var f = false;
var i = 1;
var s = "hello";
var a = [1,10,100];
alert("t&amp;&amp;i: " + (t &amp;&amp; i)); //1
alert("f&amp;&amp;i: " + (f &amp;&amp; i)); //false

alert("i&amp;&amp;t: " + (i &amp;&amp; t)); //true
alert("i&amp;&amp;f: " + (i &amp;&amp; f)); //false

alert("i&amp;&amp;s: " + (i &amp;&amp; s)); //"hello"
alert("i&amp;&amp;a: " + (i &amp;&amp; a)); //1,10,100

alert("s&amp;&amp;i: " + (s &amp;&amp; i)); //1
alert("a&amp;&amp;i: " + (a &amp;&amp; i)); //1</pre>
<p>再看来自w3school的一段文字：</p>
<blockquote><p>如果某个运算数不是原始的 Boolean 型值，逻辑 AND 运算并不一定返回 Boolean 值：</p>
<ul>
<li>如果一个运算数是对象，另一个是 Boolean 值，返回该对象。</li>
<li>如果两个运算数都是对象，返回第二个对象。</li>
<li>如果某个运算数是 null，返回 null。</li>
<li>如果某个运算数是 NaN，返回 NaN。</li>
<li>如果某个运算数是 undefined，发生错误。</li>
</ul>
</blockquote>
<p>第一条：<span style="text-decoration: line-through;">如果一个运算数是对象，另一个是 Boolean 值，返回该对象。</span>如果这种说法成立，那么先前测试中的以下代码都应输出i。</p>
<pre>alert("t&amp;&amp;i: " + (t &amp;&amp; i)); //1
alert("f&amp;&amp;i: " + (f &amp;&amp; i)); //false

alert("i&amp;&amp;t: " + (i &amp;&amp; t)); //true
alert("i&amp;&amp;f: " + (i &amp;&amp; f)); //false</pre>
<p>但实际并非如此。再看规则第二条：<span style="text-decoration: line-through;">如果两个运算数都是对象，返回第二个对象。</span>对先前的测试代码稍作修改，把0赋值给i：</p>
<pre>var t = true;
var f = false;
var i = 0;
var s = "hello";
var a = [1,10,100];
alert("t&amp;&amp;i: " + (t &amp;&amp; i)); //0
alert("f&amp;&amp;i: " + (f &amp;&amp; i)); //false

alert("i&amp;&amp;t: " + (i &amp;&amp; t)); //0
alert("i&amp;&amp;f: " + (i &amp;&amp; f)); //0

alert("i&amp;&amp;s: " + (i &amp;&amp; s)); //0
alert("i&amp;&amp;a: " + (i &amp;&amp; a)); //0

alert("s&amp;&amp;i: " + (s &amp;&amp; i)); //0
alert("a&amp;&amp;i: " + (a &amp;&amp; i)); //0</pre>
<p>i与另外一个不是boolean类型的运算数的AND运算都返回了i，并不是规则中所说的第二个对象。</p>
<p>再看如下代码，将字符串s赋值成空字符串，将数组a也赋值为空数组：</p>
<pre>var i = 0;
var s = "";
var a = [];

alert("i&amp;&amp;s: " + (i &amp;&amp; s)); //0
alert("i&amp;&amp;a: " + (i &amp;&amp; a)); //0

alert("s&amp;&amp;i: " + (s &amp;&amp; i)); //""
alert("a&amp;&amp;i: " + (a &amp;&amp; i)); //0</pre>
<p>于是，我的结论是：AND(&amp;&amp;) 运算不论运算数的类型是什么，如果运算结果为true，那么返回第二个运算数；如果运算结果为false，那么返回第一个布尔值等于(==)false的运算数。似乎这个结论是正确的，但是仔细看看最后一条测试语句的结果，并不遵循所得出的结论。</p>
<p>其实这里又涉及到另外一个typeof为object的值的布尔运算问题，如果object类型的值为空那么等于运算符(==)会视其为false，但是其他运算符则会视其为true。所以也才有了下面的现象：</p>
<pre>alert([]==false); //true
if([]) alert("ok"); //ok</pre>
<p>所以AND(&amp;&amp;)运算符测试中的最后一句a&amp;&amp;i其结果为false，但是a为true，所以有结果0。</p>
<p>如此看来，我们得出的结论也是完全正确的。<strong></strong></p>
<hr />
<p><small>© omiga for <a href="http://omiga.org/blog">omiga</a>, 2009. |
<a href="http://omiga.org/blog/archives/960">Permalink</a> |
<a href="http://omiga.org/blog/archives/960#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://omiga.org/blog/archives/960&title=逻辑AND(&#038;&#038;)运算符">del.icio.us</a>
<br/>
Post tags: <a href="http://omiga.org/blog/archives/tag/and" rel="tag">and</a>, <a href="http://omiga.org/blog/archives/tag/array" rel="tag">array</a>, <a href="http://omiga.org/blog/archives/tag/javascript" rel="tag">javascript</a>, <a href="http://omiga.org/blog/archives/tag/%e5%b8%83%e5%b0%94%e8%bf%90%e7%ae%97" rel="tag">布尔运算</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://omiga.org/blog/archives/960/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

