<?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>檬檬前端行 &#187; 神奇</title>
	<atom:link href="http://www.frontendcodes.com/?feed=rss2&#038;tag=%E7%A5%9E%E5%A5%87" rel="self" type="application/rss+xml" />
	<link>http://www.frontendcodes.com</link>
	<description>路漫漫其修远兮</description>
	<lastBuildDate>Wed, 18 Mar 2015 10:05:27 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>你想不到的等式： []==![]</title>
		<link>http://www.frontendcodes.com/?p=146</link>
		<comments>http://www.frontendcodes.com/?p=146#comments</comments>
		<pubDate>Thu, 28 Apr 2011 02:00:59 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[前端]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[神奇]]></category>

		<guid isPermaLink="false">http://www.frontendcodes.com/?p=146</guid>
		<description><![CDATA[第一眼看到这个标题，[]==![] ，估计想到的都是false吧。 但是alert([]==![]) ,会神奇的发现，它居然是true。这到底是怎么回事呢？ 首先，分解一下这个表达式。 []==![]  由以下几步完成判断。 1、求值![] 2、参考ECMAScript文档（以下简称文档）11.4.9  Logical NOT Operator ( ! ) ，!运算符首先对[]进行toBoolean([])操作，文档9.2中得知，如果参数是Object，则返回true。于是  ![] 最后 得值 false 3、表达式变为[]==false 4、参考文档11.9.3 The Abstract Equality Comparison Algorithm，根据规则，第七条 If Type(y) is Boolean, return the result of the comparison x == ToNumber(y). 由于我们的右边的是个布尔值，所以对false进行toNumber(false)操作，文档9.3 ToNumber中，可知如果是false，那么toNumber返回0 5、表达式变为[]==0 6、继续看文档11.9.3，我们来到了第九条：9. If Type(x) is Object and Type(y) is either String or Number,return [...]]]></description>
			<content:encoded><![CDATA[<p>第一眼看到这个标题，[]==![] ，估计想到的都是false吧。</p>
<p>但是alert([]==![]) ,会神奇的发现，它居然是true。这到底是怎么回事呢？</p>
<p>首先，分解一下这个表达式。</p>
<p>[]==![]  由以下几步完成判断。</p>
<p>1、求值![]</p>
<p>2、参考ECMAScript文档（以下简称文档）11.4.9  Logical NOT Operator ( ! ) ，!运算符首先对[]进行toBoolean([])操作，文档9.2中得知，如果参数是Object，则返回true。于是  ![] 最后 得值 false</p>
<p>3、表达式变为[]==false</p>
<p>4、参考文档11.9.3 The Abstract Equality Comparison Algorithm，根据规则，第七条 If Type(y) is Boolean, return the result of the comparison x == ToNumber(y). 由于我们的右边的是个布尔值，所以对false进行toNumber(false)操作，文档9.3 ToNumber中，可知如果是false，那么toNumber返回0</p>
<p>5、表达式变为[]==0</p>
<p>6、继续看文档11.9.3，我们来到了第九条：9. If Type(x) is Object and Type(y) is either String or Number,return the result of the comparison ToPrimitive(x) == y. 由于[]是个Object，而右侧是Number 0，所以，对左侧的[]执行toPrimitive操作，根据文档9.1的toPrimitive章节，一个object的toPrimitive操作返回值是它的[[DefaultValue]],根据文档8.12.8的第一条，由于[]存在toString方法，所以返回[].toString().</p>
<p>7、表达式变为&#8221;"==0</p>
<p>8、又一次来到文档11.9.3第五条：5. If Type(x) is String and Type(y) is Number,return the result of the comparison ToNumber(x) == y，于是对&#8221;"进行toNumber操作，于是再一次来到文档9.3及9.3.1，得知，如果是空字符串，那么toNumber返回的是0</p>
<p>9、表达式变为0==0</p>
<p>10、返回true</p>
<p>神奇吧！~</p>
<p>参考文档：ECMAScript-262 Edition 5 ,地址 <a href="http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf">http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.frontendcodes.com/?feed=rss2&#038;p=146</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
