{"componentChunkName":"component---src-templates-blog-post-js","path":"/js-implicit-conversion/","result":{"data":{"markdownRemark":{"html":"<p>在判断是否为空数组时，一种是对数组的length属性进行判断即可，第二种进行下图的判断</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">arr <span class=\"token operator\">==</span> <span class=\"token boolean\">false</span></code></pre></div>\n<p>这就是js的隐式转换，但存在很多摸不清楚的状况，进行今天的学习，希望对js的隐式转换有所了解。</p>\n<h2>Js隐式转换规则</h2>\n<h2>ToBoolean</h2>\n<ul>\n<li>只有false、null、undefined、空字符、0和NaN，其它值转为布尔型都为true。</li>\n</ul>\n<h2>ToPrimitive</h2>\n<ul>\n<li>当对象类型需要被转为原始类型时，它会先查找对象的valueOf方法，valueOf方法会返回原始类型的值</li>\n<li>如果valueOf不存在或者返回的不是原始类型的值，就会尝试调用对象的toString方法，也就是会遵循对象的ToString规则，然后使用toString的返回值作为ToPrimitive的结果。</li>\n</ul>\n<p>比如经典的一道题：如何让if(a == 1 &#x26;&#x26; a == 2)条件成立？</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">var</span> a <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  value<span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n  <span class=\"token function-variable function\">valueOf</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>value<span class=\"token operator\">++</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>value\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>a <span class=\"token operator\">==</span> <span class=\"token number\">1</span> <span class=\"token operator\">&amp;&amp;</span> a <span class=\"token operator\">==</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token comment\">//true</span></code></pre></div>\n<h3>ToString</h3>\n<ul>\n<li>null：转为\"null\"</li>\n<li>undefined：转为\"undefined\"</li>\n<li>布尔类型：true和false分别被转为\"true\"和\"false\"</li>\n<li>数字类型：转为数字的字符串形式，如10转为\"10\"， 1e21转为\"1e+21\"</li>\n<li>数组：转为字符串是将所有元素按照\",\"连接起来，相当于调用数组的Array.prototype.join()方法，如[1, 2, 3]转为\"1,2,3\"，空数组[]转为空字符串，数组中的null或undefined，会被当做空字符串处理</li>\n<li>普通对象：转为字符串相当于直接使用Object.prototype.toString()，返回\"[object Object]\"</li>\n</ul>\n<h2>ToNumber</h2>\n<ul>\n<li>null： 转为0</li>\n<li>undefined：转为NaN</li>\n<li>字符串：如果是纯数字形式，则转为对应的数字，空字符转为0, 否则一律按转换失败处理，转为NaN</li>\n<li>布尔型：true和false被转为1和0</li>\n<li>数组/对象：数组首先会被转为原始类型，也就是ToPrimitive，然后根据原始类型按照上面的规则处理</li>\n</ul>\n<h2>布尔类型参与比较</h2>\n<ul>\n<li>布尔类型参与比较，该布尔类型的值首先会被转换为数字类型</li>\n<li>根据布尔类型的ToNumber规则，true转为1，false转为0</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">  <span class=\"token keyword\">let</span> a <span class=\"token operator\">=</span> <span class=\"token number\">2</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>a <span class=\"token operator\">==</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token punctuation\">}</span></code></pre></div>\n<p>a == true 布尔值true会转换为数字类型1，即2==1，所以不会执行if里面的语句</p>\n<h2>数字类型和字符串类型参与比较</h2>\n<ul>\n<li>当数字类型和字符串类型做相等比较时，字符串类型会被转换为数字类型</li>\n<li>根据字符串的ToNumber规则，如果是纯数字形式的字符串，则转为对应的数字，空字符转为0, 否则一律按转换失败处理，转为NaN</li>\n</ul>\n<h2>对象类型和原始类型参与比较</h2>\n<ul>\n<li>当对象类型和原始类型做相等比较时，对象类型会依照ToPrimitive规则转换为原始类型</li>\n</ul>\n<h2>null、undefined特殊的转换规则</h2>\n<p>null和undefined==的结果为true</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">null</span> <span class=\"token operator\">==</span> <span class=\"token boolean\">false</span> <span class=\"token comment\">// false</span>\n<span class=\"token keyword\">undefined</span> <span class=\"token operator\">==</span> <span class=\"token boolean\">false</span> <span class=\"token comment\">// false</span></code></pre></div>\n<p>ECMAScript规范中规定null和undefined之间互相宽松相等（==），并且也与其自身相等，但和其他所有的值都不宽松相等（==）。</p>\n<h2>==的转换规则</h2>\n<ul>\n<li>两边的类型是否相同，相同的话就比较值的大小，例如1==2，返回false</li>\n<li>判断的是否是null和undefined，是的话就返回true</li>\n<li>判断的类型是否是String和Number，是的话，把String类型转换成Number，再进行比较</li>\n<li>判断其中一方是否是Boolean，是的话就把Boolean转换成Number，再进行比较</li>\n<li>如果其中一方为Object，且另一方为String、Number或者Symbol，会将Object转换成字符串，再进行比较</li>\n</ul>","timeToRead":3,"frontmatter":{"title":"js隐式转换","date":"November 22, 2020","spoiler":null},"fields":{"slug":"/js-implicit-conversion/"}}},"pageContext":{"slug":"/js-implicit-conversion/","previous":{"fields":{"slug":"/learn-about-the-problem-of-this-point/"},"frontmatter":{"title":"一文搞懂this指向问题"}},"next":{"fields":{"slug":"/javascript-modularization-summary/"},"frontmatter":{"title":"JavaScript模块化总结"}}}},"staticQueryHashes":["3649515864","63159454"]}