<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://gaodaxiu-blog.netlify.app/</id>
  <title type="text">个人技术博客</title>
  <subtitle type="text">高大秀</subtitle>
  <updated>2026-09-25T00:00:00.000Z</updated>
  <author><name>GaoDaXiu</name></author>
  <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/"/>
  <link rel="self" href="https://gaodaxiu-blog.netlify.app/atom.xml"/>
  <generator uri="https://github.com/CuteLeaf/Firefly">Firefly v6.16.8</generator>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/Astro%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA%E9%83%A8%E7%BD%B2/</id>
      <title type="text">使用Astro搭建个人博客1</title>
      <published>2026-09-25T00:00:00.000Z</published>
      <updated>2026-09-25T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/Astro%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA%E9%83%A8%E7%BD%B2/"/>
      <summary type="text">使用Astro搭建个人博客及部署，使用Firefly主题，使用Vercel部署</summary>
      <content type="html"><![CDATA[<section><h1>Astro博客搭建部署<a href="#astro博客搭建部署"><span>#</span></a></h1><p>因为我是mac本，所以该文主要以mac系统进行说明</p><p>之前的博客一直基于 <code>Hexo</code> 搭建 <a href="https://gaodaxiu0406.github.io" target="_blank">https://gaodaxiu0406.github.io</a><strong>已停止更新</strong>, 部署在免费的 <code>github</code> 上。HEXO博客的源码因为各种原因丢失了，于是准备重新搭建自己的技术博客。</p><p>搭建前了解了不少免费个人技术博客搭建，主要被 <code>Astro</code> 的「群岛架构」理念吸引，于是开启了新技术博客的搭建之旅。</p><blockquote><p>「群岛架构」是前端框架 Astro 实现高性能网站加载的核心架构设计。</p></blockquote><ul>
<li>「群岛架构」采用组件化的孤岛思路，默认不加载任何不必要的客户端 <code>JavaScript</code>，每个UI组件就像海洋中独立的岛屿。只有当用户交互触发时，才按需加载对应组件的 <code>JavaScript</code> 代码。</li>
<li>「群岛架构」是 <code>Astro</code> 超越传统静态站点生成器（如 <code>Hexo</code> ）的关键创新，它是 <code>Astro</code> 构建的博客能在性能测试中拿到接近满分的核心原因，同时还给开发带来了灵活扩展和流畅热更新的优势。</li>
</ul><section><h2>1.环境准备<a href="#1环境准备"><span>#</span></a></h2><section><h3>1.1 安装git<a href="#11-安装git"><span>#</span></a></h3><p>访问 <a href="https://git-scm.com/install/" target="_blank">Git 官网</a> 下载并安装适合你操作系统的 Git 版本。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// 1.若之前安装过需要更新的话</span></div></div><div><div><div>2</div></div><div><span>// mac若已安装 Homebrew，直接执行升级命令</span></div></div><div><div><div>3</div></div><div><span><span>brew</span><span> </span><span>update</span><span> </span></span><span>&amp;&amp;</span><span><span> </span><span>brew</span><span> </span><span>upgrade</span><span> </span><span>git</span></span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>// 2.若未安装 Homebrew 或需强制覆盖系统自带 Git：</span></div></div><div><div><div>6</div></div><div><span>// 1）安装 Homebrew (如未安装)</span></div></div><div><div><div>7</div></div><div><span>/</span><span>bin</span><span>/</span><span><span>bash</span><span> </span></span><span>-</span><span><span>c</span><span> </span></span><span>"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>// 2）安装/更新 Git</span></div></div><div><div><div>10</div></div><div><span><span>brew</span><span> </span><span>install</span><span> </span><span>git</span></span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>// 3）强制链接以覆盖系统默认路径 (关键步骤)</span></div></div><div><div><div>13</div></div><div><span><span>brew</span><span> </span><span>link</span><span> </span><span>git</span><span> </span></span><span>--</span><span>overwrite</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>// 4）重载环境变量 (根据 Shell 类型选择，Zsh 为默认)</span></div></div><div><div><div>16</div></div><div><span><span>source</span><span> </span></span><span>~/</span><span>.</span><span>zshrc</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>// 5）验证版本和路径</span></div></div><div><div><div>19</div></div><div><span><span>git</span><span> </span></span><span>--</span><span><span>version</span><span> </span></span><span>// 验证版本</span></div></div><div><div><div>20</div></div><div><span><span>which</span><span> </span><span>git</span><span> </span></span><span>// 验证路径</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>安装完成后，打开终端或命令提示符，运行以下命令验证 Git 是否安装成功：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>git</span><span> </span></span><span>--</span><span>version</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果显示版本号，则表示安装成功。</p></section><section><h3>1.2 安装Node.js<a href="#12-安装nodejs"><span>#</span></a></h3><p>访问 <a href="https://nodejs.org/zh-cn" target="_blank">Node 官网</a> 下载并安装最新版本的 Node.js。建议使用 LTS 版本。</p><section><h4>1.2.1 mac怎么用Node官网包安装<a href="#121-mac怎么用node官网包安装"><span>#</span></a></h4><p>1.‌下载安装包‌：<a href="https://nodejs.org/zh-cn" target="_blank">Node 官网</a>下载 <code>.pkg</code>安装文件。
2.‌运行安装‌：双击安装包按提示完成安装，会覆盖旧版本。
3.‌检查路径‌：确保终端使用的是新安装路径下的 Node，必要时重启终端。‌‌‌</p></section><section><h4>1.2.2 如何安装多个版本Node<a href="#122-如何安装多个版本node"><span>#</span></a></h4><p>可能你在不同的项目中用到了不同的node版本，此时你需要在不同项目中切换使用不同的node版本，需要用到<code>nvm</code>。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// 1.‌执行安装脚本‌</span></div></div><div><div><div>2</div></div><div><span><span>curl</span><span> </span></span><span>-</span><span>o</span><span>-</span><span><span> </span><span>https</span><span>:</span></span><span>//raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>// 2.加载环境变量‌</span></div></div><div><div><div>5</div></div><div><span>// 安装完成后，在当前终端执行以下命令使 nvm 立即生效：</span></div></div><div><div><div>6</div></div><div><span>export</span><span> </span><span>NVM_DIR</span><span>=</span><span>"$HOME/.nvm"</span></div></div><div><div><div>7</div></div><div><span>[ </span><span>-</span><span><span>s</span><span> </span></span><span>"$NVM_DIR/nvm.sh"</span><span> ] </span><span>&amp;&amp;</span><span> \. </span><span>"$NVM_DIR/nvm.sh"</span></div></div><div><div><div>8</div></div><div><span>[ </span><span>-</span><span><span>s</span><span> </span></span><span>"$NVM_DIR/bash_completion"</span><span> ] </span><span>&amp;&amp;</span><span> \. </span><span>"$NVM_DIR/bash_completion"</span></div></div><div><div><div>9</div></div><div><span>// 注：官方脚本通常会自动将上述配置写入 ~/.zshrc，若重启终端后 nvm 命令失效，请检查 ~/.zshrc 末尾是否包含上述代码。</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>// 3.配置国内镜像（可选，加速 Node 安装）‌</span></div></div><div><div><div>12</div></div><div><span>// 在 ~/.zshrc 中添加以下环境变量，解决 nvm install 下载慢的问题：</span></div></div><div><div><div>13</div></div><div><span>export</span><span> </span><span>NVM_NODEJS_ORG_MIRROR</span><span>=</span><span><span>https</span><span>:</span></span><span>//npmmirror.com/mirrors/node/</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>// 4.添加后执行 source ~/.zshrc 生效。</span></div></div><div><div><div>16</div></div><div><span><span>source</span><span> </span></span><span>~/</span><span>.</span><span>zshrc</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>// 5.验证安装‌(运行后输出版本号即为安装成功)</span></div></div><div><div><div>19</div></div><div><span><span>nvm</span><span> </span></span><span>--</span><span><span>version</span><span> </span></span><span>// 简写 nvm -v</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>// 其他常规操作：</span></div></div><div><div><div>22</div></div><div><span>// 安装最新 LTS 版本</span></div></div><div><div><div>23</div></div><div><span><span>nvm</span><span> </span><span>install</span><span> </span></span><span>--</span><span>lts</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>// 切换版本</span></div></div><div><div><div>26</div></div><div><span><span>nvm</span><span> </span><span>use</span><span> </span></span><span>&lt;</span><span>版本号</span><span>&gt;</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>// 设置默认版本</span></div></div><div><div><div>29</div></div><div><span><span>nvm</span><span> </span><span>alias</span><span> </span></span><span>default</span><span> &lt;</span><span>版本号</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h4>1.2.3 如何升级 <code>Node</code><a href="#123-如何升级-node"><span>#</span></a></h4><p>当然，可能你只有一个项目或者不需要多个node版本，所以下面说一下mac通过 <code>Homebrew</code>升级 <code>Node</code></p><p>1.更新源‌：终端输入 <code>brew update</code> 更新包管理列表 。
2.‌升级 <code>Node</code>‌：执行 <code>brew upgrade node</code> 升级到 <code>Homebrew</code> 源中的最新版本 。</p><p>安装完成后，打开终端或命令提示符，运行<code>node -v</code>验证 <code>Node.js</code> 是否安装成功。如果显示版本号，则表示安装成功。
<code>Node</code>自带<code>npm</code>，运行<code>npm -v</code>验证<code>npm</code>是否安装成功。如果显示版本号，则表示安装成功。</p></section></section><section><h3>1.3 安装pnpm<a href="#13-安装pnpm"><span>#</span></a></h3><blockquote><p>pnpm 是比 npm、yarn 更节省空间、安装更快的包管理工具，能有效提升依赖管理效率，减少依赖冗余、幽灵依赖等常见问题。</p></blockquote><p>通过 npm 安装 pnpm：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>npm</span><span> </span><span>install</span><span> </span></span><span>-</span><span><span>g</span><span> </span><span>pnpm</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><code>-g</code>：<code>--global</code> 的缩写，代表全局安装，包会被安装到系统全局路径，这样终端任意目录可直接使用包命令。</p></section></section><section><h2>2 Astro<a href="#2-astro"><span>#</span></a></h2><section><h3>2.1 安装最新版本Astro<a href="#21-安装最新版本astro"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>pnpm</span><span> </span><span>create</span><span> </span><span>astro</span><span>@</span><span>latest</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>执行命令后，首先会检测本地是否安装 <code>create-astro</code>（<code>Astro</code> 官方脚手架），输入 <code>y</code> 并回车，确认安装 <code>/</code> 更新该工具。</p></section><section><h3>2.2 初始化Astro项目<a href="#22-初始化astro项目"><span>#</span></a></h3><ul>
<li>工具安装完成后，会自动调用启动 <code>Astro</code> 项目创建向导。</li>
<li>指定项目目录（<code>dir</code>）：输入自定义项目名（比如<code>my-blog</code>）后回车确认。（默认是在当前命令行所在路径下创建项目文件夹，也可以指定具体路径）</li>
<li>选择模板（<code>tmpl</code>）：通过上下方向键选中 <code>blog template</code>（博客模板），回车确认。</li>
<li>安装依赖（<code>deps</code>）：确认自动安装项目依赖。</li>
<li>初始化 <code>Git</code>（<code>git</code>）：确认自动创建 <code>Git</code> 仓库，完成版本控制初始化。</li>
</ul><p></p><figure><img alt="图片1" loading="lazy" width="1038" height="924" src="/_astro/blog-1.DKOBAdlP_Znxcu0.webp" /><figcaption>图片1</figcaption></figure><p></p></section><section><h3>2.3 启动Astro开发服务器测试<a href="#23-启动astro开发服务器测试"><span>#</span></a></h3><p>这样基础的博客模板就生成好了，命令行进入到博客目录下，输入<code>pnpm run dev</code>命令启动 <code>Astro</code> 开发服务器:</p><p></p><figure><img alt="图片2" loading="lazy" width="1244" height="840" src="/_astro/blog-2.B8jRAFLb_10CJSv.webp" /><figcaption>图片2</figcaption></figure><p></p><p>根据运行提示，在浏览器输入 <code>http://localhost:4321/</code> 访问博客</p><p></p><figure><img alt="图片3" loading="lazy" width="2274" height="1836" src="/_astro/blog-3.DUd8vaNA_Zy0tRO.webp" /><figcaption>图片3</figcaption></figure><p></p><p>测试完成后，回到命令行<code>Ctrl+C</code>关闭服务器。</p></section><section><h3>2.4 Astro项目结构<a href="#24-astro项目结构"><span>#</span></a></h3><p>打开前面创建的Astro博客根目录，我们通过这个例子来了解下Astro项目的文件结构。</p><ul>
<li>
<p>src/：放所有需要处理的源码。Astro 通过构建、压缩、处理这里的文件（页面、组件、样式等）创建最终传递到浏览器的网站。</p>
</li>
<li>
<p>public/：放完全静态的资源。如某些图片和字体，或特殊文件（如 robots.txt 和 manifest.webmanifest）等等。</p>
<ul>
<li>所谓完全静态指的是该资源的最终形态在网站构建前就已经确定，Astro在构建网站时，不会去转换、编译、打包或优化这些文件和资源。</li>
<li>这个文件夹中的文件将会被原封不动地复制到构建文件夹中，也就是直接复制到Astro最终生成的网站目录中。</li>
</ul>
</li>
<li>
<p>src/pages/：放页面文件，决定网站页面路径。</p>
</li>
<li>
<p>Astro 使用基于文件的路由，它根据项目 src/pages 目录中的文件结构来生成你的构建链接。<a href="https://docs.astro.build/zh-cn/guides/routing/" target="_blank">Astro路由 | Docs</a></p>
</li>
</ul><p>更多相关内容参考官方文档：<a href="https://docs.astro.build/zh-cn/basics/project-structure/" target="_blank">Astro项目结构 | Docs</a></p></section></section><section><h2>3 配置Astro博客主题<a href="#3-配置astro博客主题"><span>#</span></a></h2><p>这里直接使用的可Fork的主题库，可以新建个空文件夹。</p><section><h3>3.1 Astro博客主题模板推荐<a href="#31-astro博客主题模板推荐"><span>#</span></a></h3><ul>
<li><code>AstroPaper</code>：非常简约、干净，页面结构简单，适合喜欢极简风格的博主。<code>Lighthouse Score</code>全满分，不足之处就是暂时没有侧边目录，长文章阅读起来体验不好。<a href="https://github.com/satnaing/astro-paper" target="_blank">官方仓库链接</a></li>
<li><code>Firefly</code>：基于 <code>Fuwari</code> 模板开发，做了创新升级，如双侧边栏、文章网格（多列）、瀑布流布局等，中文友好，文档丰富详细。<a href="https://github.com/CuteLeaf/Firefly" target="_blank">官方仓库链接</a></li>
<li><code>Astro Cactus</code>：和Paper一样也是简约风，Lighthouse Score全满分。<a href="https://github.com/chrismwilliams/astro-theme-cactus" target="_blank">官方仓库链接</a></li>
<li><code>Astro Theme Pure</code>：设计独特，一打开就有让人眼前一亮的感觉，在网站内容组织方面也比较新颖，<code>Lighthouse Score</code>全满分。<a href="https://github.com/cworld1/astro-theme-pure" target="_blank">官方仓库链接</a></li>
<li><code>Fuwari</code>：优雅美观，中规中矩，页面结构和大多数博客主题设计相似，文档比较简陋。<a href="https://github.com/saicaca/fuwari" target="_blank">官方仓库链接</a></li>
</ul></section><section><h3>3.2 Fork主题仓库Firefly<a href="#32-fork主题仓库firefly"><span>#</span></a></h3><p>首先Fork一下你选择的Astro博客主题仓库（这里我用的是Firefly）到自己的Github仓库：仓库名、描述可以自定义，只拷贝主分支。</p><p></p><figure><img alt="图片4" loading="lazy" width="1502" height="1136" src="/_astro/blog-4.Cu1G0Thz_jbSVT.webp" /><figcaption>图片4</figcaption></figure><p></p><p>然后再克隆到本地：</p><p></p><figure><img alt="图片5" loading="lazy" width="2890" height="1192" src="/_astro/blog-5.2KHqBFeo_Z27ETun.webp" /><figcaption>图片5</figcaption></figure><p></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>git</span><span> </span><span>clone</span><span> </span><span>上图中你复制的地址</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p></p><figure><img alt="图片6" loading="lazy" width="1336" height="234" src="/_astro/blog-6.BntO-rl__SqJgs.webp" /><figcaption>图片6</figcaption></figure><p></p></section><section><h3>3.3 制定分支策略<a href="#33-制定分支策略"><span>#</span></a></h3><p>核心原则：不要直接在 master 分支做自定义修改，让 master 分支纯粹用于跟踪原博客主题仓库的更新，自定义修改放在独立的开发分支中。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// 1. 创建专属的开发分支（比如叫 dev），所有自定义修改都在这个分支做</span></div></div><div><div><div>2</div></div><div><span><span>git</span><span> </span><span>checkout</span><span> </span></span><span>-</span><span><span>b</span><span> </span><span>dev</span></span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>// 2. 把本地的 dev 分支推送到你的 Fork 仓库（后续提交都推到这个分支）</span></div></div><div><div><div>5</div></div><div><span><span>git</span><span> </span><span>push</span><span> </span></span><span>-</span><span><span>u</span><span> </span><span>origin</span><span> </span><span>dev</span></span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>// 3. 查看本地分支和远程分支的关联状态（关联后，后续可以直接 git push）</span></div></div><div><div><div>8</div></div><div><span><span>git</span><span> </span><span>branch</span><span> </span></span><span>-</span><span>vv</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p></p><figure><img alt="图片7" loading="lazy" width="1624" height="402" src="/_astro/blog-7.OLRLx9Gq_200vuC.webp" /><figcaption>图片7</figcaption></figure><p></p></section><section><h3>3.4 配置与DIY博客<a href="#34-配置与diy博客"><span>#</span></a></h3><p>首次拉取主题仓库到本地后，需要先安装依赖</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// 安装项目依赖</span></div></div><div><div><div>2</div></div><div><span><span>pnpm</span><span> </span><span>install</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>1.在本地启动开发服务器，在浏览器中实时预览博客效果。</p><p>运行以下命令启动开发服务器：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>pnpm</span><span> </span><span>dev</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>博客将在 <code>http://localhost:4321</code> 可用。</p><p>2.对照所选博客主题的官方文档，修改对应配置文件。</p><p>3.根据预览结果，逐项调整、测试配置，直到效果符合预期。</p><p>这个过程的技术门槛并不高，需要投入一定耐心。</p></section><section><h3>4.1 写文章<a href="#41-写文章"><span>#</span></a></h3><p>不同博客主题，文章存放位置略有不同，具体要查看主题文档，比如<code>Firefly</code>主题的文章文件放在 <code>src/content/posts/</code> 目录中。</p><p>另外文章<code>Frontmatter</code>字段的设定也不一样，我们只需要依据主题官方文档来配置即可。</p><p>更多内容查阅官方文档： <a href="https://docs.astro.build/zh-cn/guides/markdown-content/#_top" target="_blank">Astro 中的 Markdown | Docs</a></p></section><section><h3>4.3 构建与预览网站<a href="#43-构建与预览网站"><span>#</span></a></h3><ol>
<li>首先执行构建命令<code>pnpm build</code></li>
</ol><p><code>Astro</code> 会把你的网站打包成可直接上线的版本，放在Astro项目根目录的 <code>dist/</code> 文件夹里，打包进度会在终端里显示。</p><p>打包过程中会自动检查项目里的各类错误，帮你在正式上线前及时发现问题；如果你的 <code>TypeScript</code> 开启了 <code>strict</code> 或 <code>strictest</code> 严格模式，打包时还会额外检查代码的类型错误。</p><ol>
<li>构建完成后，你可以在终端执行预览命令<code>pnpm preview</code></li>
</ol><blockquote><p>执行后就能在本地浏览器中预览已构建好的网站。需要注意的是，预览展示的是你最后一次执行 <code>pnpm build</code> 时的网站状态 —— 如果在打包后修改了代码，这些改动不会立刻出现在预览中，必须重新运行 <code>pnpm build</code> 打包，才能看到最新的修改效果。</p></blockquote><p>若要退出预览模式，可按下 <code>Ctrl + C</code> 终止预览进程，随后在终端执行其他命令（例如重启开发服务器）即可回到开发模式。开发模式下，你的代码修改会实时同步到预览窗口，无需重复构建。</p></section><section><h3>4.2 日常维护博客<a href="#42-日常维护博客"><span>#</span></a></h3><p>平时修改博客内容、调整自定义配置等常规操作，全程在你的开发分支（如 <code>dev</code>） 完成，<code>master</code> 分支保持 “干净”（仅用于跟踪原仓库更新），避免日常操作污染主分支。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// 1. 确保当前在开发分支（每次操作前先确认，避免切错分支）</span></div></div><div><div><div>2</div></div><div><span><span>git</span><span> </span><span>branch</span><span> </span></span><span>// 查看本地所有分支，会显示当前所在本地分支（高亮）</span></div></div><div><div><div>3</div></div><div><span><span>git</span><span> </span><span>branch</span><span> </span></span><span>-</span><span><span>a</span><span> </span></span><span>// 查看本地及远程所有分支，会显示当前所在本地分支（高亮）</span></div></div><div><div><div>4</div></div><div><span><span>git</span><span> </span><span>checkout</span><span> </span><span>dev</span><span> </span></span><span>// 若当前不在dev分支，执行当前命令会切换到本地dev分支</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>// 2. 查看修改内容（可选，但建议做，确认只提交需要的修改）</span></div></div><div><div><div>7</div></div><div><span><span>git</span><span> </span><span>status</span></span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>// 3. 将修改的文件加入暂存区</span></div></div><div><div><div>10</div></div><div><span><span>git</span><span> </span><span>add</span><span> .</span></span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>// 4. 提交修改（备注最好要清晰，方便后续追溯）</span></div></div><div><div><div>13</div></div><div><span><span>git</span><span> </span><span>commit</span><span> </span></span><span>-</span><span><span>m</span><span> </span></span><span>"修改主页布局"</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>// 5. 推送到你的Fork仓库（把本地修改同步到GitHub）</span></div></div><div><div><div>16</div></div><div><span><span>git</span><span> </span><span>push</span><span> </span><span>origin</span><span> </span><span>dev</span><span> </span></span><span>// 将本地dev同步到GitHub的dev分支 注意：此时远程master主分支与dev分支并未同步，dev分支才是你修改后的最新代码</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section><section><h2>5 Vercel 部署<a href="#5-vercel-部署"><span>#</span></a></h2><p><code>Astro</code>部署方案有很多，具体参考官方文档：部署你的 <code>Astro</code> 站点 <a href="https://docs.astro.build/zh-cn/guides/deploy/" target="_blank">Docs</a></p>

<table><thead><tr><th>平台</th><th>免费额度</th><th>国内访问</th><th>适合场景</th></tr></thead><tbody><tr><td>‌Cloudflare Pages‌</td><td>无限带宽/请求</td><td>部分地区良好</td><td>首选，性价比最高</td></tr><tr><td>‌GitHub Pages‌</td><td>1GB存储/100GB带宽/月</td><td>一般</td><td>开源项目展示</td></tr><tr><td>‌Vercel‌</td><td>100GB带宽/月</td><td>不稳定</td><td>个人博客/文档</td></tr><tr><td>‌Netlify‌</td><td>100GB带宽/月</td><td>一般</td><td>企业级应用</td></tr></tbody></table><p>由于之前使用HEXO搭建博客的时候用的‌ <code>GitHub</code>，所以这里我就没再尝试使用<code>‌GitHub Pages</code>‌部署了。
我尝试使用<code>Cloudflare Pages</code>和<code>‌Netlify‌</code>部署，都没有成功。最终使用<code>‌Netlify</code>‌部署成功。</p><section><h3>5.1 本地部署 <code>Netlify</code><a href="#51-本地部署-netlify"><span>#</span></a></h3><p>全局安装 <code>netlify-cli</code></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>npm</span><span> </span><span>install</span><span> </span></span><span>-</span><span><span>g</span><span> </span><span>netlify</span></span><span>-</span><span>cli</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>验证是否安装成功</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>netlify</span><span> </span></span><span>--</span><span>version</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>输出版本号即为安装成功</p></section><section><h3>5.2 <code>Netlify</code> 关联项目<a href="#52-netlify-关联项目"><span>#</span></a></h3><p>登录<a href="https://app.netlify.com" target="_blank"> Netlify 官网</a>，如果没有账号需要注册一下，可以直接关联GitHub登录。这里我是直接关联的GitHub登录。</p><p>在官网点击<code>Add new project</code>新建一个项目</p><p></p><figure><img alt="图片8" loading="lazy" width="3580" height="930" src="/_astro/blog-8.CIeXhvI0_w2R5W.webp" /><figcaption>图片8</figcaption></figure><p></p><p>选择引入/关联你的项目，我的项目在github上，所以我这里选择的GitHub</p><p></p><figure><img alt="图片9" loading="lazy" width="1742" height="1492" src="/_astro/blog-9.pdPOZKY1_14lrBR.webp" /><figcaption>图片9</figcaption></figure><p></p><p>选择/搜索你的项目库并选择</p><p></p><figure><img alt="图片10" loading="lazy" width="1744" height="750" src="/_astro/blog-10.DNMENo30_ZJAwGs.webp" /><figcaption>图片10</figcaption></figure><p></p><p>填写你的项目名称（最终会成功访问链接中）</p><p><strong>注意：</strong> 如果你的项目最新代码也在dev分支上，这里一定要将Build settings选择为dev分支。（这里默认打包的是master分支）</p><p></p><figure><img alt="图片11" loading="lazy" width="1718" height="1826" src="/_astro/blog-11.JP-gOwSB_Z1teW6z.webp" /><figcaption>图片11</figcaption></figure><p></p><p>到页面最底部，点击 “Deploy 你的项目名称”按钮</p><p>跳转的页面最底下，已经开始自动打包部署了，点击进去可以看到详细</p><p></p><figure><img alt="图片12" loading="lazy" width="1636" height="630" src="/_astro/blog-12.BVME5_N1_Zk4PbS.webp" /><figcaption>图片12</figcaption></figure><p></p><p>刚发布的项目，项目名称后面有个锁的图标，这代表当前这个项目虽然发布成功了，但它现在是个私有项目，别人可能访问不到你的项目，点击“visitor access settings”去设置</p><p></p><figure><img alt="图片13" loading="lazy" width="1582" height="502" src="/_astro/blog-13.BEwLX5KD_Z2b69fJ.webp" /><figcaption>图片13</figcaption></figure><p></p><p>点击Edit visibility 去编辑</p><p></p><figure><img alt="图片14" loading="lazy" width="1630" height="1104" src="/_astro/blog-14.ByKR0MB1_Z1NeS76.webp" /><figcaption>图片14</figcaption></figure><p></p><p>选择Public，点击 Save 保存设置</p><p></p><figure><img alt="图片15" loading="lazy" width="1650" height="1800" src="/_astro/blog-15.CogHufxV_Z8XFs.webp" /><figcaption>图片15</figcaption></figure><p></p><p>当这里的图标是这样的，说明项目部署成功了。点击进入当前项目，可以看到项目的详细设置</p><p></p><figure><img alt="图片16" loading="lazy" width="2398" height="782" src="/_astro/blog-16.DVTeBLwt_Z1MyVxc.webp" /><figcaption>图片16</figcaption></figure><p></p><p>点击 Share ，弹框中复制链接，就可以访问你的博客地址了。</p><p></p><figure><img alt="图片17" loading="lazy" width="1832" height="1106" src="/_astro/blog-17.DKcS1BOZ_1xM5h7.webp" /><figcaption>图片17</figcaption></figure><p></p></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/Object.defineProperty%E4%B8%8EProxy/</id>
      <title type="text">Vue 的响应式原理中 Object.defineProperty 有什么缺陷？为什么在 Vue3.0 采用了 Proxy？</title>
      <published>2020-10-12T00:00:00.000Z</published>
      <updated>2020-10-12T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/Object.defineProperty%E4%B8%8EProxy/"/>
      <summary type="text">Vue 的响应式原理中 `Object.defineProperty` 有什么缺陷？为什么在 Vue3.0 采用了 `Proxy`，抛弃了 `Object.defineProperty`？</summary>
      <content type="html"><![CDATA[<section><h3>Vue 的响应式原理中 <code>Object.defineProperty</code> 有什么缺陷？为什么在 Vue3.0 采用了 <code>Proxy</code>，抛弃了 <code>Object.defineProperty</code>？<a href="#vue-的响应式原理中-objectdefineproperty-有什么缺陷为什么在-vue30-采用了-proxy抛弃了-objectdefineproperty"><span>#</span></a></h3><section><h4><code>Object.defineProperty</code><a href="#objectdefineproperty"><span>#</span></a></h4><ol>
<li><code>Object.defineProperty</code> 无法低耗费的监听到数组下标的变化，导致通过数组下标添加元素，不能实时响应；</li>
<li><code>Object.defineProperty</code> 只能劫持对象的属性，从而需要对每个对象，每个属性进行遍历。如果属性值是对象，还需要深度遍历。</li>
</ol></section><section><h4><code>Proxy</code><a href="#proxy"><span>#</span></a></h4><ol>
<li><code>Proxy</code> 可以劫持整个对象， 并返回一个新的对象。</li>
<li><code>Proxy</code> 不仅可以代理对象，还可以代理数组。还可以代理动态增加的属性。</li>
</ol></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/%E8%A7%A3%E5%86%B3chrome%E8%87%AA%E5%8A%A8%E5%A1%AB%E5%85%85%E7%99%BD%E8%89%B2%E8%83%8C%E6%99%AF(input:-internal-autofill-previewed)%E9%97%AE%E9%A2%98/</id>
      <title type="text">解决chrome自动填充白色背景(input:-internal-autofill-previewed)问题</title>
      <published>2019-09-09T00:00:00.000Z</published>
      <updated>2019-09-09T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/%E8%A7%A3%E5%86%B3chrome%E8%87%AA%E5%8A%A8%E5%A1%AB%E5%85%85%E7%99%BD%E8%89%B2%E8%83%8C%E6%99%AF(input:-internal-autofill-previewed)%E9%97%AE%E9%A2%98/"/>
      <summary type="text">解决chrome自动填充白色背景(input:-internal-autofill-previewed)问题</summary>
      <content type="html"><![CDATA[<section><h4>解决chrome自动填充白色背景(input:-internal-autofill-previewed)问题<a href="#解决chrome自动填充白色背景input-internal-autofill-previewed问题"><span>#</span></a></h4><blockquote><p>使用background-clip属性，使它的值为 content-box(将背景裁剪到内容框)，再设input的高度为0，最后使用padding将input框撑开即可：</p></blockquote><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>input</span><span>:-webkit-autofill</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>height: </span><span>0</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>border: </span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>background-clip: </span><span>content-box</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>padding: </span><span><span>12</span><span>px</span></span><span> </span><span><span>5</span><span>px</span></span><span> </span><span><span>12</span><span>px</span></span><span> </span><span><span>44</span><span>px</span></span><span>;</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>然而，有的项目在使用鼠标点选账号密码时依旧会出现灰色背景，最后的解决办法也是误打误撞，将background-clip的权重提到最高content-box!important就行，不会再出现灰色背景。</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/%E4%B8%B4%E6%97%B6%E5%9C%A8%E4%B8%80%E6%AE%B5%E4%BB%A3%E7%A0%81%E4%B8%AD%E5%8F%96%E6%B6%88eslint%E6%A3%80%E6%9F%A5/</id>
      <title type="text">临时在一段代码中取消eslint检查</title>
      <published>2019-09-01T00:00:00.000Z</published>
      <updated>2019-09-01T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/%E4%B8%B4%E6%97%B6%E5%9C%A8%E4%B8%80%E6%AE%B5%E4%BB%A3%E7%A0%81%E4%B8%AD%E5%8F%96%E6%B6%88eslint%E6%A3%80%E6%9F%A5/"/>
      <summary type="text">临时在一段代码中取消eslint检查</summary>
      <content type="html"><![CDATA[<section><h3>临时在一段代码中取消eslint检查<a href="#临时在一段代码中取消eslint检查"><span>#</span></a></h3><p>可以如下设置</p><ul>
<li>
<p>临时在一段代码中取消个别规则的检查（如no-alert, no-console）：<code>/* eslint-disable no-alert, no-console */</code></p>
</li>
<li>
<p>在整个文件中取消eslint检查：<code>/* eslint-disable */</code></p>
</li>
<li>
<p>在整个文件中禁用某一项eslint规则的检查：<code>/* eslint-disable no-alert */</code></p>
</li>
<li>
<p>针对某一行禁用eslint检查：</p>
<ul>
<li>
<p>当前行禁用eslint检查 <code>alert(‘foo’); // eslint-disable-line</code></p>
</li>
<li>
<p>下一行禁用eslint检查</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// eslint-disable-next-line</span></div></div><div><div><div>2</div></div><div><span>alert</span><span><span>(‘</span><span>foo</span><span>’);</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
<li>
<p>针对某一行的某一具体规则禁用eslint检查：</p>
<ul>
<li>
<p>当前行禁用eslint检查 <code>alert(‘foo’); // eslint-disable-line no-alert</code></p>
</li>
<li>
<p>下一行禁用eslint检查</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// eslint-disable-next-line no-alert</span></div></div><div><div><div>2</div></div><div><span>alert</span><span><span>(‘</span><span>foo</span><span>’);</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
<li>
<p>针对某一行禁用多项具体规则的检查：</p>
<ul>
<li>
<p>当前行禁用eslint检查 <code>alert(‘foo’); // eslint-disable-line no-alert, quotes, semi</code></p>
</li>
<li>
<p>下一行禁用eslint检查</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// eslint-disable-next-line no-alert, quotes, semi</span></div></div><div><div><div>2</div></div><div><span>alert</span><span><span>(‘</span><span>foo</span><span>’);</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/%E4%BB%8EChrome%E6%BA%90%E7%A0%81%E7%9C%8BJS%20Array%E7%9A%84%E5%AE%9E%E7%8E%B0/</id>
      <title type="text">从Chrome源码看JS Array的实现</title>
      <published>2019-08-01T00:00:00.000Z</published>
      <updated>2019-08-01T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/%E4%BB%8EChrome%E6%BA%90%E7%A0%81%E7%9C%8BJS%20Array%E7%9A%84%E5%AE%9E%E7%8E%B0/"/>
      <summary type="text">从Chrome源码看JS Array的实现:JS Array的实现,Push和扩容,Pop和减容,shift和splice数组中间的操作,Join和Sort,Array和线性链接的速度</summary>
      <content type="html"><![CDATA[<section><h3>从Chrome源码看JS Array的实现<a href="#从chrome源码看js-array的实现"><span>#</span></a></h3><blockquote><p>JS的Array是一个万能的数据结构，为什么这么说呢？因为首先它可以当作一个普通的数组来使用，即通过下标找到数组的元素：</p></blockquote><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>ary</span><span> </span></span><span>=</span><span> [</span><span>19</span><span>, </span><span>59</span><span>, </span><span>99</span><span>]</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>ary</span><span>[</span></span><span>0</span><span>]) </span><span>// 19</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p>然后它可以当作一个栈来使用，我们知道栈的特点是先进后出，栈的基本操作是出栈和入栈：</p></blockquote><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>ary</span><span> </span></span><span>=</span><span> [</span><span>1</span><span>, </span><span>2</span><span>, </span><span>3</span><span>]</span></div></div><div><div><div>2</div></div><div><span><span>ary</span><span>.</span></span><span>push</span><span>(</span><span>4</span><span>) </span><span>// 入栈</span></div></div><div><div><div>3</div></div><div><span><span>ary</span><span>.</span></span><span>pop</span><span>() </span><span>// 出栈</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p>同时它还可以当作一个队列，队列的特点是先进先出，基本操作是出队和入队：</p></blockquote><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>ary</span><span> </span></span><span>=</span><span> [</span><span>1</span><span>, </span><span>2</span><span>, </span><span>3</span><span>]</span></div></div><div><div><div>2</div></div><div><span><span>ary</span><span>.</span></span><span>push</span><span>(</span><span>4</span><span>) </span><span>// 入队</span></div></div><div><div><div>3</div></div><div><span><span>ary</span><span>.</span></span><span>shift</span><span>() </span><span>// 出队</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p>甚至它还可以当作一个哈希表来使用(但是不推荐这么用)：</p></blockquote><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>ary</span><span> </span></span><span>=</span><span> [</span><span>1</span><span>, </span><span>2</span><span>, </span><span>3</span><span>, </span><span>4</span><span>]</span></div></div><div><div><div>2</div></div><div><span>// 从第3个元素开始，删掉1个元素，并插入-1，-2这两个元素</span></div></div><div><div><div>3</div></div><div><span><span>ary</span><span>.</span></span><span>splice</span><span>(</span><span>2</span><span>, </span><span>1</span><span>, </span><span>-</span><span>1</span><span>, </span><span>-</span><span>2</span><span>) </span><span>// [1, 2, -1, -2, 4]</span></div></div><div><div><div>4</div></div><div><span>// 再来个2000的索引</span></div></div><div><div><div>5</div></div><div><span><span>ary</span><span>[</span></span><span>2000</span><span>] </span><span>=</span><span> </span><span>2000</span><span> </span><span>// [1, 2, -1, -2, 4, empty*1995, 2000]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p>JS Array一方面提供了很大的便利，只要用一个数据结构就可以做很多事情，使用者不需要关心各者的区别，使得JS很容易入门。另一方面它屏蔽了数据结构的概念，不少写前端的都不知道什么是栈、队列、哈希、树，特别是那些不是学计算机，中途转过来的。然而这往往是不可取的。</p></blockquote><blockquote><p>另外一点是，即使是一些前端的老司机，他们也很难说清楚，这些数组函数操作的效率怎么样，例如说随意地往数组中间增加一个元素不会有性能问题么。所以就很有必要从源码的角度看一下数组是怎么实现的。</p></blockquote><section><h4>1. JS Array的实现<a href="#1-js-array的实现"><span>#</span></a></h4><blockquote><p>先看源码注释：</p></blockquote><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// The JSArray describes JavaScript Arrays</span></div></div><div><div><div>2</div></div><div><span>//  Such an array can be in one of two modes:</span></div></div><div><div><div>3</div></div><div><span>//    - fast, backing storage is a FixedArray and length &lt;= elements.length();</span></div></div><div><div><div>4</div></div><div><span>//       Please note: push and pop can be used to grow and shrink the array.</span></div></div><div><div><div>5</div></div><div><span>//    - slow, backing storage is a HashTable with numbers as keys.</span></div></div><div><div><div>6</div></div><div><span>class</span><span> </span><span>JSArray</span><span>: </span><span>public</span><span> </span><span>JSObject</span><span> {</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>public</span><span>:</span></div></div><div><div><div>8</div></div><div><span>  </span><span>// [length]: The length property.</span></div></div><div><div><div>9</div></div><div><span>  </span><span>DECL_ACCESSORS</span><span><span> (</span><span>length</span><span>, </span><span>Object</span><span>)</span></span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>  </span><span>// Number of element slots to pre-allocate for an empty array.</span></div></div><div><div><div>12</div></div><div><span>  </span><span>static</span><span> </span><span>const</span><span> </span><span>int</span><span> </span><span>kPreallocatedArrayElements</span><span> </span><span>=</span><span> </span><span>4</span><span>;</span></div></div><div><div><div>13</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p>这里说明一下，如果不熟悉C/C++的，那把它成伪码就好了。</p>
</li>
<li>
<p>源码里面说了，JSArray有两种模式，一种是快速的，一种是慢速的，快速的用的是索引直接定位，慢速的使用用哈希查找，由于JSArray是继承于JSObject，所以它也是同样的处理方式，如下面的：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>ary</span><span> </span></span><span>=</span><span> [</span><span>1</span><span>, </span><span>2</span><span>, </span><span>3</span><span>]</span></div></div><div><div><div>2</div></div><div><span><span>ary</span><span>[</span></span><span>2000</span><span>] </span><span>=</span><span> </span><span>5</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>增加一个2000的索引时，array就会被转成慢元素。</li>
</ul>
</li>
</ul></section><section><h4>2. Push和扩容<a href="#2-push和扩容"><span>#</span></a></h4><blockquote><p>数组初始化大小为4：</p></blockquote><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// Number of element slots to pre-allocate for an empty array.</span></div></div><div><div><div>2</div></div><div><span><span>static</span><span> </span></span><span>const</span><span> </span><span>int</span><span> kPreallocatedArrayElements </span><span>=</span><span> </span><span>4</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p>执行push的时候会在数组的末尾添加新的元素，而一旦空间不足时，将进行扩容。</p>
</li>
<li>
<p>在源码里面push是用汇编实现的，在C++里面嵌入的汇编。这个应该是考虑到push是一个最为常用的操作，所以用汇编实现提高执行速度。在汇编的上面封装了一层，用C++调的封装的汇编的函数，在编译组装的时候，将把这些C++代码转成汇编代码。</p>
</li>
<li>
<p>计算新容量的函数：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Node</span><span>*</span><span><span> </span><span>CodeStubAssembler</span><span>::</span></span><span>CalculateNewElementsCapacity</span><span><span>(</span><span>Node</span></span><span>*</span><span><span> </span><span>old_capacity</span><span>, </span><span>ParameterMode</span><span> </span><span>mode</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>Node</span><span>*</span><span><span> </span><span>half_old_capacity</span><span> </span></span><span>=</span><span> </span><span>WordOrSmiShr</span><span><span>(</span><span>old_capacity</span><span>, </span></span><span>1</span><span><span>, </span><span>mode</span><span>);</span></span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>Node</span><span>*</span><span><span> </span><span>new_capacity</span><span> </span></span><span>=</span><span> </span><span>IntPtrOrSmiAdd</span><span><span>(</span><span>half_old_capacity</span><span>, </span><span>old_capacity</span><span>, </span><span>mode</span><span>);</span></span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>Node</span><span>*</span><span><span> </span><span>padding</span><span> </span></span><span>=</span><span> </span><span>IntPtrOrSmiConstant</span><span>(</span><span>16</span><span><span>, </span><span>mode</span><span>);</span></span></div></div><div><div><div>5</div></div><div><span>  </span><span>return</span><span> </span><span>IntPtrOrSmiAdd</span><span><span>(</span><span>new_capacity</span><span>, </span><span>padding</span><span>, </span><span>mode</span><span>);</span></span></div></div><div><div><div>6</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>如上代码新容量等于 ：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>new_capacity</span><span> </span></span><span>=</span><span><span> </span><span>old_capacity</span><span> </span></span><span>/</span><span> </span><span>2</span><span> </span><span>+</span><span><span> </span><span>old_capacity</span><span> </span></span><span>+</span><span> </span><span>16</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>即老的容量的1.5倍加上16。初始化为4个，当push第5个的时候，容量将会变成：</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>new_capacity</span><span> </span></span><span>=</span><span> </span><span>4</span><span> </span><span>/</span><span> </span><span>2</span><span> </span><span>+</span><span> </span><span>4</span><span> </span><span>+</span><span> </span><span>16</span><span> </span><span>=</span><span> </span><span>22</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>接着申请一块这么大的内存，把老的数据拷过去：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Node</span><span>*</span><span><span> </span><span>CodeStubAssembler</span><span>::</span></span><span>GrowElementsCapacity</span><span><span>(</span><span>Node</span></span><span>*</span><span><span> </span><span>object</span><span>, </span><span>Node</span></span><span>*</span><span><span> </span><span>elements</span><span>, </span><span>Node</span></span><span>*</span><span><span> </span><span>capacity</span><span>, </span><span>Node</span></span><span>*</span><span><span> </span><span>new_capacity</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span>  </span><span>// Allocate the new backing store.</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>Node</span><span>*</span><span><span> </span><span>new_elements</span><span> </span></span><span>=</span><span> </span><span>AllocateFixedArray</span><span><span>(</span><span>new_capacity</span><span>, </span><span>mode</span><span>);</span></span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>  </span><span>// Copy the elements from the old elements store to the new.</span></div></div><div><div><div>6</div></div><div><span>  </span><span>CopyFixedArrayElements</span><span><span>(</span><span>elements</span><span>, </span><span>new_elements</span><span>, </span><span>capacity</span><span>, </span><span>new_capacity</span><span>);</span></span></div></div><div><div><div>7</div></div><div><span>  </span><span>return</span><span><span> </span><span>new_elements</span><span>;</span></span></div></div><div><div><div>8</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>由于复制是用的memcopy，把整一段内存空间拷贝过去，所以这个操作还是比较快的。</p>
</li>
<li>
<p>再把新元素放到当前length的位置，再把length增加1：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>StoreFixedArrayElement</span><span><span>(</span><span>elements</span><span>, </span><span>var_length</span><span>.</span></span><span>value</span><span>());</span></div></div><div><div><div>2</div></div><div><span>Increment</span><span><span>(</span><span>var_length</span><span>, </span></span><span>1</span><span><span>, </span><span>mode</span><span>);</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul></section><section><h4>3. Pop和减容<a href="#3-pop和减容"><span>#</span></a></h4><blockquote><p>push是用汇编实现，而pop的逻辑是用C++写的。在执行pop的时候，第一步，获取到当前的length，用这个length - 1得到要删除的元素，然后调用setLength调整容量，最后返回删除的元素：</p></blockquote><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>int</span><span> </span><span>new_length</span><span> </span></span><span>=</span><span><span> </span><span>length</span><span> </span></span><span>-</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>int</span><span> </span><span>remove_index</span><span> </span></span><span>=</span><span><span> </span><span>remove_position</span><span> </span></span><span>==</span><span> </span><span>AT_START</span><span> </span><span>?</span><span> </span><span>0</span><span> </span><span>:</span><span><span> </span><span>new_length</span><span>;</span></span></div></div><div><div><div>3</div></div><div><span>Handle</span><span>&lt;</span><span>Object</span><span>&gt;</span><span><span> </span><span>result</span><span> </span></span><span>=</span><span><span> </span><span>Subclass</span><span>::</span></span><span>GetImpl</span><span><span>(</span><span>isolate</span><span>, </span></span><span>*</span><span><span>backing_store</span><span>, </span><span>remove_index</span><span>);</span></span></div></div><div><div><div>4</div></div><div><span><span>Subclass</span><span>::</span></span><span>SetLengthImpl</span><span><span>(</span><span>isolate</span><span>, </span><span>receiver</span><span>, </span><span>new_length</span><span>, </span><span>backing_store</span><span>);</span></span></div></div><div><div><div>5</div></div><div><span>return</span><span><span> </span><span>result</span><span>;</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p>我们重点看下这个减容的过程：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>if</span><span> (</span><span>2</span><span> </span><span>*</span><span><span> </span><span>length</span><span> </span></span><span>&lt;=</span><span><span> </span><span>capacity</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span>  </span><span>// If more than half the elements won't be used, trim the array.</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>isolate</span><span>-&gt;</span><span>heap</span><span>()</span><span>-&gt;</span><span>RightTrimFixedArray</span><span><span>(</span><span>backing_store</span><span>, </span><span>capacity</span><span> </span></span><span>-</span><span><span> </span><span>length</span><span>);</span></span></div></div><div><div><div>4</div></div><div><span>} </span><span>else</span><span> {</span></div></div><div><div><div>5</div></div><div><span>  </span><span>// Otherwise, fill the unused tail with holes.</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>BackingStore</span><span>::</span><span>cast</span><span>(</span><span>*</span><span><span>backing_store</span><span>)</span></span><span>-&gt;</span><span>FillWithHoles</span><span><span>(</span><span>length</span><span>, </span><span>old_length</span><span>);</span></span></div></div><div><div><div>7</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>如果容量大于等于length的2倍，则进行容量调整，否则用holes对象填充。第三行的rightTrim函数，会算出需要释放的空间大小，并做标记，并等待GC回收：</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>int</span><span> </span><span>bytes_to_trim</span><span> </span></span><span>=</span><span><span> </span><span>elements_to_trim</span><span> </span></span><span>*</span><span><span> </span><span>element_size</span><span>;</span></span></div></div><div><div><div>2</div></div><div><span>// Calculate location of new array end.</span></div></div><div><div><div>3</div></div><div><span><span>Address</span><span> </span><span>old_end</span><span> </span></span><span>=</span><span><span> </span><span>object</span></span><span>-&gt;</span><span>address</span><span>() </span><span>+</span><span><span> </span><span>object</span></span><span>-&gt;</span><span>Size</span><span>();</span></div></div><div><div><div>4</div></div><div><span><span>Address</span><span> </span><span>new_end</span><span> </span></span><span>=</span><span><span> </span><span>old_end</span><span> </span></span><span>-</span><span><span> </span><span>bytes_to_trim</span><span>;</span></span></div></div><div><div><div>5</div></div><div><span>CreateFillerObjectAt</span><span><span>(</span><span>new_end</span><span>, </span><span>bytes_to_trim</span><span>, </span><span>ClearRecordedSlots</span><span>::</span><span>kYes</span><span>);</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>也就是说，当数组的元素个数小于容量的一半时，就会进行减少的操作，将容量调整为实际的大小。</li>
</ul>
</li>
</ul></section><section><h4>4. shift和splice数组中间的操作<a href="#4-shift和splice数组中间的操作"><span>#</span></a></h4><blockquote><p>push和pop都是在数组末尾操作，相对比较简单，而shfit、unshfit、splice是在数组的开始或者中间进行操纵。我们来看一下，如果是这种情况的又是如何调整数组元素的。</p></blockquote><section><h5>（1）shift<a href="#1shift"><span>#</span></a></h5><ul>
<li>
<p>shift是出队，即删除并返回数组的第一个元素。shift和pop调的都是同样的删除函数，只不过shift传的删除的postion是AT_STRT，源码里面会判断如果是AT_START的话，会把元素进行移动：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>if</span><span><span> (</span><span>remove_position</span><span> </span></span><span>==</span><span> </span><span>AT_START</span><span>) {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>Subclass</span><span>::</span><span>MoveElements</span><span><span>(</span><span>isolate</span><span>, </span><span>receiver</span><span>, </span><span>backing_store</span><span>, </span></span><span>0</span><span>, </span><span>1</span><span><span>, </span><span>new_length</span><span>, </span></span><span>0</span><span>, </span><span>0</span><span>);</span></div></div><div><div><div>3</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>从1的位置移到0的位置，如上面第2行的第4、5个参数，这个move将会调leftTrim，和上面的rightTrim相反：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>*</span><span><span>dst_elms</span><span>.</span></span><span>location</span><span>() </span><span>=</span><span><span> </span><span>BackingStore</span><span>::</span></span><span>cast</span><span><span>(</span><span>heap</span></span><span>-&gt;</span><span>LeftTrimFixedArray</span><span>(</span><span>*</span><span><span>dst_elms</span><span>, </span><span>src_index</span><span>));</span></span></div></div><div><div><div>2</div></div><div><span>receiver</span><span>-&gt;</span><span>set_elements</span><span>(</span><span>*</span><span><span>dst_elms</span><span>);</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul></section><section><h5>（2）unshfit<a href="#2unshfit"><span>#</span></a></h5><ul>
<li>
<p>unshfit在数组的开始位置插入元素，首先要判断容量是否足够存放，如果不够，将容量扩展为老容量的1.5倍加16，然后把老元素移到新的内存空间偏移为unshift元素个数的位置，也就是说要腾出起始的空间放unshfit传进来的元素，如果空间足够了，则直接执行memmove移动内存空间，最后再把unshif传进来的参数copy到开始的位置，并更新array的length：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>int</span><span> </span><span>insertion_index</span><span> </span></span><span>=</span><span><span> </span><span>add_position</span><span> </span></span><span>==</span><span> </span><span>AT_START</span><span> </span><span>?</span><span> </span><span>0</span><span> </span><span>:</span><span><span> </span><span>length</span><span>;</span></span></div></div><div><div><div>2</div></div><div><span>// Copy the arguments to the start.</span></div></div><div><div><div>3</div></div><div><span><span>Subclass</span><span>::</span></span><span>CopyArguments</span><span><span>(</span><span>args</span><span>, </span><span>backing_store</span><span>, </span><span>add_size</span><span>, </span></span><span>1</span><span><span>, </span><span>insertion_index</span><span>);</span></span></div></div><div><div><div>4</div></div><div><span>// Set the length.</span></div></div><div><div><div>5</div></div><div><span>receiver</span><span>-&gt;</span><span>set_length</span><span><span>(</span><span>Smi</span><span>::</span></span><span>FromInt</span><span><span>(</span><span>new_length</span><span>));</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul></section><section><h5>（3）splice<a href="#3splice"><span>#</span></a></h5><ul>
<li>
<p>splice的操作已经几乎不用去看源码了，通过shift和unshift的操作是怎么样的，就可以想象到它的执行过程是怎样的，只是shift/unshfit操作的index是0，而splice可以指定index。具体代码如下：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// Delete and move elements to make space for add_count new elements.</span></div></div><div><div><div>2</div></div><div><span>if</span><span><span> (</span><span>add_count</span><span> </span></span><span>&lt;</span><span><span> </span><span>delete_count</span><span>) {</span></span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>Subclass</span><span>::</span><span>SpliceShrinkStep</span><span><span>(</span><span>isolate</span><span>, </span><span>receiver</span><span>, </span><span>backing_store</span><span>, </span><span>start</span><span>, </span><span>delete_count</span><span>, </span><span>add_count</span><span>, </span><span>length</span><span>, </span><span>new_length</span><span>);</span></span></div></div><div><div><div>4</div></div><div><span>} </span><span>else</span><span> </span><span>if</span><span><span> (</span><span>add_count</span><span> </span></span><span>&gt;</span><span><span> </span><span>delete_count</span><span>) {</span></span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>backing_store</span><span> </span><span>=</span><span><span> </span><span>Subclass</span><span>::</span></span><span>SpliceGrowStep</span><span><span>(</span><span>isolate</span><span>, </span><span>receiver</span><span>, </span><span>backing_store</span><span>, </span><span>start</span><span>, </span><span>delete_count</span><span>, </span><span>add_count</span><span>, </span><span>length</span><span>, </span><span>new_length</span><span>);</span></span></div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>// Copy over the arguments.</span></div></div><div><div><div>9</div></div><div><span><span>Subclass</span><span>::</span></span><span>CopyArguments</span><span><span>(</span><span>args</span><span>, </span><span>backing_store</span><span>, </span><span>add_count</span><span>, </span></span><span>3</span><span><span>, </span><span>start</span><span>);</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>它需要先shrink或者grow中间元素的空间，以适应增加元素比删除元素少或者多的情况，然后进行容量调整和移动元素。</li>
</ul>
</li>
</ul></section></section><section><h4>5. Join和Sort<a href="#5-join和sort"><span>#</span></a></h4><blockquote><p>它们是用JS实现的，然后再用wasm打包成native code。不过，join的实现逻辑并不简单，因为array的元素本身具有多样化，可能为慢元素或者快元素，还可能带有循环引用，对于慢元素，需要先排下序：</p></blockquote><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>keys</span><span> </span></span><span>=</span><span> </span><span>GetSortedArrayKeys</span><span><span>(</span><span>array</span><span>, </span></span><span>%</span><span>GetArrayKeys</span><span><span>(</span><span>array</span><span>, </span><span>length</span><span>));</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p>预处理完之后，最后创建一个字符串数组，用连接符连起来：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// Construct an array for the elements.</span></div></div><div><div><div>2</div></div><div><span>var</span><span><span> </span><span>elements</span><span> </span></span><span>=</span><span> </span><span>new</span><span> </span><span>InternalArray</span><span><span>(</span><span>length</span><span>);</span></span></div></div><div><div><div>3</div></div><div><span>for</span><span> (</span><span>var</span><span><span> </span><span>i</span><span> </span></span><span>=</span><span> </span><span>0</span><span><span>; </span><span>i</span><span> </span></span><span>&lt;</span><span><span> </span><span>length</span><span>; </span><span>i</span></span><span>++</span><span>) {</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>elements</span><span>[</span><span>i</span><span>] </span><span>=</span><span> </span><span>ConvertToString</span><span><span>(</span><span>use_locale</span><span>, </span><span>array</span><span>[</span><span>i</span><span>]);</span></span></div></div><div><div><div>5</div></div><div><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>if</span><span><span> (</span><span>separator</span><span> </span></span><span>===</span><span> </span><span>''</span><span>) {</span></div></div><div><div><div>8</div></div><div><span>  </span><span>return</span><span> </span><span>%</span><span>StringBuilderConcat</span><span><span>(</span><span>elements</span><span>, </span><span>length</span><span>, </span></span><span>''</span><span>);</span></div></div><div><div><div>9</div></div><div><span>} </span><span>else</span><span> {</span></div></div><div><div><div>10</div></div><div><span>  </span><span>return</span><span> </span><span>%</span><span>StringBuilderJoin</span><span><span>(</span><span>elements</span><span>, </span><span>length</span><span>, </span><span>separator</span><span>);</span></span></div></div><div><div><div>11</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>而sort函数是用的快速排序：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>ArraySort</span><span><span>(</span><span>comparefn</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span>  </span><span>CHECK_OBJECT_COERCIBLE</span><span>(</span><span>this</span><span>, </span><span>"Array.prototype.sort"</span><span>);</span></div></div><div><div><div>3</div></div><div><span>  </span><span>%</span><span>Log</span><span>(</span><span>"js/array.js execute ArraySort"</span><span>);  </span><span>//手动添加的log打印，确保执行的是这里</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>  </span><span>var</span><span><span> </span><span>array</span><span> </span></span><span>=</span><span> </span><span>TO_OBJECT</span><span>(</span><span>this</span><span>);</span></div></div><div><div><div>6</div></div><div><span>  </span><span>var</span><span><span> </span><span>length</span><span> </span></span><span>=</span><span> </span><span>TO_LENGTH</span><span><span>(</span><span>array</span><span>.</span></span><span>length</span><span>);</span></div></div><div><div><div>7</div></div><div><span>  </span><span>return</span><span> </span><span>InnerArraySort</span><span><span>(</span><span>array</span><span>, </span><span>length</span><span>, </span><span>comparefn</span><span>);</span></span></div></div><div><div><div>8</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>当数组元素的个数不超过10个时，是用的插入排序：</p>
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>InnerArraySort</span><span><span>(</span><span>array</span><span>, </span><span>length</span><span>, </span><span>comparefn</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span>  </span><span>// In-place QuickSort algorithm.</span></div></div><div><div><div>3</div></div><div><span>  </span><span>// For short (length &lt;= 10) arrays, insertion sort is used for efficiency.</span></div></div><div><div><div>4</div></div><div><span>  </span><span>function</span><span> </span><span>QuickSort</span><span><span>(</span><span>a</span><span>, </span><span>from</span><span>, </span><span>to</span><span>) {</span></span></div></div><div><div><div>5</div></div><div><span>    </span><span>var</span><span><span> </span><span>third_index</span><span> </span></span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>6</div></div><div><span>    </span><span>while</span><span> (</span><span>true</span><span>) {</span></div></div><div><div><div>7</div></div><div><span>      </span><span>// Insertion sort is faster for short arrays.</span></div></div><div><div><div>8</div></div><div><span>      </span><span>if</span><span><span> (</span><span>to</span><span> </span></span><span>-</span><span><span> </span><span>from</span><span> </span></span><span>&lt;=</span><span> </span><span>10</span><span>) {</span></div></div><div><div><div>9</div></div><div><span>        </span><span>InsertionSort</span><span><span>(</span><span>a</span><span>, </span><span>from</span><span>, </span><span>to</span><span>);</span></span></div></div><div><div><div>10</div></div><div><span>        </span><span>return</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>      </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span>      </span><span>//other code ...</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>
</li>
<li>
<p>快速排序算法里面有一个比较重要的地方是选择枢纽元素，最简单的是每次都是选取第一个元素，或者中间的元素，在源码里面是这样选择的：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>if</span><span><span> (</span><span>to</span><span> </span></span><span>-</span><span><span> </span><span>from</span><span> </span></span><span>&gt;</span><span> </span><span>1000</span><span>) {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>third_index</span><span> </span><span>=</span><span> </span><span>GetThirdIndex</span><span><span>(</span><span>a</span><span>, </span><span>from</span><span>, </span><span>to</span><span>);</span></span></div></div><div><div><div>3</div></div><div><span>} </span><span>else</span><span> {</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>third_index</span><span> </span><span>=</span><span><span> </span><span>from</span><span> </span></span><span>+</span><span><span> ((</span><span>to</span><span> </span></span><span>-</span><span><span> </span><span>from</span><span>) </span></span><span>&gt;&gt;</span><span> </span><span>1</span><span>);</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>如果元素个数在1000以内，则使用它们的中间元素，否则要算一下， 这个算法比较有趣：</p>
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>GetThirdIndex</span><span><span>(</span><span>a</span><span>, </span><span>from</span><span>, </span><span>to</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span>  </span><span>var</span><span><span> </span><span>t_array</span><span> </span></span><span>=</span><span> </span><span>new</span><span> </span><span>InternalArray</span><span>();</span></div></div><div><div><div>3</div></div><div><span>  </span><span>// Use both 'from' and 'to' to determine the pivot candidates.</span></div></div><div><div><div>4</div></div><div><span>  </span><span>var</span><span><span> </span><span>increment</span><span> </span></span><span>=</span><span> </span><span>200</span><span> </span><span>+</span><span><span> ((</span><span>to</span><span> </span></span><span>-</span><span><span> </span><span>from</span><span>) </span></span><span>&amp;</span><span> </span><span>15</span><span>);</span></div></div><div><div><div>5</div></div><div><span>  </span><span>var</span><span><span> </span><span>j</span><span> </span></span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>from</span><span> </span><span>+=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>to</span><span> </span><span>-=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>8</div></div><div><span>  </span><span>for</span><span> (</span><span>var</span><span><span> </span><span>i</span><span> </span></span><span>=</span><span><span> </span><span>from</span><span>; </span><span>i</span><span> </span></span><span>&lt;</span><span><span> </span><span>to</span><span>; </span><span>i</span><span> </span></span><span>+=</span><span><span> </span><span>increment</span><span>) {</span></span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>t_array</span><span>[</span><span>j</span><span>] </span><span>=</span><span><span> [</span><span>i</span><span>, </span><span>a</span><span>[</span><span>i</span><span>]];</span></span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>j</span><span>++</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span><span>  </span></span><span>t_array</span><span>.</span><span>sort</span><span>(</span><span>function</span><span><span>(</span><span>a</span><span>, </span><span>b</span><span>) {</span></span></div></div><div><div><div>13</div></div><div><span>    </span><span>return</span><span> </span><span>comparefn</span><span><span>(</span><span>a</span><span>[</span></span><span>1</span><span><span>], </span><span>b</span><span>[</span></span><span>1</span><span>]);</span></div></div><div><div><div>14</div></div><div><span><span>  </span></span><span>});</span></div></div><div><div><div>15</div></div><div><span>  </span><span>var</span><span><span> </span><span>third_index</span><span> </span></span><span>=</span><span><span> </span><span>t_array</span><span>[</span><span>t_array</span><span>.</span></span><span>length</span><span> </span><span>&gt;&gt;</span><span> </span><span>1</span><span>][</span><span>0</span><span>];</span></div></div><div><div><div>16</div></div><div><span>  </span><span>return</span><span><span> </span><span>third_index</span><span>;</span></span></div></div><div><div><div>17</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>
<ul>
<li>先取一个递增间距200~215之间，再循环取出原元素里面落到这个间距的元素，放到一个新的数组里面（这个数组是C++里面的数组），然后排下序，取中间的元素。因为枢纽元素的刚好是所有元素的中位数时，排序的效果最好，而这里是取出少数元素的中位数，类似于抽样模拟，缺点是它得再借助另外的排序算法。</li>
<li>最后再比较一下Array和线性链接的速度。</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul></section><section><h4>Array和线性链接的速度<a href="#array和线性链接的速度"><span>#</span></a></h4><blockquote><p>线性链接是一种非连续存储的数据结构，每个元素都有一个指针指向它的下一个元素，所以它删除元素的时候不需要移动其它元素，也不需要考虑扩容的事情，但是它的查找比较慢。我们实现一个简单的List和Array进行比较。</p></blockquote><ul>
<li>
<p>List的每个节点用一个Node表示：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span> </span><span>Node</span><span>{</span></div></div><div><div><div>2</div></div><div><span>  </span><span>constructor</span><span><span>(</span><span>value</span><span>, </span><span>next</span><span>){</span></span></div></div><div><div><div>3</div></div><div><span>      </span><span>this</span><span>.</span><span>value</span><span> </span><span>=</span><span><span> </span><span>value</span><span>;</span></span></div></div><div><div><div>4</div></div><div><span>      </span><span>this</span><span>.</span><span>next</span><span> </span><span>=</span><span><span> </span><span>next</span><span>;</span></span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>每个List都有一个头指针指向第一个元素，和一个length记录它的长度：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span> </span><span>List</span><span>{</span></div></div><div><div><div>2</div></div><div><span>  </span><span>constructor</span><span>(){</span></div></div><div><div><div>3</div></div><div><span>      </span><span>this</span><span>.</span><span>head</span><span> </span><span>=</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>4</div></div><div><span>      </span><span>this</span><span>.</span><span>tail</span><span> </span><span>=</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>5</div></div><div><span>      </span><span>this</span><span>.</span><span>length</span><span> </span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>然后实现它的push和unshift函数：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>class</span><span> </span><span>List</span><span>{</span></div></div><div><div><div>2</div></div><div><span>  </span><span>unshift</span><span><span>(</span><span>value</span><span>){</span></span></div></div><div><div><div>3</div></div><div><span>      </span><span>return</span><span> </span><span>this</span><span>.</span><span>insert</span><span>(</span><span>0</span><span><span>, </span><span>value</span><span>);</span></span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>5</div></div><div><span>  </span><span>push</span><span><span>(</span><span>value</span><span>){</span></span></div></div><div><div><div>6</div></div><div><span>      </span><span>if</span><span>(</span><span>this</span><span>.</span><span>head</span><span> </span><span>===</span><span> </span><span>null</span><span>){</span></div></div><div><div><div>7</div></div><div><span>          </span><span>this</span><span>.</span><span>head</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>Node</span><span><span>(</span><span>value</span><span>, </span></span><span>this</span><span>.</span><span>tail</span><span>);</span></div></div><div><div><div>8</div></div><div><span>          </span><span>this</span><span>.</span><span>length</span><span>++</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>      </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>10</div></div><div><span>          </span><span>this</span><span>.</span><span>insert</span><span>(</span><span>this</span><span>.</span><span>length</span><span><span>, </span><span>value</span><span>);</span></span></div></div><div><div><div>11</div></div><div><span><span>      </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span>      </span><span>return</span><span> </span><span>this</span><span>.</span><span>length</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>两个函数都会调一个通用的insert函数：</p>
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>insert</span><span><span>(</span><span>index</span><span>, </span><span>value</span><span>){</span></span></div></div><div><div><div>2</div></div><div><span>  </span><span>var</span><span><span> </span><span>insertPos</span><span> </span></span><span>=</span><span> </span><span>this</span><span>.</span><span>head</span><span>;</span></div></div><div><div><div>3</div></div><div><span>  </span><span>//找到需要插入的位置的节点</span></div></div><div><div><div>4</div></div><div><span>  </span><span>for</span><span>(</span><span>var</span><span><span> </span><span>i</span><span> </span></span><span>=</span><span> </span><span>0</span><span><span>; </span><span>i</span><span> </span></span><span>&lt;</span><span><span> </span><span>index</span><span> </span></span><span>-</span><span> </span><span>1</span><span><span>; </span><span>i</span></span><span>++</span><span>){</span></div></div><div><div><div>5</div></div><div><span><span>      </span></span><span>insertPos</span><span> </span><span>=</span><span><span> </span><span>insertPos</span><span>.</span></span><span>next</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>  </span><span>var</span><span><span> </span><span>node</span><span> </span></span><span>=</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>8</div></div><div><span>  </span><span>if</span><span><span>(</span><span>index</span><span> </span></span><span>===</span><span> </span><span>0</span><span>){</span></div></div><div><div><div>9</div></div><div><span><span>      </span></span><span>node</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>Node</span><span><span>(</span><span>value</span><span>, </span></span><span>this</span><span>.</span><span>head</span><span>);</span></div></div><div><div><div>10</div></div><div><span>      </span><span>this</span><span>.</span><span>head</span><span> </span><span>=</span><span><span> </span><span>node</span><span>;</span></span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>12</div></div><div><span><span>      </span></span><span>node</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>Node</span><span><span>(</span><span>value</span><span>, </span><span>insertPos</span><span>.</span></span><span>next</span><span>);</span></div></div><div><div><div>13</div></div><div><span><span>      </span></span><span>insertPos</span><span>.</span><span>next</span><span> </span><span>=</span><span><span> </span><span>node</span><span>;</span></span></div></div><div><div><div>14</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span>  </span><span>this</span><span>.</span><span>length</span><span>++</span><span>;</span></div></div><div><div><div>16</div></div><div><span>  </span><span>return</span><span><span> </span><span>value</span><span>;</span></span></div></div><div><div><div>17</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>
</li>
<li>
<p>有了这个List之后，就可以初始化一个list和array：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>list</span><span> </span></span><span>=</span><span> </span><span>new</span><span> </span><span>List</span><span>();</span></div></div><div><div><div>2</div></div><div><span>var</span><span><span> </span><span>arr</span><span> </span></span><span>=</span><span> [];</span></div></div><div><div><div>3</div></div><div><span>for</span><span>(</span><span>var</span><span><span> </span><span>i</span><span> </span></span><span>=</span><span> </span><span>0</span><span><span>; </span><span>i</span><span> </span></span><span>&lt;</span><span> </span><span>100</span><span><span>; </span><span>i</span></span><span>++</span><span>){</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>list</span><span>.</span><span>push</span><span><span>(</span><span>i</span><span>);</span></span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>arr</span><span>.</span><span>push</span><span><span>(</span><span>i</span><span>);</span></span></div></div><div><div><div>6</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>然后用下面的代码比较List和Array在数组起始位置插入元素的操作时间：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>count</span><span> </span></span><span>=</span><span> </span><span>10000</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>time</span><span>(</span><span>"list unshfit"</span><span>);</span></div></div><div><div><div>3</div></div><div><span>for</span><span>(</span><span>var</span><span><span> </span><span>i</span><span> </span></span><span>=</span><span> </span><span>0</span><span><span>; </span><span>i</span><span> </span></span><span>&lt;</span><span><span> </span><span>count</span><span>; </span><span>i</span></span><span>++</span><span>){</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>list</span><span>.</span><span>unshift</span><span><span>(</span><span>i</span><span>);</span></span></div></div><div><div><div>5</div></div><div><span>}</span></div></div><div><div><div>6</div></div><div><span><span>console</span><span>.</span></span><span>timeEnd</span><span>(</span><span>"list unshfit"</span><span>);</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span><span>console</span><span>.</span></span><span>time</span><span>(</span><span>"array unshfit"</span><span>);</span></div></div><div><div><div>9</div></div><div><span>for</span><span>(</span><span>var</span><span><span> </span><span>i</span><span> </span></span><span>=</span><span> </span><span>0</span><span><span>; </span><span>i</span><span> </span></span><span>&lt;</span><span><span> </span><span>count</span><span>; </span><span>i</span></span><span>++</span><span>){</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>arr</span><span>.</span><span>unshift</span><span><span>(</span><span>i</span><span>);</span></span></div></div><div><div><div>11</div></div><div><span>}</span></div></div><div><div><div>12</div></div><div><span><span>console</span><span>.</span></span><span>timeEnd</span><span>(</span><span>"array unshfit"</span><span>);</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>再比较从正中间位置插入元素的时间：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>console</span><span>.</span></span><span>time</span><span>(</span><span>"list insert middle with index"</span><span>);</span></div></div><div><div><div>2</div></div><div><span>for</span><span>(</span><span>var</span><span><span> </span><span>i</span><span> </span></span><span>=</span><span> </span><span>0</span><span><span>; </span><span>i</span><span> </span></span><span>&lt;</span><span><span> </span><span>count</span><span>; </span><span>i</span></span><span>++</span><span>){</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>insertPos</span><span> </span><span>=</span><span><span> </span><span>list</span><span>.</span></span><span>insert</span><span><span>(</span><span>list</span><span>.</span></span><span>length</span><span> </span><span>&gt;&gt;</span><span> </span><span>1</span><span><span>, </span><span>i</span><span>);</span></span></div></div><div><div><div>4</div></div><div><span>}</span></div></div><div><div><div>5</div></div><div><span><span>console</span><span>.</span></span><span>timeEnd</span><span>(</span><span>"list insert middle with index"</span><span>);</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span><span>console</span><span>.</span></span><span>time</span><span>(</span><span>"array insert middle"</span><span>);</span></div></div><div><div><div>8</div></div><div><span>for</span><span>(</span><span>var</span><span><span> </span><span>i</span><span> </span></span><span>=</span><span> </span><span>0</span><span><span>; </span><span>i</span><span> </span></span><span>&lt;</span><span><span> </span><span>count</span><span>; </span><span>i</span></span><span>++</span><span>){</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>arr</span><span>.</span><span>splice</span><span><span>(</span><span>arr</span><span>.</span></span><span>length</span><span> </span><span>&gt;&gt;</span><span> </span><span>1</span><span>, </span><span>0</span><span><span>, </span><span>i</span><span>);</span></span></div></div><div><div><div>10</div></div><div><span>}</span></div></div><div><div><div>11</div></div><div><span><span>console</span><span>.</span></span><span>timeEnd</span><span>(</span><span>"array insert middle"</span><span>);</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>运行可以得到以下表格：</p>

<table><thead><tr><th></th><th>unshift</th><th>splice(n/2)</th></tr></thead><tbody><tr><td>Array</td><td>350ms</td><td>7.99ms</td></tr><tr><td>List</td><td>8.23ms</td><td>106ms</td></tr></tbody></table>
<ul>
<li>
<p>可以看到在队首插入元素，使用线性链接List的时间将会数量级的优于Array。如果是在中间位置插入的话，由于 List的查找花费了很多时间，导致总时间明显高于Array。但是如果在插入的时候，记住上一次的位置，那么List又会明显快于Array。如下换成记录插入的位置：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>console</span><span>.</span></span><span>time</span><span>(</span><span>"list insert middle with pos"</span><span>);</span></div></div><div><div><div>2</div></div><div><span>var</span><span><span> </span><span>insertPos</span><span> </span></span><span>=</span><span><span> </span><span>list</span><span>.</span></span><span>getNode</span><span><span>(</span><span>list</span><span>.</span></span><span>length</span><span> </span><span>&gt;&gt;</span><span> </span><span>1</span><span>);</span></div></div><div><div><div>3</div></div><div><span>for</span><span>(</span><span>var</span><span><span> </span><span>i</span><span> </span></span><span>=</span><span> </span><span>0</span><span><span>; </span><span>i</span><span> </span></span><span>&lt;</span><span><span> </span><span>count</span><span>; </span><span>i</span></span><span>++</span><span>){</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>insertPos</span><span> </span><span>=</span><span><span> </span><span>list</span><span>.</span></span><span>insertFromNode</span><span><span>(</span><span>insertPos</span><span>, </span><span>i</span><span>);</span></span></div></div><div><div><div>5</div></div><div><span>}</span></div></div><div><div><div>6</div></div><div><span><span>console</span><span>.</span></span><span>timeEnd</span><span>(</span><span>"list insert middle with pos"</span><span>);</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>时间比较List又快于Array：</p>

<table><thead><tr><th></th><th>unshift</th><th>splice(n/2)</th><th>splice pos</th></tr></thead><tbody><tr><td>Array</td><td>350ms</td><td>7.99ms</td><td>8.07ms</td></tr><tr><td>List</td><td>8.23ms</td><td>106ms</td><td>1.78ms</td></tr></tbody></table>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p>综上，Array的实现用了三种语言：汇编、C++和JS，最常用的如push用了汇编实现，比较常用的如pop/splice等用了C++，较为少用的如join/sort用了JS。</p>
</li>
<li>
<p>Array为快元素即普通的数组时，增删元素操作需要不断的扩容、减容和调整元素的位置。特别是当不断地在起始位置插入元素时，和链表相比，这种时间效率还是比较低下的。如果使用的场景是要根据index删除元素，使用Array还是有优势，但是若能够很快定位到删除元素的位置，链表毫无疑问是更合适的。</p>
</li>
<li>
<p>【转载】原文地址：<a href="https://zhuanlan.zhihu.com/p/26388217?utm_source=weibo&amp;utm_medium=social" target="_blank">https://zhuanlan.zhihu.com/p/26388217?utm_source=weibo&amp;utm_medium=social</a></p>
</li>
</ul></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/%E4%BB%8EChrome%E6%BA%90%E7%A0%81%E7%9C%8BJS%20Object%E7%9A%84%E5%AE%9E%E7%8E%B0/</id>
      <title type="text">从Chrome源码看JS Object的实现</title>
      <published>2019-07-31T00:00:00.000Z</published>
      <updated>2019-07-31T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/%E4%BB%8EChrome%E6%BA%90%E7%A0%81%E7%9C%8BJS%20Object%E7%9A%84%E5%AE%9E%E7%8E%B0/"/>
      <summary type="text">从Chrome源码看JS Object的实现:V8的代码结构,JS Object类图,创建JS Object,字符串哈希cache查找,字符串哈希表查找,数字索引哈希查找,ES6 Map的实现,Object和ES6 Map的速度比较</summary>
      <content type="html"><![CDATA[<section><h3>从Chrome源码看JS Object的实现<a href="#从chrome源码看js-object的实现"><span>#</span></a></h3><blockquote><p>C/C++/Java等语言是没有这种json的数据类型的，其它一些有的：如在Pthyon里面叫做字典，在Ruby/Perl里面叫散列表，当然这只是个名称而已，本质上可以当作json类型。而C是“万物之母”，C里面没有的，就得通过某种方式实现</p></blockquote><blockquote><p>并且JS里面的Object是如何查找属性的，这个问题有人说是通过遍历key的字符串查找的，也有人说是通过哈希查找的。究竟它是怎么存储和查找的，能不能把Object当作一个map来使用？</p></blockquote><blockquote><p>Chrome自行开发了V8引擎，并被Node拿去当解析器。本文将通过V8的源码尝试分析Object的实现。</p></blockquote><section><h4>1. V8的代码结构<a href="#1-v8的代码结构"><span>#</span></a></h4><blockquote><p>v8的源码位于src/v8/src/，代码层级相对比较简单，但是实现比较复杂，为了能看懂，需要找到一个切入点，通过打断点、加log等方式确定这个切入点是对的，如果这个点并不是关键的点，进行到某一步的时候就断了，那么由这个点出发尝试去找其它的点。不断验证，最后找到一个最关键的地方，由这个地方由浅入深地扩展到其它地方，最后形成一个体系。</p></blockquote></section><section><h4>2. JS Object类图<a href="#2-js-object类图"><span>#</span></a></h4><blockquote><p>V8里面所有的数据类型的根父类都是Object，Object派生HeapObject，提供存储基本功能，往下的JSReceiver用于原型查找，再往下的JSObject就是JS里面的Object，Array/Function/Date等继承于JSObject。左边的FixedArray是实际存储数据的地方。</p></blockquote></section><section><h4>3. 创建JS Object<a href="#3-创建js-object"><span>#</span></a></h4><blockquote><p>在创建一个JSObject之前，会先把读到的Object的文本属性序列化成constant_properties，如下的data：</p></blockquote><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>data</span><span> </span></span><span>=</span><span> {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>name</span><span>:</span><span> </span><span>"yin"</span><span>,</span></div></div><div><div><div>3</div></div><div><span>  </span><span>age</span><span>:</span><span> </span><span>18</span><span>,</span></div></div><div><div><div>4</div></div><div><span>  </span><span>"-school-"</span><span>:</span><span> </span><span>"high school"</span></div></div><div><div><div>5</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>会被序列成：</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>..</span><span>/</span><span>..</span><span>/</span><span>v8</span><span>/</span><span>src</span><span>/</span><span>runtime</span><span>/</span><span>runtime</span><span>-</span><span><span>literals</span><span>.</span></span><span>cc</span><span> </span><span>72</span><span><span> </span><span>constant_properties</span><span>: </span></span><span>0xdf9ed2aed19</span><span><span>: [</span><span>FixedArray</span><span>]</span></span></div></div><div><div><div>2</div></div><div><span><span>– </span><span>length</span><span>: </span></span><span>6</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>[</span><span>0</span><span>]: </span><span>0x1b5ec69833d1</span><span> </span><span>&lt;</span><span><span>String</span><span>[</span></span><span>4</span><span><span>]: </span><span>name</span></span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>[</span><span>1</span><span>]: </span><span>0xdf9ed2aec51</span><span> </span><span>&lt;</span><span><span>String</span><span>[</span></span><span>3</span><span><span>]: </span><span>yin</span></span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>[</span><span>2</span><span>]: </span><span>0xdf9ed2aec71</span><span> </span><span>&lt;</span><span><span>String</span><span>[</span></span><span>3</span><span><span>]: </span><span>age</span></span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>[</span><span>3</span><span>]: </span><span>18</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>[</span><span>4</span><span>]: </span><span>0xdf9ed2aec91</span><span> </span><span>&lt;</span><span><span>String</span><span>[</span></span><span>8</span><span>]: </span><span>-</span><span>school</span><span>-&gt;</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>[</span><span>5</span><span>]: </span><span>0xdf9ed2aecb1</span><span> </span><span>&lt;</span><span><span>String</span><span>[</span></span><span>11</span><span><span>]: </span><span>high</span><span> </span><span>school</span></span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p>它是一个FixedArray，一共有6个元素，由于data总共是有3个属性，每个属性有一个key和一个value，所以Array就有6个。第一个元素是第一个key，第二个元素是第一个value，第三个元素是第二个key，第四个元素是第二个key，依次类推。Object提供了一个Print()的函数，把它用来打印对象的信息非常有帮助。上面的输出有两种类型的数据，一种是String类型，第二种是整型类型的。</p>
</li>
<li>
<p>FixedArray是V8实现的一个类似于数组的类，它表示一段连续的内存，上面的FixedArray的length = 6，那么它占的内存大小将是：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>length</span><span> </span></span><span>*</span><span><span> </span><span>kPointerSize</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>因为它存的都是对象的指针（或者直接是整型数据类型，如上面的18），在64位的操作系统上，一个指针为8个字节，它的大小将是48个字节。它记录了一个初始的内存开始地址，使用元素index乘以指针大小作为偏移，加上开始地址，就可以取到相应index的元素，这和数组是一样的道理。只是V8自己封装了一个，方便添加一些自定义的函数。</p>
</li>
<li>
<p>FixedArray主要用于表示数据的存储位置，在它上面还有一个Map，这个Map用于表示数据的结构。这里的Map并不是哈希的意思，更接近于地图的意义，用来操作FixedArray表示的这段内存。V8根据constant_properties的length，去开辟相应大小空间的Map：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Handle</span><span>&lt;</span><span>Map</span><span>&gt;</span><span><span> </span><span>map</span><span> </span></span><span>=</span><span> </span><span>ComputeObjectLiteralMap</span><span><span>(</span><span>context</span><span>, </span><span>constant_properties</span><span>, </span></span><span>&amp;</span><span><span>is_result_from_cache</span><span>);</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>把这个申请后的Map打印出来：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>..</span><span>/</span><span>..</span><span>/</span><span>v8</span><span>/</span><span>src</span><span>/</span><span>heap</span><span>/</span><span><span>heap</span><span>.</span></span><span>cc</span><span> </span><span>3472</span><span><span> </span><span>map</span><span> </span><span>is</span><span> </span></span><span>0x21528af9cb39</span><span><span>: [</span><span>Map</span><span>]</span></span></div></div><div><div><div>2</div></div><div><span><span>– </span><span>type</span><span>: </span></span><span>JS_OBJECT_TYPE</span></div></div><div><div><div>3</div></div><div><span><span>– </span><span>instance</span><span> </span><span>size</span><span>: </span></span><span>48</span></div></div><div><div><div>4</div></div><div><span><span>– </span><span>inobject</span><span> </span><span>properties</span><span>: </span></span><span>3</span></div></div><div><div><div>5</div></div><div><span><span>– </span><span>back</span><span> </span><span>pointer</span><span>: </span></span><span>0x3e2ca8902311</span><span> </span><span>&lt;</span><span>undefined</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>– </span><span>instance</span><span> </span></span><span>descriptors</span><span><span> (</span><span>own</span><span>) #</span></span><span>0</span><span>: </span><span>0x3e2ca8902231</span><span> </span><span>&lt;</span><span><span>FixedArray</span><span>[</span></span><span>0</span><span>]</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>从第4行可以看到，它的大小确实和我们算的一样。并且它还有一个叫做descriptors表示它的数据结构。descriptor记录了每个key-value对，以及它们在FixedArray里面的index. 后续对properties的操作基本上通过descriptor进行。</li>
<li>有了这个map的对象之后，用它来创建一个JSObect：</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Handle</span><span>&lt;</span><span>JSObject</span><span>&gt;</span><span><span> </span><span>boilerplate</span><span> </span></span><span>=</span><span><span> </span><span>isolate</span></span><span>-&gt;</span><span>factory</span><span>()</span><span>-&gt;</span><span>NewJSObjectFromMap</span><span><span>(</span><span>map</span><span>, </span><span>pretenure_flag</span><span>);</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>重新开辟一段内存，把map的内容拷过去。</p>
</li>
<li>
<p>由于map只是一段相应大小的内存空间，它的内容是空的，所以接下来要设置它的properties：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>for</span><span><span> (</span><span>int</span><span> </span><span>index</span><span> </span></span><span>=</span><span> </span><span>0</span><span><span>; </span><span>index</span><span> </span></span><span>&lt;</span><span><span> </span><span>length</span><span>; </span><span>index</span><span> </span></span><span>+=</span><span> </span><span>2</span><span>) {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>Handle</span><span>&lt;</span><span>Object</span><span>&gt;</span><span> </span><span>key</span><span><span>(</span><span>constant_properties</span></span><span>-&gt;</span><span>get</span><span><span>(</span><span>index</span><span> </span></span><span>+</span><span> </span><span>0</span><span>));</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>Handle</span><span>&lt;</span><span>Object</span><span>&gt;</span><span> </span><span>value</span><span><span>(</span><span>constant_properties</span></span><span>-&gt;</span><span>get</span><span><span>(</span><span>index</span><span> </span></span><span>+</span><span> </span><span>1</span><span>));</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>Handle</span><span>&lt;</span><span>String</span><span>&gt;</span><span><span> </span><span>name</span><span> </span></span><span>=</span><span><span> </span><span>Handle</span></span><span>&lt;</span><span>String</span><span>&gt;</span><span>::</span><span>cast</span><span><span>(</span><span>key</span><span>);</span></span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>JSObject</span><span>::</span><span>SetOwnPropertyIgnoreAttributes</span><span><span>(</span><span>boilerplate</span><span>, </span><span>name</span><span>, </span><span>value</span><span>, </span></span><span>NONE</span><span>);</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>通过上面的代码，把properties设置到map的FixedArray里面，并且可以通过index用descriptors迅速地取出key-value。由于这个过程比较复杂，细节不展开讨论。</li>
<li>在设置properties的同时，会初始化一个searchCache，这个cache支持哈希查找某个属性。</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul></section><section><h4>4. 字符串哈希cache查找<a href="#4-字符串哈希cache查找"><span>#</span></a></h4><blockquote><p>在设置cache的时候，会先进行查找是否已存在相同的属性名，如果已经有了就把它的value值覆盖掉，否则把它添加到cache里面：</p></blockquote><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>int</span><span> </span><span>DescriptorArray</span><span>::</span></span><span>SearchWithCache</span><span><span>(</span><span>Isolate</span></span><span>*</span><span><span> </span><span>isolate</span><span>, </span><span>Name</span></span><span>*</span><span><span> </span><span>name</span><span>, </span><span>Map</span></span><span>*</span><span><span> </span><span>map</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>DescriptorLookupCache</span><span>*</span><span><span> </span><span>cache</span><span> </span></span><span>=</span><span><span> </span><span>isolate</span></span><span>-&gt;</span><span>descriptor_lookup_cache</span><span>();</span></div></div><div><div><div>3</div></div><div><span>  </span><span>//找到它的index</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>int</span><span> </span><span>number</span><span> </span><span>=</span><span><span> </span><span>cache</span></span><span>-&gt;</span><span>Lookup</span><span><span>(</span><span>map</span><span>, </span><span>name</span><span>);</span></span></div></div><div><div><div>5</div></div><div><span>  </span><span>//如果没有的话</span></div></div><div><div><div>6</div></div><div><span>  </span><span>if</span><span><span> (</span><span>number</span><span> </span></span><span>==</span><span><span> </span><span>DescriptorLookupCache</span><span>::</span><span>kAbsent</span><span>) {</span></span></div></div><div><div><div>7</div></div><div><span>    </span><span>//通过遍历找到它的index</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>number</span><span> </span><span>=</span><span> </span><span>Search</span><span><span>(</span><span>name</span><span>, </span><span>number_of_own_descriptors</span><span>);</span></span></div></div><div><div><div>9</div></div><div><span>    </span><span>//更新cache</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>cache</span><span>-&gt;</span><span>Update</span><span><span>(</span><span>map</span><span>, </span><span>name</span><span>, </span><span>number</span><span>);</span></span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span>  </span><span>return</span><span><span> </span><span>number</span><span>;</span></span></div></div><div><div><div>13</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p>如上代码的注释，我们先来看一下这个Search函数是怎么进行的：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>template</span><span> </span></span><span>&lt;</span><span><span>SearchMode</span><span> </span><span>search_mode</span><span>, </span><span>typename</span><span> </span></span><span>T</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>int</span><span> </span></span><span>Search</span><span>(</span><span>T</span><span>*</span><span><span> </span><span>array</span><span>, </span><span>Name</span></span><span>*</span><span><span> </span><span>name</span><span>, </span><span>int</span><span> </span><span>valid_entries</span><span>, </span><span>int</span></span><span>*</span><span><span> </span><span>out_insertion_index</span><span>) {</span></span></div></div><div><div><div>3</div></div><div><span>  </span><span>// Fast case: do linear search for small arrays.</span></div></div><div><div><div>4</div></div><div><span>  </span><span>const</span><span> </span><span>int</span><span> kMaxElementsForLinearSearch </span><span>=</span><span> </span><span>8</span><span>;</span></div></div><div><div><div>5</div></div><div><span>  </span><span>if</span><span><span> (</span><span>valid_entries</span><span> </span></span><span>&lt;=</span><span><span> </span><span>kMaxElementsForLinearSearch</span><span>) {</span></span></div></div><div><div><div>6</div></div><div><span>    </span><span>return</span><span> </span><span>LinearSearch</span><span>&lt;</span><span>search_mode</span><span><span>&gt;(</span><span>array</span><span>, </span><span>name</span><span>, </span><span>valid_entries</span><span>, </span><span>out_insertion_index</span><span>);</span></span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>  </span><span>// Slow case: perform binary search.</span></div></div><div><div><div>10</div></div><div><span>  </span><span>return</span><span> </span><span>BinarySearch</span><span>&lt;</span><span>search_mode</span><span><span>&gt;(</span><span>array</span><span>, </span><span>name</span><span>, </span><span>valid_entries</span><span>, </span><span>out_insertion_index</span><span>);</span></span></div></div><div><div><div>11</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>如果属性少于等于8个时，则直接线性查找即依次遍历，否则进行二分查找，在线性查找里面判断是否相等，是用的内存地址比较：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>for</span><span><span> (</span><span>int</span><span> </span><span>number</span><span> </span></span><span>=</span><span> </span><span>0</span><span><span>; </span><span>number</span><span> </span></span><span>&lt;</span><span><span> </span><span>valid_entries</span><span>; </span><span>number</span></span><span>++</span><span>) {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>if</span><span><span> (</span><span>array</span></span><span>-&gt;</span><span>GetKey</span><span><span>(</span><span>number</span><span>) </span></span><span>==</span><span><span> </span><span>name</span><span>) </span></span><span>return</span><span><span> </span><span>number</span><span>;</span></span></div></div><div><div><div>3</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>因为name都是用的上面第三点设置Map的时候传进来的name，因此初始化的时候相同的name都指向同一个对象。所以可以直接用内存地址进行比较，得到FixedArray的索引number。然后用key和number去update cache：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>cache</span><span>-&gt;</span><span>Update</span><span><span>(</span><span>map</span><span>, </span><span>name</span><span>, </span><span>number</span><span>);</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>重点在于这个update cache。这个cache的数据结构是这样的：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>  </span></span><span>static</span><span> </span><span>const</span><span> </span><span>int</span><span> kLength </span><span>=</span><span> </span><span>64</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>struct</span><span> </span><span>Key</span><span> {</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>Map</span><span>*</span><span><span> </span><span>source</span><span>;</span></span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>Name</span><span>*</span><span><span> </span><span>name</span><span>;</span></span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>};</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>Key</span><span> </span><span>keys_</span><span>[</span><span>kLength</span><span>];</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>int</span><span> </span><span>results_</span><span>[</span><span>kLength</span><span>];</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>它有一个数组keys_的成员变量存放key，这个数组的大小是64，数组的索引用哈希算出来，不同的key有不同的哈希，这个哈希就是它在数组里面的索引。它还有一个results_，存放上面线性查找出来的number，这个number就是内存里面的偏移，有了这个偏移就可以很快地定位到它的内容，所以放到results里面.</p>
</li>
<li>
<p>关键在于这个哈希是怎么算的。来看一下update的函数：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>void</span><span><span> </span><span>DescriptorLookupCache</span><span>::</span></span><span>Update</span><span><span>(</span><span>Map</span></span><span>*</span><span><span> </span><span>source</span><span>, </span><span>Name</span></span><span>*</span><span><span> </span><span>name</span><span>, </span><span>int</span><span> </span><span>result</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>int</span><span> </span><span>index</span><span> </span><span>=</span><span> </span><span>Hash</span><span><span>(</span><span>source</span><span>, </span><span>name</span><span>);</span></span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>Key</span><span>&amp;</span><span><span> </span><span>key</span><span> </span></span><span>=</span><span><span> </span><span>keys_</span><span>[</span><span>index</span><span>];</span></span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>key</span><span>.</span><span>source</span><span> </span><span>=</span><span><span> </span><span>source</span><span>;</span></span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>key</span><span>.</span><span>name</span><span> </span><span>=</span><span><span> </span><span>name</span><span>;</span></span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>results_</span><span>[</span><span>index</span><span>] </span><span>=</span><span><span> </span><span>result</span><span>;</span></span></div></div><div><div><div>7</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>先计算哈希索引index，然后把数据存到results_和keys_这两个数组的index位置。这个Hash函数是这样的：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>int</span><span> </span><span>DescriptorLookupCache</span><span>::</span></span><span>Hash</span><span><span>(</span><span>Object</span></span><span>*</span><span><span> </span><span>source</span><span>, </span><span>Name</span></span><span>*</span><span><span> </span><span>name</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span>  </span><span>// Uses only lower 32 bits if pointers are larger.</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>uint32_t</span><span> </span><span>source_hash</span><span> </span><span>=</span></div></div><div><div><div>4</div></div><div><span>      </span><span>static_cast</span><span>&lt;</span><span>uint32_t</span><span>&gt;(</span><span>reinterpret_cast</span><span>&lt;</span><span>uintptr_t</span><span><span>&gt;(</span><span>source</span><span>)) </span></span><span>&gt;&gt;</span></div></div><div><div><div>5</div></div><div><span><span>      </span></span><span>kPointerSizeLog2</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>uint32_t</span><span> </span><span>name_hash</span><span> </span><span>=</span><span><span> </span><span>name</span></span><span>-&gt;</span><span>hash_field</span><span>();</span></div></div><div><div><div>7</div></div><div><span>  </span><span>return</span><span><span> (</span><span>source_hash</span><span> </span></span><span>^</span><span><span> </span><span>name_hash</span><span>) </span></span><span>%</span><span><span> </span><span>kLength</span><span>;</span></span></div></div><div><div><div>8</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>先计算map和key的hash，map的hash即source_hash是用map的地址的低32位，为了统一不同指针大小的区别，而计算key的hash即name_hash，最核心的代码应该是以下几行：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>uint32_t</span><span> </span><span>StringHasher</span><span>::</span></span><span>AddCharacterCore</span><span><span>(</span><span>uint32_t</span><span> </span><span>running_hash</span><span>, </span><span>uint16_t</span><span> </span><span>c</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>running_hash</span><span> </span><span>+=</span><span><span> </span><span>c</span><span>;</span></span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>running_hash</span><span> </span><span>+=</span><span><span> (</span><span>running_hash</span><span> </span></span><span>&lt;&lt;</span><span> </span><span>10</span><span>);</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>running_hash</span><span> </span><span>^=</span><span><span> (</span><span>running_hash</span><span> </span></span><span>&gt;&gt;</span><span> </span><span>6</span><span>);</span></div></div><div><div><div>5</div></div><div><span>  </span><span>return</span><span><span> </span><span>running_hash</span><span>;</span></span></div></div><div><div><div>6</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>依次循环name的每个字符串做一些位运算，结果累计给running_hash.</p>
</li>
<li>
<p>source_hash是用map的内存地址，因为这个地址是唯一的，而name_hash是用的字符串的内容，只要字符串一样，那么它的hash值就一定一样，这样保证了同一个object，它的同个key值的索引值就一定一样。source_hash和name_hash最后异或一下，模以kLength = 64得到它在数组里面的索引。</p>
</li>
<li>
<p>这里自然而然会有一个问题，通过这样的计算不能够保证不同的name计算出来的哈希值一定不一样，好的哈希算法只能让结果尽可能随机，但是无法做到一定不重复，所以这里也有同样的问题。</p>
</li>
<li>
<p>先来看一下，它是怎么查找的：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>int</span><span> </span><span>DescriptorLookupCache</span><span>::</span></span><span>Lookup</span><span><span>(</span><span>Map</span></span><span>*</span><span><span> </span><span>source</span><span>, </span><span>Name</span></span><span>*</span><span><span> </span><span>name</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>int</span><span> </span><span>index</span><span> </span><span>=</span><span> </span><span>Hash</span><span><span>(</span><span>source</span><span>, </span><span>name</span><span>);</span></span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>Key</span><span>&amp;</span><span><span> </span><span>key</span><span> </span></span><span>=</span><span><span> </span><span>keys_</span><span>[</span><span>index</span><span>];</span></span></div></div><div><div><div>4</div></div><div><span>  </span><span>if</span><span><span> ((</span><span>key</span><span>.</span></span><span>source</span><span> </span><span>==</span><span><span> </span><span>source</span><span>) </span></span><span>&amp;&amp;</span><span><span> (</span><span>key</span><span>.</span></span><span>name</span><span> </span><span>==</span><span><span> </span><span>name</span><span>)) </span></span><span>return</span><span><span> </span><span>results_</span><span>[</span><span>index</span><span>];</span></span></div></div><div><div><div>5</div></div><div><span>  </span><span>return</span><span><span> </span><span>kAbsent</span><span>;</span></span></div></div><div><div><div>6</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>先用同样的哈希算法，算出同样的index，取出key里面的map和name，和存储的map和name进行比较，如果相同则说明找到了，否则的话返回不存在-1的标志。一旦不存在了又会执行上面的update cache，先调Search找到它的偏移index作为result，如果index存在重新update cache。所以上面的问题就可以得到解答了，重复的哈希索引覆盖了第一个，导致查找第一个的时候没找找到，所以又去重新update，把那个索引值的数组元素又改成了第一个的。因此，如果两个重复的元素如果循环轮流访问的话，就会造成不断地查找index，不断地更新搜索cache。但是这种情况还是比较少的。</p>
</li>
<li>
<p>如何保证传进来的具有相同字符串的name和原始的name是同一个对象，从而才能使它们的内存地址一样？一个办法是维护一个Name的数据池，据有相同字符串的name只能存在一个。</p>
</li>
<li>
<p>上面的那个data它的三个name的index在笔者电脑上实验计算结果为：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>#</span><span>name</span><span> </span><span>hash</span><span> </span><span>index</span><span> </span></span><span>=</span><span> </span><span>62</span></div></div><div><div><div>2</div></div><div><span><span>#</span><span>age</span><span> </span><span>hash</span><span> </span><span>index</span><span> </span></span><span>=</span><span> </span><span>32</span></div></div><div><div><div>3</div></div><div><span>#</span><span>-</span><span>school</span><span>-</span><span><span> </span><span>hash</span><span> </span><span>index</span><span> </span></span><span>=</span><span> </span><span>51</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>有一个比较奇怪的地方是重复实验，它们的哈希值都是一样的。并且具有相同属性且顺序也相同的object，它们的map地址就是一样的。</p>
</li>
<li>
<p>如果一个元素的属性值超过64个呢？那也是同样的处理，后面设置的会覆盖前面设置的。学过哈希的都知道，当元素的个数大于容器容量的一半时，重复的概率将会大大增加。所以一个object的属性的比较优的最大大小为32。一旦超过32，在一个：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>for</span><span>(</span><span>var</span><span><span> </span><span>key</span><span> </span></span><span>in</span><span><span> </span><span>obj</span><span>){</span></span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>obj</span><span>[</span><span>key</span><span>] </span><span>//do sth.</span></div></div><div><div><div>3</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>for循环里面，这种查找的开销将会很大。但是考虑到属性个数并不多。</p>
</li>
<li>
<p>那为什么它要把长度设置成64呢，如果改大了，不就可以减少重复率？但是这样会造成更多的内存消耗，即使一个Object只有一个属性，它也会初始化一个这么大的数组，对于这种属性比较少的object来说就很浪费。所以取64，应该是一个比较适中的值。</p>
</li>
<li>
<p>同时另一方面，经常使用的那几个属性还是能够很快通过哈希计算定位到它的内容。并且这种场景还是很常见的，如获取数组元素的lengh.</p>
</li>
<li>
<p>这种cache查找只支持属性个数小于等于128的，如果属性个数大于128个，将不采用cache存储和查找的方式。而是直接使用一个hashtable</p>
</li>
</ul></section><section><h4>5. 字符串哈希表查找<a href="#5-字符串哈希表查找"><span>#</span></a></h4><blockquote><p>如下的判断：</p></blockquote><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>const</span><span> </span><span>int</span><span> kMapCacheSize </span><span>=</span><span> </span><span>128</span><span>;</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>// We do not cache maps for too many properties or when running builtin code.</span></div></div><div><div><div>4</div></div><div><span>if</span><span><span> (</span><span>number_of_properties</span><span> </span></span><span>&gt;</span><span><span> </span><span>kMapCacheSize</span><span>) {</span></span></div></div><div><div><div>5</div></div><div><span>  </span><span>*</span><span><span>is_result_from_cache</span><span> </span></span><span>=</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>Handle</span><span>&lt;</span><span>Map</span><span>&gt;</span><span><span> </span><span>map</span><span> </span></span><span>=</span><span><span> </span><span>Map</span><span>::</span></span><span>Create</span><span>(</span><span>isolate</span><span><span>(), </span><span>number_of_properties</span><span>);</span></span></div></div><div><div><div>7</div></div><div><span>  </span><span>return</span><span><span> </span><span>map</span><span>;</span></span></div></div><div><div><div>8</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p>如果属性个数大于128时，将按照属性的个数消耗的空间创建和扩展map存储，不再创建cache。同时这个map就会被标记为dictionary_map，即哈希表。</p>
</li>
<li>
<p>往这个哈希表插入一个元素前，会先检查表的容量是否足够，不够进行扩容，在EnsureCapacity的函数里面：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>int</span><span> </span><span>capacity</span><span> </span></span><span>=</span><span><span> </span><span>table</span></span><span>-&gt;</span><span>Capacity</span><span>();</span></div></div><div><div><div>2</div></div><div><span><span>int</span><span> </span><span>nof</span><span> </span></span><span>=</span><span><span> </span><span>table</span></span><span>-&gt;</span><span>NumberOfElements</span><span>() </span><span>+</span><span><span> </span><span>n</span><span>;</span></span></div></div><div><div><div>3</div></div><div><span>if</span><span><span> (</span><span>table</span></span><span>-&gt;</span><span>HasSufficientCapacityToAdd</span><span><span>(</span><span>n</span><span>)) </span></span><span>return</span><span><span> </span><span>table</span><span>;</span></span></div></div><div><div><div>4</div></div><div><span>Handle</span><span>&lt;</span><span>Derived</span><span>&gt;</span><span><span> </span><span>new_table</span><span> </span></span><span>=</span><span><span> </span><span>HashTable</span><span>::</span></span><span>New</span><span><span>(</span><span>nof</span><span> </span></span><span>*</span><span> </span><span>2</span><span>, </span><span>USE_DEFAULT_MINIMUM_CAPACITY</span><span>);</span></div></div><div><div><div>5</div></div><div><span>table</span><span>-&gt;</span><span>Rehash</span><span><span>(</span><span>new_table</span><span>, </span><span>key</span><span>);</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>第二行获取到当前表元素个数加上需要插入的元素的个数得到新表的总元素个数；第7行再乘以2，得到新表的容量，最后再rehash，重新计算每个元素的哈希值，更新哈希表</p>
</li>
<li>
<p>插入一个元素的关键是计算它的哈希，这里计算哈希的方式和上面的一样，都是调的name-&gt;hash_field函数，不一样的是它不再是覆盖存储，因为上面已经进行扩容了，可以保证空间一定足够。如果哈希值冲突了，那么将一直找到下一个存放它的地方，如下面的FindInsertionEntry函数：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>template</span><span>&lt;</span><span><span>typename</span><span> </span><span>Derived</span><span>, </span><span>typename</span><span> </span><span>Shape</span><span>, </span><span>typename</span><span> </span><span>Key</span></span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>uint32_t</span><span> </span><span>HashTable</span></span><span>&lt;</span><span><span>Derived</span><span>, </span><span>Shape</span><span>, </span><span>Key</span></span><span>&gt;</span><span>::</span><span>FindInsertionEntry</span><span><span>(</span><span>uint32_t</span><span> </span><span>hash</span><span>) {</span></span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>uint32_t</span><span> </span><span>capacity</span><span> </span><span>=</span><span> </span><span>Capacity</span><span>();</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>uint32_t</span><span> </span><span>entry</span><span> </span><span>=</span><span> </span><span>FirstProbe</span><span><span>(</span><span>hash</span><span>, </span><span>capacity</span><span>);</span></span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>uint32_t</span><span> </span><span>count</span><span> </span><span>=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>6</div></div><div><span>  </span><span>// EnsureCapacity will guarantee the hash table is never full.</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>Isolate</span><span>*</span><span><span> </span><span>isolate</span><span> </span></span><span>=</span><span> </span><span>GetIsolate</span><span>();</span></div></div><div><div><div>8</div></div><div><span>  </span><span>while</span><span> (</span><span>true</span><span>) {</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>Object</span><span>*</span><span><span> </span><span>element</span><span> </span></span><span>=</span><span> </span><span>KeyAt</span><span><span>(</span><span>entry</span><span>);</span></span></div></div><div><div><div>10</div></div><div><span>    </span><span>if</span><span> (</span><span>!</span><span>IsKey</span><span><span>(</span><span>isolate</span><span>, </span><span>element</span><span>)) </span></span><span>break</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>entry</span><span> </span><span>=</span><span> </span><span>NextProbe</span><span><span>(</span><span>entry</span><span>, </span><span>count</span></span><span>++</span><span><span>, </span><span>capacity</span><span>);</span></span></div></div><div><div><div>12</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span>  </span><span>return</span><span><span> </span><span>entry</span><span>;</span></span></div></div><div><div><div>14</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>在上面代码第10行找到一个非key元素后，停止循环，返回这个位置。</p>
</li>
<li>
<p>在所有属性插入完成之后，查找的过程类似于上面的插入，如下面FindEntry的函数：</p>
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// Find entry for key otherwise return kNotFound.</span></div></div><div><div><div>2</div></div><div><span><span>template</span><span> </span></span><span>&lt;</span><span><span>typename</span><span> </span><span>Derived</span><span>, </span><span>typename</span><span> </span><span>Shape</span></span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>int</span><span> </span><span>NameDictionaryBase</span></span><span>&lt;</span><span><span>Derived</span><span>, </span><span>Shape</span></span><span>&gt;</span><span>::</span><span>FindEntry</span><span><span>(</span><span>Handle</span></span><span>&lt;</span><span>Name</span><span>&gt;</span><span><span> </span><span>key</span><span>) {</span></span></div></div><div><div><div>4</div></div><div><span>  </span><span>// EnsureCapacity will guarantee the hash table is never full.</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>uint32_t</span><span> </span><span>capacity</span><span> </span><span>=</span><span> </span><span>this</span><span>-&gt;</span><span>Capacity</span><span>();</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>uint32_t</span><span> </span><span>entry</span><span> </span><span>=</span><span><span> </span><span>Derived</span><span>::</span></span><span>FirstProbe</span><span><span>(</span><span>key</span></span><span>-&gt;</span><span>Hash</span><span><span>(), </span><span>capacity</span><span>);</span></span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>uint32_t</span><span> </span><span>count</span><span> </span><span>=</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>8</div></div><div><span>  </span><span>while</span><span> (</span><span>true</span><span>) {</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>Object</span><span>*</span><span><span> </span><span>element</span><span> </span></span><span>=</span><span> </span><span>this</span><span>-&gt;</span><span>KeyAt</span><span><span>(</span><span>entry</span><span>);</span></span></div></div><div><div><div>10</div></div><div><span>    </span><span>if</span><span><span> (</span><span>element</span></span><span>-&gt;</span><span>IsUndefined</span><span><span>(</span><span>isolate</span><span>)) </span></span><span>break</span><span>; </span><span>// Empty entry.</span></div></div><div><div><div>11</div></div><div><span>    </span><span>if</span><span> (</span><span>*</span><span><span>key</span><span> </span></span><span>==</span><span><span> </span><span>element</span><span>) </span></span><span>return</span><span><span> </span><span>entry</span><span>;</span></span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>entry</span><span> </span><span>=</span><span><span> </span><span>Derived</span><span>::</span></span><span>NextProbe</span><span><span>(</span><span>entry</span><span>, </span><span>count</span></span><span>++</span><span><span>, </span><span>capacity</span><span>);</span></span></div></div><div><div><div>13</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span>  </span><span>return</span><span><span> </span><span>Derived</span><span>::</span><span>kNotFound</span><span>;</span></span></div></div><div><div><div>15</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>
<ul>
<li>
<p>在while循环里，要么找到一个undefined的元素，返回无结果的标志，要么命中元素，返回FixedArray的索引index，然后通过这个数组index就可以很快地取出数据：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>property_details_</span><span> </span></span><span>=</span><span><span> </span><span>dictionary</span></span><span>-&gt;</span><span>DetailsAt</span><span><span>(</span><span>entry</span><span>);</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>当哈希值冲突时，如何找到下一个插入位置，在哈希算法里面也是一个很重要的部分，因为需要定位到下一个空的元素，才能进行插入，如果定位到的下一个元素又是非空的，又得继续找下一个。源码里面是这样进行的：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>  </span></span><span>inline</span><span> </span><span>static</span><span> </span><span>uint32_t</span><span> </span><span>FirstProbe</span><span><span>(</span><span>uint32_t</span><span> </span><span>hash</span><span>, </span><span>uint32_t</span><span> </span><span>size</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span>    </span><span>return</span><span><span> </span><span>hash</span><span> </span></span><span>&amp;</span><span><span> (</span><span>size</span><span> </span></span><span>-</span><span> </span><span>1</span><span>);</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>inline</span><span> </span><span>static</span><span> </span><span>uint32_t</span><span> </span><span>NextProbe</span><span><span>(</span><span>uint32_t</span><span> </span><span>last</span><span>, </span><span>uint32_t</span><span> </span><span>number</span><span>, </span><span>uint32_t</span><span> </span><span>size</span><span>) {</span></span></div></div><div><div><div>6</div></div><div><span>    </span><span>return</span><span><span> (</span><span>last</span><span> </span></span><span>+</span><span><span> </span><span>number</span><span>) </span></span><span>&amp;</span><span><span> (</span><span>size</span><span> </span></span><span>-</span><span> </span><span>1</span><span>);</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>所以当属性个数不超过128个时，是用searchCache，大于128时，采用哈希表。源码里面查找的判断是这样的：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>if</span><span> (</span><span>!</span><span>map</span><span>-&gt;</span><span>is_dictionary_map</span><span>()) {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>DescriptorArray</span><span>*</span><span><span> </span><span>descriptors</span><span> </span></span><span>=</span><span><span> </span><span>map</span></span><span>-&gt;</span><span>instance_descriptors</span><span>();</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>int</span><span> </span><span>number</span><span> </span><span>=</span><span><span> </span><span>descriptors</span></span><span>-&gt;</span><span>SearchWithCache</span><span><span>(</span><span>isolate_</span><span>, </span></span><span>*</span><span><span>name_</span><span>, </span><span>map</span><span>);</span></span></div></div><div><div><div>4</div></div><div><span>  </span><span>//...</span></div></div><div><div><div>5</div></div><div><span>} </span><span>else</span><span> {</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>NameDictionary</span><span>*</span><span><span> </span><span>dict</span><span> </span></span><span>=</span><span><span> </span><span>holder</span></span><span>-&gt;</span><span>property_dictionary</span><span>();</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>int</span><span> </span><span>number</span><span> </span><span>=</span><span><span> </span><span>dict</span></span><span>-&gt;</span><span>FindEntry</span><span><span>(</span><span>name_</span><span>);</span></span></div></div><div><div><div>8</div></div><div><span>  </span><span>//...</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>如果是一个字典，则执行else里面的逻辑，否则执行if里面的逻辑按searchCache查找。</p>
</li>
<li>
<p>这里自然而然会有一个问题，为什么在不大于128个属性的时候要专门搞一个searchCache呢，是因为searchCache比哈希表快么，快在哪里？我想这两者的区别在于searchCache不会冲突，每次都是直接定位，而hashTable如果冲突了需要不断地找下一个元素，增加了比较次数。当属性比较少，并且有几个属性经常被用到的时候，searchCache应该会有明显的优势。</p>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p>上面已经介绍了两种字符串的查找方式，当属性是数字的时候有另外两种查找方式。</p>
</li>
</ul></section><section><h4>6. 数字索引哈希查找<a href="#6-数字索引哈希查找"><span>#</span></a></h4><blockquote><p>假设data变成：</p></blockquote><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>data</span><span> </span></span><span>=</span><span> {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>name</span><span>:</span><span> </span><span>"yin"</span><span>,</span></div></div><div><div><div>3</div></div><div><span>  </span><span>age</span><span>:</span><span> </span><span>18</span><span>,</span></div></div><div><div><div>4</div></div><div><span>  </span><span>"-school-"</span><span>:</span><span> </span><span>"high school"</span><span>,</span></div></div><div><div><div>5</div></div><div><span>  </span><span>1</span><span>:</span><span> </span><span>"Monday"</span><span>,</span></div></div><div><div><div>6</div></div><div><span>  </span><span>2</span><span>:</span><span> </span><span>"Thuesday"</span><span>,</span></div></div><div><div><div>7</div></div><div><span>  </span><span>"3"</span><span>:</span><span> </span><span>"Wednesday"</span></div></div><div><div><div>8</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p>把生成的data Object打印出来是这样的：</p>
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>..</span><span>/</span><span>..</span><span>/</span><span>v8</span><span>/</span><span>src</span><span>/</span><span>runtime</span><span>/</span><span>runtime</span><span>-</span><span><span>literals</span><span>.</span></span><span>cc</span><span> </span><span>105</span><span><span> </span><span>boilerplate</span><span> </span><span>obj</span><span>: </span></span><span>0x3930221af3a9</span><span>: [</span><span>JS_OBJECT_TYPE</span><span>]</span></div></div><div><div><div>2</div></div><div><span><span>– </span><span>map</span><span> </span></span><span>=</span><span> </span><span>0x6712e19cc41</span><span><span> [</span><span>FastProperties</span><span>]</span></span></div></div><div><div><div>3</div></div><div><span><span>– </span><span>prototype</span><span> </span></span><span>=</span><span> </span><span>0x27d71d20f19</span></div></div><div><div><div>4</div></div><div><span><span>– </span><span>elements</span><span> </span></span><span>=</span><span> </span><span>0x2e1e1a56b579</span><span> </span><span>&lt;</span><span><span>FixedArray</span><span>[</span></span><span>19</span><span>]</span><span>&gt;</span><span> [</span><span>FAST_HOLEY_ELEMENTS</span><span>]</span></div></div><div><div><div>5</div></div><div><span><span>– </span><span>properties</span><span> </span></span><span>=</span><span> </span><span>0x2c2a4d782241</span><span> </span><span>&lt;</span><span><span>FixedArray</span><span>[</span></span><span>0</span><span>]</span><span>&gt;</span><span> {</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>#</span><span>name</span><span>:</span><span> </span><span>0x3930221aec51</span><span> </span><span>&lt;</span><span><span>String</span><span>[</span></span><span>3</span><span><span>]: </span><span>yin</span></span><span>&gt;</span><span><span> (</span><span>data</span><span> </span><span>field</span><span> </span><span>at</span><span> </span><span>offset</span><span> </span></span><span>0</span><span>)</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>#</span><span>age</span><span>: </span><span>18</span><span><span> (</span><span>data</span><span> </span><span>field</span><span> </span><span>at</span><span> </span><span>offset</span><span> </span></span><span>1</span><span>)</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>#</span><span>-</span><span>school</span><span>-</span><span>: </span><span>0x3930221aecb1</span><span> </span><span>&lt;</span><span><span>String</span><span>[</span></span><span>11</span><span><span>]: </span><span>high</span><span> </span><span>school</span></span><span>&gt;</span><span><span> (</span><span>data</span><span> </span><span>field</span><span> </span><span>at</span><span> </span><span>offset</span><span> </span></span><span>2</span><span>)</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div><div><div><div>10</div></div><div><span><span>– </span><span>elements</span><span> </span></span><span>=</span><span> {</span></div></div><div><div><div>11</div></div><div><span>  </span><span>0</span><span>:</span><span> </span><span>0x2c2a4d782351</span><span> </span><span>&lt;</span><span><span>the</span><span> </span><span>hole</span></span><span>&gt;</span></div></div><div><div><div>12</div></div><div><span>  </span><span>1</span><span>: </span><span>0x3930221aecf9</span><span> </span><span>&lt;</span><span><span>String</span><span>[</span></span><span>6</span><span><span>]: </span><span>Monday</span></span><span>&gt;</span></div></div><div><div><div>13</div></div><div><span>  </span><span>2</span><span>: </span><span>0x3930221aed39</span><span> </span><span>&lt;</span><span><span>String</span><span>[</span></span><span>8</span><span><span>]: </span><span>Thuesday</span></span><span>&gt;</span></div></div><div><div><div>14</div></div><div><span>  </span><span>3</span><span>: </span><span>0x3930221aed79</span><span> </span><span>&lt;</span><span><span>String</span><span>[</span></span><span>9</span><span><span>]: </span><span>Wednesday</span></span><span>&gt;</span></div></div><div><div><div>15</div></div><div><span>  </span><span>4</span><span>-</span><span>18</span><span>: </span><span>0x2c2a4d782351</span><span> </span><span>&lt;</span><span><span>the</span><span> </span><span>hole</span></span><span>&gt;</span></div></div><div><div><div>16</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>
<ul>
<li>
<p>那些key为数字的存放在elements的数据结构里面。上面的elements它是一个有序数组，它的key值直接作为它的index。如果data改成：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>data</span><span> </span></span><span>=</span><span> {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>1</span><span>:</span><span> </span><span>"Monday"</span><span>,</span></div></div><div><div><div>3</div></div><div><span>  </span><span>2</span><span>:</span><span> </span><span>"Thuesday"</span><span>,</span></div></div><div><div><div>4</div></div><div><span>  </span><span>3</span><span>:</span><span> </span><span>"Wednesday"</span><span>,</span></div></div><div><div><div>5</div></div><div><span>  </span><span>7</span><span>:</span><span> </span><span>"Sunday"</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>那么elements是这样的：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>– </span><span>elements</span><span> </span></span><span>=</span><span> {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>0</span><span>:</span><span> </span><span>0x1e74f5702351</span><span> </span><span>&lt;</span><span><span>the</span><span> </span><span>hole</span></span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span>  </span><span>1</span><span>: </span><span>0x1745ec52ec71</span><span> </span><span>&lt;</span><span><span>String</span><span>[</span></span><span>6</span><span><span>]: </span><span>Monday</span></span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span>  </span><span>2</span><span>: </span><span>0x1745ec52ecb1</span><span> </span><span>&lt;</span><span><span>String</span><span>[</span></span><span>8</span><span><span>]: </span><span>Thuesday</span></span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span>  </span><span>3</span><span>: </span><span>0x1745ec52ecf1</span><span> </span><span>&lt;</span><span><span>String</span><span>[</span></span><span>9</span><span><span>]: </span><span>Wednesday</span></span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span>  </span><span>4</span><span>-</span><span>6</span><span>: </span><span>0x1e74f5702351</span><span> </span><span>&lt;</span><span><span>the</span><span> </span><span>hole</span></span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span>  </span><span>7</span><span>: </span><span>0x1745ec52ed39</span><span> </span><span>&lt;</span><span><span>String</span><span>[</span></span><span>6</span><span><span>]: </span><span>Sunday</span></span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span>  </span><span>8</span><span>-</span><span>18</span><span>: </span><span>0x1e74f5702351</span><span> </span><span>&lt;</span><span><span>the</span><span> </span><span>hole</span></span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>初始化大小仍然是19个元素，空的索引用hole元素填充。这种就跟数组一样，可直接根据索引定位到元素，代价是空间的消耗比较大，可以来看一下，当空间不足时，它是怎么扩容的：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>if</span><span><span> (</span><span>index</span><span> </span></span><span>&lt;</span><span><span> </span><span>capacity</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span>  </span><span>*</span><span><span>new_capacity</span><span> </span></span><span>=</span><span><span> </span><span>capacity</span><span>;</span></span></div></div><div><div><div>3</div></div><div><span>  </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>4</div></div><div><span>}</span></div></div><div><div><div>5</div></div><div><span>*</span><span><span>new_capacity</span><span> </span></span><span>=</span><span><span> </span><span>JSObject</span><span>::</span></span><span>NewElementsCapacity</span><span><span>(</span><span>index</span><span> </span></span><span>+</span><span> </span><span>1</span><span>);</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>由于第一个属性是1: Monday，所以上面的index = 1，执行最后一行计算新容量的元素：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// Computes the new capacity when expanding the elements of a JSObject.</span></div></div><div><div><div>2</div></div><div><span><span>static</span><span> </span><span>uint32_t</span><span> </span></span><span>NewElementsCapacity</span><span><span>(</span><span>uint32_t</span><span> </span><span>old_capacity</span><span>) {</span></span></div></div><div><div><div>3</div></div><div><span>  </span><span>// (old_capacity + 50%) + 16</span></div></div><div><div><div>4</div></div><div><span>  </span><span>return</span><span><span> </span><span>old_capacity</span><span> </span></span><span>+</span><span><span> (</span><span>old_capacity</span><span> </span></span><span>&gt;&gt;</span><span> </span><span>1</span><span>) </span><span>+</span><span> </span><span>16</span><span>;</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>可以看到，这是用老的空间的一半加上16，上面的计算结果为19，如果本来是2M大小，刚好不够再增加一个元素就成了3M，一个多余的元素就增加了1M的空间。它的好处是不用频繁地开避内存。</p>
</li>
<li>
<p>这种用数组表示的属性在源码里面叫FastElements，而用哈希表的叫做SlowElements。什么时候会变成slowElements？当hole太多的时候，例如给data增加一个key为2000的属性：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>data</span><span>[</span></span><span>'2000'</span><span>] </span><span>=</span><span> </span><span>'day'</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>data就会转成慢元素，因为3之后就是2000，hole太多就被转换了，如下面的ShouldConvertToSlowElements函数：</p>
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>static</span><span> </span><span>bool</span><span> </span></span><span>ShouldConvertToSlowElements</span><span><span>(</span><span>JSObject</span></span><span>*</span><span><span> </span><span>object</span><span>, </span><span>uint32_t</span><span> </span><span>capacity</span><span>, </span><span>uint32_t</span><span> </span><span>index</span><span>, </span><span>uint32_t</span></span><span>*</span><span><span> </span><span>new_capacity</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span>  </span><span>if</span><span><span> (</span><span>index</span><span> </span></span><span>&lt;</span><span><span> </span><span>capacity</span><span>) {</span></span></div></div><div><div><div>3</div></div><div><span>    </span><span>return</span><span> </span><span>false</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>5</div></div><div><span>  </span><span>//JSObject::kMaxGap = 1024</span></div></div><div><div><div>6</div></div><div><span>  </span><span>if</span><span><span> (</span><span>index</span><span> </span></span><span>-</span><span><span> </span><span>capacity</span><span> </span></span><span>&gt;=</span><span><span> </span><span>JSObject</span><span>::</span><span>kMaxGap</span><span>) </span></span><span>return</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>7</div></div><div><span>  </span><span>*</span><span><span>new_capacity</span><span> </span></span><span>=</span><span><span> </span><span>JSObject</span><span>::</span></span><span>NewElementsCapacity</span><span><span>(</span><span>index</span><span> </span></span><span>+</span><span> </span><span>1</span><span>);</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>  </span><span>// If the fast-case backing storage takes up roughly three times as</span></div></div><div><div><div>10</div></div><div><span>  </span><span>// much space (in machine words) as a dictionary backing storage</span></div></div><div><div><div>11</div></div><div><span>  </span><span>// would, the object should have slow elements.</span></div></div><div><div><div>12</div></div><div><span><span>  </span></span><span>int</span><span> </span><span>used_elements</span><span> </span><span>=</span><span><span> </span><span>object</span></span><span>-&gt;</span><span>GetFastElementsUsage</span><span>();</span></div></div><div><div><div>13</div></div><div><span><span>  </span></span><span>int</span><span> </span><span>dictionary_size</span><span> </span><span>=</span><span><span> </span><span>SeededNumberDictionary</span><span>::</span></span><span>ComputeCapacity</span><span><span>(</span><span>used_elements</span><span>) </span></span><span>*</span><span><span> </span><span>SeededNumberDictionary</span><span>::</span><span>kEntrySize</span><span>;</span></span></div></div><div><div><div>14</div></div><div><span>  </span><span>return</span><span> </span><span>3</span><span> </span><span>*</span><span> </span><span>static_cast</span><span>&lt;</span><span>uint32_t</span><span><span>&gt;(</span><span>dictionary_size</span><span>) </span></span><span>&lt;=</span><span> </span><span>*</span><span><span>new_capacity</span><span>;</span></span></div></div><div><div><div>15</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>
<ul>
<li>
<p>如果当前的index比容量capacity大了1024，就转成慢元素，或者是如上面的代码注释，如果快元素占的空间为慢元素的3倍之多时，也会被转成慢元素。</p>
</li>
<li>
<p>转成慢元素之后，它就和字符串的哈希表一样了，不一样的是，它计算哈希的方式不一样，字符串的需要一个个字符串循环计算计算hash，而数字的key，不需要循环，如下计算（第二个参数是随机化种子seed）：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>inline</span><span> </span><span>uint32_t</span><span> </span></span><span>ComputeIntegerHash</span><span><span>(</span><span>uint32_t</span><span> </span><span>key</span><span>, </span><span>uint32_t</span><span> </span><span>seed</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>uint32_t</span><span> </span><span>hash</span><span> </span><span>=</span><span><span> </span><span>key</span><span>;</span></span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>hash</span><span> </span><span>=</span><span><span> </span><span>hash</span><span> </span></span><span>^</span><span><span> </span><span>seed</span><span>;</span></span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>hash</span><span> </span><span>=</span><span> </span><span>~</span><span><span>hash</span><span> </span></span><span>+</span><span><span> (</span><span>hash</span><span> </span></span><span>&lt;&lt;</span><span> </span><span>15</span><span>);  </span><span>// hash = (hash &lt;&lt; 15) - hash - 1;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>hash</span><span> </span><span>=</span><span><span> </span><span>hash</span><span> </span></span><span>^</span><span><span> (</span><span>hash</span><span> </span></span><span>&gt;&gt;</span><span> </span><span>12</span><span>);</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>hash</span><span> </span><span>=</span><span><span> </span><span>hash</span><span> </span></span><span>+</span><span><span> (</span><span>hash</span><span> </span></span><span>&lt;&lt;</span><span> </span><span>2</span><span>);</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>hash</span><span> </span><span>=</span><span><span> </span><span>hash</span><span> </span></span><span>^</span><span><span> (</span><span>hash</span><span> </span></span><span>&gt;&gt;</span><span> </span><span>4</span><span>);</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>hash</span><span> </span><span>=</span><span><span> </span><span>hash</span><span> </span></span><span>*</span><span> </span><span>2057</span><span>;  </span><span>// hash = (hash + (hash &lt;&lt; 3)) + (hash &lt;&lt; 11);</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>hash</span><span> </span><span>=</span><span><span> </span><span>hash</span><span> </span></span><span>^</span><span><span> (</span><span>hash</span><span> </span></span><span>&gt;&gt;</span><span> </span><span>16</span><span>);</span></div></div><div><div><div>10</div></div><div><span>  </span><span>return</span><span><span> </span><span>hash</span><span> </span></span><span>&amp;</span><span> </span><span>0x3fffffff</span><span>;</span></div></div><div><div><div>11</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul></section><section><h4>7. ES6 Map的实现<a href="#7-es6-map的实现"><span>#</span></a></h4><blockquote><p>这里有一个比较有趣的事情，就是V8的Map的核心逻辑是用JS实现的，用JS来实现JS，比写C++要高效多了，但是执行效率可能就没有直接写C++的高，可以来看一下set函数的实现：</p></blockquote><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>MapSet</span><span><span>(</span><span>key</span><span>, </span><span>value</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span>  </span><span>//添加一个log</span></div></div><div><div><div>3</div></div><div><span>  </span><span>%</span><span>LOG</span><span>(</span><span>"MapSet"</span><span><span>, </span><span>key</span><span>);</span></span></div></div><div><div><div>4</div></div><div><span>  </span><span>var</span><span><span> </span><span>table</span><span> </span></span><span>=</span><span> </span><span>%</span><span>_JSCollectionGetTable</span><span>(</span><span>this</span><span>);</span></div></div><div><div><div>5</div></div><div><span>  </span><span>var</span><span><span> </span><span>numBuckets</span><span> </span></span><span>=</span><span> </span><span>ORDERED_HASH_TABLE_BUCKET_COUNT</span><span><span>(</span><span>table</span><span>);</span></span></div></div><div><div><div>6</div></div><div><span>  </span><span>var</span><span><span> </span><span>hash</span><span> </span></span><span>=</span><span> </span><span>GetHash</span><span><span>(</span><span>key</span><span>);</span></span></div></div><div><div><div>7</div></div><div><span>  </span><span>var</span><span><span> </span><span>entry</span><span> </span></span><span>=</span><span> </span><span>MapFindEntry</span><span><span>(</span><span>table</span><span>, </span><span>numBuckets</span><span>, </span><span>key</span><span>, </span><span>hash</span><span>);</span></span></div></div><div><div><div>8</div></div><div><span>  </span><span>if</span><span><span> (</span><span>entry</span><span> </span></span><span>!==</span><span> </span><span>NOT_FOUND</span><span>) </span><span>return</span><span> </span><span>...</span><span>//return代码省略</span></div></div><div><div><div>9</div></div><div><span>  </span><span>//如果个数大于capacity的二分之一，则执行%MapGrow(this)代码略</span></div></div><div><div><div>10</div></div><div><span>  </span><span>FIXED_ARRAY_SET</span><span><span>(</span><span>table</span><span>, </span><span>index</span><span>, </span><span>key</span><span>);</span></span></div></div><div><div><div>11</div></div><div><span>  </span><span>FIXED_ARRAY_SET</span><span><span>(</span><span>table</span><span>, </span><span>index</span><span> </span></span><span>+</span><span> </span><span>1</span><span><span>, </span><span>value</span><span>);</span></span></div></div><div><div><div>12</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>第三行添加一个log函数，确认确实是执行这里的代码。%开头的LOG，表示它是一个C++的函数，这个代码写在runtime.h和runtime.cc里面。这些JS代码最后会被组装成native code。在V8里，除了Map/Set之外，很多ES6新加的功能，都是用的JS实现的，如数组新加的很多函数。</li>
</ul></section><section><h4>8. Object和ES6 Map的速度比较<a href="#8-object和es6-map的速度比较"><span>#</span></a></h4><blockquote><p>如以下代码，初始化一个map和一个object：</p></blockquote><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>map</span><span> </span></span><span>=</span><span> </span><span>new</span><span> </span><span>Map</span><span>(),</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>obj</span><span> </span><span>=</span><span> {};</span></div></div><div><div><div>3</div></div><div><span>var</span><span><span> </span><span>size</span><span> </span></span><span>=</span><span> </span><span>100000</span><span>;</span></div></div><div><div><div>4</div></div><div><span>for</span><span>(</span><span>var</span><span><span> </span><span>i</span><span> </span></span><span>=</span><span> </span><span>0</span><span><span>; </span><span>i</span><span> </span></span><span>&lt;</span><span><span> </span><span>size</span><span>; </span><span>i</span></span><span>++</span><span>){</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>map</span><span>.</span><span>set</span><span>(</span><span>'key'</span><span> </span><span>+</span><span><span> </span><span>i</span><span> , </span><span>i</span><span>);</span></span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>obj</span><span>[</span><span>'key'</span><span> </span><span>+</span><span><span> </span><span>i</span><span>] </span></span><span>=</span><span><span> </span><span>i</span><span>;</span></span></div></div><div><div><div>7</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p>再准备一个keys数组，用来存储查找的key，如下，分成三种情况分别测验：1. keys都能查到；2. 只有一半的keys能找到；3. 全部的keys都查找不到：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>keys</span><span> </span></span><span>=</span><span> [];</span></div></div><div><div><div>2</div></div><div><span>for</span><span>(</span><span>var</span><span><span> </span><span>i</span><span> </span></span><span>=</span><span> </span><span>0</span><span><span>; </span><span>i</span><span> </span></span><span>&lt;</span><span> </span><span>100</span><span><span>; </span><span>i</span></span><span>++</span><span>){</span></div></div><div><div><div>3</div></div><div><span>  </span><span>// 1. keys都找得到</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>keys</span><span>.</span><span>push</span><span>(</span><span>'key'</span><span> </span><span>+</span><span> </span><span>parseInt</span><span><span>(</span><span>Math</span><span>.</span></span><span>random</span><span>() </span><span>*</span><span><span> </span><span>size</span><span>));</span></span></div></div><div><div><div>5</div></div><div><span>  </span><span>// 2. 约一半的keys找不到</span></div></div><div><div><div>6</div></div><div><span>  </span><span>// keys.push('key' + parseInt(Math.random() * size * 2));</span></div></div><div><div><div>7</div></div><div><span>  </span><span>// 3. 全部的keys都找不到</span></div></div><div><div><div>8</div></div><div><span>  </span><span>// keys.push('key' + parseInt(Math.random() * size) + size);</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>然后进行查找，重复多次，并打印时间：</p>
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>count</span><span> </span></span><span>=</span><span> </span><span>100000</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>time</span><span>(</span><span>"map time"</span><span>);</span></div></div><div><div><div>3</div></div><div><span>for</span><span>(</span><span>var</span><span><span> </span><span>i</span><span> </span></span><span>=</span><span> </span><span>0</span><span><span>; </span><span>i</span><span> </span></span><span>&lt;</span><span><span> </span><span>count</span><span>; </span><span>i</span></span><span>++</span><span>){</span></div></div><div><div><div>4</div></div><div><span>    </span><span>for</span><span>(</span><span>var</span><span><span> </span><span>j</span><span> </span></span><span>=</span><span> </span><span>0</span><span><span>; </span><span>j</span><span> </span></span><span>&lt;</span><span><span> </span><span>keys</span><span>.</span></span><span>length</span><span><span>; </span><span>j</span></span><span>++</span><span>){</span></div></div><div><div><div>5</div></div><div><span>        </span><span>let</span><span><span> </span><span>x</span><span> </span></span><span>=</span><span><span> </span><span>map</span><span>.</span></span><span>get</span><span><span>(</span><span>keys</span><span>[</span><span>j</span><span>]);</span></span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>}</span></div></div><div><div><div>8</div></div><div><span><span>console</span><span>.</span></span><span>timeEnd</span><span>(</span><span>"map time"</span><span>);</span></div></div><div><div><div>9</div></div><div><span><span>console</span><span>.</span></span><span>time</span><span>(</span><span>"obj time"</span><span>);</span></div></div><div><div><div>10</div></div><div><span>for</span><span>(</span><span>var</span><span><span> </span><span>i</span><span> </span></span><span>=</span><span> </span><span>0</span><span><span>; </span><span>i</span><span> </span></span><span>&lt;</span><span><span> </span><span>count</span><span>; </span><span>i</span></span><span>++</span><span>){</span></div></div><div><div><div>11</div></div><div><span>    </span><span>for</span><span>(</span><span>var</span><span><span> </span><span>j</span><span> </span></span><span>=</span><span> </span><span>0</span><span><span>; </span><span>j</span><span> </span></span><span>&lt;</span><span><span> </span><span>keys</span><span>.</span></span><span>length</span><span><span>; </span><span>j</span></span><span>++</span><span>){</span></div></div><div><div><div>12</div></div><div><span>        </span><span>let</span><span><span> </span><span>x</span><span> </span></span><span>=</span><span><span> </span><span>obj</span><span>[</span><span>keys</span><span>[</span><span>j</span><span>]];</span></span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span>}</span></div></div><div><div><div>15</div></div><div><span><span>console</span><span>.</span></span><span>timeEnd</span><span>(</span><span>"obj time"</span><span>);</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>
<ul>
<li>
<p>最后的结果如下：</p>

<table><thead><tr><th></th><th>100% keys found</th><th>50% keys found</th><th>0% keys found</th></tr></thead><tbody><tr><td>map</td><td>517ms</td><td>375ms</td><td>317ms</td></tr><tr><td>object</td><td>414ms</td><td>1.02s</td><td>1.49s</td></tr></tbody></table>
<ul>
<li>可以看到，当查找的keys找不到时，object更加地消耗时间（在实际的使用中，一半找得到一半找不到的情况应该会比较多一点）。这很可能是因为object里面每个key需要实例化一个全局唯一的name，如果name已经存在了，那么它已经实例化好了，包括它的哈希值计算已经缓存起来了，如果未知的name越多，那么需要实例化的name也就越多，而map不存在这种情况，每次都是重新计算哈希。另一方面还可能和它们的哈希算法有关。</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul><blockquote><p>综上，Object存储和查找一个属性时，属性不超过128个，使用Search Cache，当属性是较为连续的数字时，使用数组，此种方式最快。其它情况使用哈希表，并且数字和字符串的哈希不一样。</p></blockquote><blockquote><p>可以把Object当成哈希map使用，但是在效率上可能会比不上ES6的Map，并且还有Object原型查找的问题。</p></blockquote><ul>
<li>【转载】原文链接：<a href="https://www.rrfed.com/2017/04/04/chrome-object/" target="_blank">https://www.rrfed.com/2017/04/04/chrome-object/</a></li>
</ul></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/%E5%B8%B8%E8%A7%81%E5%89%8D%E7%AB%AF%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98%E5%8F%8A%E9%98%B2%E6%8A%A4/</id>
      <title type="text">常见前端安全问题及防护</title>
      <published>2019-07-31T00:00:00.000Z</published>
      <updated>2019-07-31T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/%E5%B8%B8%E8%A7%81%E5%89%8D%E7%AB%AF%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98%E5%8F%8A%E9%98%B2%E6%8A%A4/"/>
      <summary type="text">常见前端安全问题及防护：xss与sql攻击、csrf，请求劫持与HTTPS，浏览器web安全控制，使用iframe的风险，点击劫持，错误的内容推断，不安全的第三方依赖包，HTTPS中间人攻击，本地存储数据泄露，CDN劫持/污染</summary>
      <content type="html"><![CDATA[<section><h2>常见前端安全问题及防护<a href="#常见前端安全问题及防护"><span>#</span></a></h2><section><h3>一、xss与sql攻击<a href="#一xss与sql攻击"><span>#</span></a></h3><ol>
<li>xss-跨站脚本攻击（Cross-Site Scripting）</li>
</ol><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>XSS是跨站脚本攻击</span><span>（</span><span>Cross</span></span><span>-</span><span><span>Site</span><span> </span><span>Scripting</span><span>）</span><span>的简称</span><span>。</span><span>XSS这类安全问题发生的本质原因在于</span><span>：</span><span>浏览器错误的将攻击者提供的用户输入数据当做JavaScript脚本给执行了</span><span>。</span></span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span><span>XSS有几种不同的分类办法</span><span>，</span><span>例如按照恶意输入的脚本是否在应用中存储</span><span>，</span><span>XSS被划分为</span><span>“</span><span>存储型XSS</span><span>”</span><span>和</span><span>“</span><span>反射型XSS</span><span>”，</span><span>如果按照是否和服务器有交互</span><span>，</span><span>又可以划分为</span><span>“</span><span>Server</span><span> </span><span>Side</span><span> </span></span><span>XSS</span><span><span>”</span><span>和</span><span>“</span></span><span>DOM</span><span><span> </span><span>based</span><span> </span></span><span>XSS</span><span>”。</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span><span>无论怎么分类</span><span>，</span><span>XSS漏洞始终是威胁用户的一个安全隐患</span><span>。</span><span>攻击者可以利用XSS漏洞来窃取包括用户身份信息在内的各种敏感信息</span><span>、</span><span>修改Web页面以欺骗用户</span><span>，</span><span>甚至控制受害者浏览器</span><span>，</span><span>或者和其他漏洞结合起来形成蠕虫攻击</span><span>，</span><span>等等</span><span>。</span><span>总之</span><span>，</span><span>关于XSS漏洞的利用</span><span>，</span><span>只有想不到没有做不到</span><span>。</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如何防御</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>对数据进行严格的输出编码</span><span>，</span><span>使得攻击者提供的数据不再被浏览器认为是脚本而被误执行</span><span>。</span><span>例如</span></span><span>&lt;</span><span>script</span><span>&gt;</span><span>在进行HTML编码后变成了</span><span>&amp;</span><span><span>lt</span><span>;</span><span>script</span></span><span>&amp;</span><span><span>gt</span><span>;，</span><span>这段数据就不会被当做脚本执行了</span><span>。</span></span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span><span>需要根据输出数据所在的上下文来进行相应的编码</span><span>。</span><span>数据放置于HTML元素中</span><span>，</span><span>需进行HTML编码</span><span>，</span><span>放置于URL中</span><span>，</span><span>需要进行URL编码</span><span>。</span><span>此外</span><span>，</span><span>还有JavaScript编码</span><span>、</span><span>CSS编码</span><span>、</span><span>HTML属性编码</span><span>、</span><span>JSON编码等等</span><span>。(</span><span>一些主流前端开发框架基本上都默认提供了前端输出编码</span><span>，</span><span>这大大减轻了前端开发小伙伴们的工作负担</span><span>)</span></span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span><span>其他的防御措施</span><span>，</span><span>例如设置CSP</span><span> </span></span><span>HTTP</span><span><span> </span><span>Header</span><span>、</span><span>输入验证</span><span>、</span><span>开启浏览器XSS防御等等都是可选项</span><span>，</span><span>原因在于这些措施都存在被绕过的可能</span><span>，</span><span>并不能完全保证能防御XSS攻击</span><span>。</span><span>不过它们和输出编码却可以共同协作实施纵深防御策略</span><span>。</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>二、csrf<a href="#二csrf"><span>#</span></a></h3><ol>
<li>csrf</li>
</ol><p>CSRF跨站点请求伪造(Cross—Site Request Forgery)，跟XSS攻击一样，存在巨大的危害性，你可以这样来理解：</p><p>攻击者盗用了你的身份，以你的名义发送恶意请求，对服务器来说这个请求是完全合法的，但是却完成了攻击者所期望的一个操作，比如以你的名义发送邮件、发消息，盗取你的账号，添加系统管理员，甚至于购买商品、虚拟货币转账等。 如下：其中Web A为存在CSRF漏洞的网站，Web B为攻击者构建的恶意网站，User C为Web A网站的合法用户。</p><ol>
<li>CSRF攻击攻击原理及过程如下：</li>
</ol><ul>
<li>1.用户C打开浏览器，访问受信任网站A，输入用户名和密码请求登录网站A；</li>
<li>2.在用户信息通过验证后，网站A产生Cookie信息并返回给浏览器，此时用户登录网站A成功，可以正常发送请求到网站A；</li>
<li>3.用户未退出网站A之前，在同一浏览器中，打开一个TAB页访问网站B；</li>
<li>4.网站B接收到用户请求后，返回一些攻击性代码，并发出一个请求要求访问第三方站点A；</li>
<li>5.浏览器在接收到这些攻击性代码后，根据网站 B 的请求，在用户不知情的情况下携带 Cookie 信息，向网站 A 发出请求。网站 A 并不知道该请求其实是由 B 发起的，所以会根据用户 C 的 Cookie 信息以 C 的权限处理该请求，导致来自网站 B 的恶意代码被执行。</li>
</ul><ol>
<li>CSRF漏洞检测：</li>
</ol><p>检测CSRF漏洞是一项比较繁琐的工作，最简单的方法就是抓取一个正常请求的数据包，去掉Referer字段后再重新提交，如果该提交还有效，那么基本上可以确定存在CSRF漏洞。</p><p>随着对CSRF漏洞研究的不断深入，不断涌现出一些专门针对CSRF漏洞进行检测的工具，如CSRFTester，CSRF Request Builder等。</p><p>以CSRFTester工具为例，CSRF漏洞检测工具的测试原理如下：使用CSRFTester进行测试时，首先需要抓取我们在浏览器中访问过的所有链接以及所有的表单等信息，然后通过在CSRFTester中修改相应的表单等信息，重新提交，这相当于一次伪造客户端请求。如果修改后的测试请求成功被网站服务器接受，则说明存在CSRF漏洞，当然此款工具也可以被用来进行CSRF攻击。</p><p>防御CSRF攻击：</p><p>目前防御 CSRF 攻击主要有三种策略：</p><ul>
<li>验证 HTTP Referer 字段；</li>
<li>在请求地址中添加 token 并验证；</li>
<li>在 HTTP 头中自定义属性并验证。</li>
</ul><ol>
<li>验证 HTTP Referer 字段</li>
</ol><p>根据 HTTP 协议，在 HTTP 头中有一个字段叫 Referer，它记录了该 HTTP 请求的来源地址。在通常情况下，访问一个安全受限页面的请求来自于同一个网站，比如需要访问 <code>http://bank.example/withdraw?account=bob&amp;amount=1000000&amp;for=Mallory</code>，用户必须先登陆 <code>bank.example</code>，然后通过点击页面上的按钮来触发转账事件。这时，该转帐请求的 <code>Referer</code> 值就会是转账按钮所在的页面的 <code>URL</code>，通常是以 <code>bank.example</code> 域名开头的地址。而如果黑客要对银行网站实施 <code>CSRF</code> 攻击，他只能在他自己的网站构造请求，当用户通过黑客的网站发送请求到银行时，该请求的 <code>Referer</code> 是指向黑客自己的网站。因此，要防御 <code>CSRF</code> 攻击，银行网站只需要对于每一个转账请求验证其 <code>Referer</code> 值，如果是以 <code>bank.example</code> 开头的域名，则说明该请求是来自银行网站自己的请求，是合法的。如果 <code>Referer</code> 是其他网站的话，则有可能是黑客的 <code>CSRF</code> 攻击，拒绝该请求。</p><p>这种方法的显而易见的好处就是简单易行，网站的普通开发人员不需要操心 CSRF 的漏洞，只需要在最后给所有安全敏感的请求统一增加一个拦截器来检查 Referer 的值就可以。特别是对于当前现有的系统，不需要改变当前系统的任何已有代码和逻辑，没有风险，非常便捷。</p><p>然而，这种方法并非万无一失。Referer 的值是由浏览器提供的，虽然 HTTP 协议上有明确的要求，但是每个浏览器对于 Referer 的具体实现可能有差别，并不能保证浏览器自身没有安全漏洞。使用验证 Referer 值的方法，就是把安全性都依赖于第三方（即浏览器）来保障，从理论上来讲，这样并不安全。事实上，对于某些浏览器，比如 IE6 或 FF2，目前已经有一些方法可以篡改 Referer 值。如果 bank.example 网站支持 IE6 浏览器，黑客完全可以把用户浏览器的 Referer 值设为以 bank.example 域名开头的地址，这样就可以通过验证，从而进行 CSRF 攻击。</p><p>即便是使用最新的浏览器，黑客无法篡改 Referer 值，这种方法仍然有问题。因为 Referer 值会记录下用户的访问来源，有些用户认为这样会侵犯到他们自己的隐私权，特别是有些组织担心 Referer 值会把组织内网中的某些信息泄露到外网中。因此，用户自己可以设置浏览器使其在发送请求时不再提供 Referer。当他们正常访问银行网站时，网站会因为请求没有 Referer 值而认为是 CSRF 攻击，拒绝合法用户的访问。</p><ol>
<li>在请求地址中添加 token 并验证</li>
</ol><p>CSRF 攻击之所以能够成功，是因为黑客可以完全伪造用户的请求，该请求中所有的用户验证信息都是存在于 cookie 中，因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证。要抵御 CSRF，关键在于在请求中放入黑客所不能伪造的信息，并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token，并在服务器端建立一个拦截器来验证这个 token，如果请求中没有 token 或者 token 内容不正确，则认为可能是 CSRF 攻击而拒绝该请求。</p><p>这种方法要比检查 Referer 要安全一些，token 可以在用户登陆后产生并放于 session 之中，然后在每次请求时把 token 从 session 中拿出，与请求中的 token 进行比对，但这种方法的难点在于如何把 token 以参数的形式加入请求。对于 GET 请求，token 将附在请求地址之后，这样 URL 就变成 <a href="http://url?csrftoken=tokenvalue%E3%80%82" target="_blank">http://url?csrftoken=tokenvalue。</a> 而对于 POST 请求来说，要在 form 的最后加上 ，这样就把 token 以参数的形式加入请求了。但是，在一个网站中，可以接受请求的地方非常多，要对于每一个请求都加上 token 是很麻烦的，并且很容易漏掉，通常使用的方法就是在每次页面加载时，使用 javascript 遍历整个 dom 树，对于 dom 中所有的 a 和 form 标签后加入 token。这样可以解决大部分的请求，但是对于在页面加载之后动态生成的 html 代码，这种方法就没有作用，还需要程序员在编码时手动添加 token。</p><p>该方法还有一个缺点是难以保证 token 本身的安全。特别是在一些论坛之类支持用户自己发表内容的网站，黑客可以在上面发布自己个人网站的地址。由于系统也会在这个地址后面加上 token，黑客可以在自己的网站上得到这个 token，并马上就可以发动 CSRF 攻击。为了避免这一点，系统可以在添加 token 的时候增加一个判断，如果这个链接是链到自己本站的，就在后面添加 token，如果是通向外网则不加。不过，即使这个 csrftoken 不以参数的形式附加在请求之中，黑客的网站也同样可以通过 Referer 来得到这个 token 值以发动 CSRF 攻击。这也是一些用户喜欢手动关闭浏览器 Referer 功能的原因。</p><ol>
<li>在 HTTP 头中自定义属性并验证</li>
</ol><p>这种方法也是使用 token 并进行验证，和上一种方法不同的是，这里并不是把 token 以参数的形式置于 HTTP 请求之中，而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类，可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性，并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便，同时，通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏，也不用担心 token 会透过 Referer 泄露到其他网站中去。</p><p>然而这种方法的局限性非常大。XMLHttpRequest 请求通常用于 Ajax 方法中对于页面局部的异步刷新，并非所有的请求都适合用这个类来发起，而且通过该类请求得到的页面不能被浏览器所记录下，从而进行前进，后退，刷新，收藏等操作，给用户带来不便。另外，对于没有进行 CSRF 防护的遗留系统来说，要采用这种方法来进行防护，要把所有请求都改为 XMLHttpRequest 请求，这样几乎是要重写整个网站，这代价无疑是不能接受的。</p></section><section><h3>三、请求劫持与HTTPS<a href="#三请求劫持与https"><span>#</span></a></h3><p>1.请求劫持</p><p>现在主要分为两种，DNS劫持与HTTP劫持：</p><ol>
<li>DNS劫持</li>
</ol><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>  </span></span><span>DNS劫持就是通过劫持了DNS服务器</span><span>，</span><span>通过某些手段取得某域名的解析记录控制权</span><span>，</span><span>进而修改此域名的解析结果</span><span>，</span><span>导致对该域名的访问由原IP地址转入到修改后的指定IP</span><span>，</span><span>其结果就是对特定的网址不能访问或访问的是假网址</span><span>，</span><span>从而实现窃取资料或者破坏原有正常服务的目的</span><span>。</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>DNS劫持通过篡改DNS服务器上的数据返回给用户一个错误的查询结果来实现的</span><span>。</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>DNS劫持症状</span><span>：</span><span>在某些地区的用户在成功连接宽带后</span><span>，</span><span>首次打开任何页面都指向ISP提供的</span><span>“</span><span>电信互联星空</span><span>”、“</span><span>网通黄页广告</span><span>”</span><span>等内容页面</span><span>。</span><span>还有就是曾经出现过用户访问Google域名的时候出现了百度的网站</span><span>。</span><span>这些都属于DNS劫持</span><span>。 </span><span>再说简单点</span><span>，</span><span>当你输入google</span><span>.</span><span>com这个网址的时候</span><span><span>，</span><span>你看到的网站却是百度的首页</span><span>。</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>http劫持</li>
</ol><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>在用户的客户端与其要访问的服务器经过网络协议协调后</span><span>，</span><span>二者之间建立了一条专用的数据通道</span><span>，</span><span>用户端程序在系统中开放指定网络端口用于接收数据报文</span><span>，</span><span>服务器端将全部数据按指定网络协议规则进行分解打包</span><span>，</span><span>形成连续数据报文</span><span>。</span><span>用户端接收到全部报文后</span><span>，</span><span>按照协议标准来解包组合获得完整的网络数据</span><span>。</span><span>其中传输过程中的每一个数据包都有特定的标签</span><span>，</span><span>表示其来源</span><span>、</span><span>携带的数据属性以及要到何处</span><span>，</span><span>所有的数据包经过网络路径中ISP的路由器传输接力后</span><span>，</span><span>最终到达目的地</span><span>，</span><span>也就是客户端</span><span>。</span></span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span><span>HTTP劫持是在使用者与其目的网络服务所建立的专用数据通道中</span><span>，</span><span>监视特定数据信息</span><span>，</span><span>提示当满足设定的条件时</span><span>，</span><span>就会在正常的数据流中插入精心设计的网络数据报文</span><span>，</span><span>目的是让用户端程序解释</span><span>“</span><span>错误</span><span>”</span><span>的数据</span><span>，</span><span>并以弹出新窗口的形式在使用者界面展示宣传性广告或者直接显示某网站的内容</span><span>。</span><span>列入本地的fiddler为一种劫持</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如何防御</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>请求劫持唯一可行的预防方法就是尽量使用HTTPS协议访问</span><span>。</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>2.公钥和私钥</p><ul>
<li>
<p>https 简单理解就是通过SSL（Secure Sockets Layer）层来加密http数据来进行安全传输。 那使用HTTPS是怎样进行加解密和安全数据传输的？</p>
</li>
<li>
<p>先看个有意思的问题：</p>
<p>A、B两个人分别在两个岛上，并且分别有一个箱子，一把锁，和打开这把锁的钥匙（A的钥匙打不开B手上的锁，B的钥匙也打不开A的锁）。此时A要跟B互通情报，此时需要借助C的船运输，C是一个不可靠的人，如果A直接把情报送给B或把情报放在箱子里给B，都可能会被C偷走；如果A把情报锁在箱子里，B没有打开A锁的钥匙无法获得情报内容。请问有什么办法可以尽可能快的让A和B互通情报。</p>
<p>这就是公钥和私钥的问题了，答案比较简单，也对应了公钥和私钥在https中的应用过程。</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>公钥</span><span>（</span><span>Public</span><span> </span><span>Key</span><span>）</span><span>与私钥</span><span>（</span><span>Private</span><span> </span><span>Key</span><span>）</span><span>是通过一种算法得到的一个密钥对</span><span>（</span><span>即一个公钥和一个私钥</span><span>），</span><span>公钥是密钥对中公开的部分</span><span>，</span><span>私钥则是非公开的部分</span><span>。</span><span>公钥通常用于加密会话密钥</span><span>、</span><span>验证数字签名</span><span>，</span><span>或加密可以用相应的私钥解密的数据</span><span>。</span><span>通过这种算法得到的密钥对能保证在世界范围内是唯一的</span><span>。</span><span>使用这个密钥对的时候</span><span>，</span><span>如果用其中一个密钥加密一段数据</span><span>，</span><span>必须用另一个密钥解密</span><span>。</span><span>比如用公钥加密数据就必须用私钥解密</span><span>，</span><span>如果用私钥加密也必须用公钥解密</span><span>，</span><span>否则解密将不会成功</span><span>。</span></span><span>---</span><span>百度百科</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul><p>3.Https的通信过程</p><ul>
<li>1、客户端发送https请求，告诉服务器端将建立https连接</li>
<li>2、服务器将服务端生成的公钥返回给客户端，如果是第一次请求将告诉客户端需要验证链接</li>
<li>3、客户端接收到请求后’client finished’报文串通过获取到的服务器公钥加密发送给服务器，并将客户端生成的公钥也发送给服务器</li>
<li>4、服务器获取到加密的报文和客户端公钥，先使用服务器私钥解密报文，然后将报文通过客户端的公钥加密返回给客户端。</li>
<li>5、客户端通过私钥解密报文，判断是否为自己开始发送的报文串；如果正确，说明安全连接验证成功，将数据通过服务器公钥加密不断发送给服务器，服务器也不断解密获取报文，并通过客户端公钥加密返回给客户端验证。这样就建立了不断通信的连接。</li>
</ul></section><section><h3>四、浏览器web安全控制<a href="#四浏览器web安全控制"><span>#</span></a></h3><blockquote><p>http层面上浏览器设置的安全性控制较多，这里列几个典型的来看看：</p></blockquote><ol>
<li>X-XSS-Protection</li>
</ol><p>这个header主要是用来防止浏览器中的反射性xss。现在，只有IE，chrome和safari（webkit）支持这个header。</p><p>正确的设置:</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>X</span><span>-</span><span>XSS</span><span>-</span><span><span>Protection</span><span>:</span></span><span>1</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>mode</span><span>=</span><span>block</span></div></div><div><div><div>3</div></div><div><span>    </span><span>0</span><span><span> – </span><span>关闭对浏览器的xss防护</span></span></div></div><div><div><div>4</div></div><div><span>    </span><span>1</span><span><span> – </span><span>开启xss防护</span></span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>mode</span><span>=</span><span><span>block</span><span> – </span><span>开启xss防护并通知浏览器阻止而不是过滤用户注入的脚本</span></span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>report</span><span>=</span><span><span>http</span><span>:</span></span><span>//site.com/report – 这个只有chrome和webkit内核的浏览器支持，这种模式告诉浏览器当发现疑似xss攻击的时候就将这部分数据post到指定地址</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>X-Content-Type-Options</li>
</ol><p>这个header主要用来防止在IE9、chrome和safari中的MIME类型混淆攻击。firefox目前对此还存在争议。通常浏览器可以通过嗅探内容本身的方法来决定它是什么类型，而不是看响应中的content-type值。通过设置 X-Content-Type-Options：如果content-type和期望的类型匹配，则不需要嗅探，只能从外部加载确定类型的资源。举个例子，如果加载了一个样式表，那么资源的MIME类型只能是text/css，对于IE中的脚本资源，以下的内容类型是有效的：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>application</span><span>/</span><span><span>ecmascript</span><span> </span><span>application</span></span><span>/</span><span><span>javascript</span><span> </span><span>application</span></span><span>/</span><span>x</span><span>-</span><span><span>javascript</span><span> </span><span>text</span></span><span>/</span><span><span>ecmascript</span><span> </span><span>text</span></span><span>/</span><span><span>javascript</span><span> </span><span>text</span></span><span>/</span><span><span>jscript</span><span> </span><span>text</span></span><span>/</span><span>x</span><span>-</span><span><span>javascript</span><span> </span><span>text</span></span><span>/</span><span><span>vbs</span><span>   </span><span>text</span></span><span>/</span><span>vbscript</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>对于chrome，则支持下面的MIME 类型：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>text</span><span>/</span><span><span>javascript</span><span> </span><span>text</span></span><span>/</span><span><span>ecmascript</span><span> </span><span>application</span></span><span>/</span><span><span>javascript</span><span> </span><span>application</span></span><span>/</span><span><span>ecmascript</span><span> </span><span>application</span></span><span>/</span><span>x</span><span>-</span><span><span>javascript</span><span> </span><span>text</span></span><span>/</span><span><span>javascript1</span><span>.</span></span><span>1</span><span><span>   </span><span>text</span></span><span>/</span><span><span>javascript1</span><span>.</span></span><span>2</span><span><span>   </span><span>text</span></span><span>/</span><span><span>javascript1</span><span>.</span></span><span>3</span><span><span>   </span><span>text</span></span><span>/</span><span><span>jscript</span><span> </span><span>text</span></span><span>/</span><span><span>live</span><span> </span><span>script</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><code>nosniff</code> – 这个是唯一正确的设置，必须这样。</p><ol>
<li>Strict-Transport-Security</li>
</ol><p>Strict Transport Security (STS) 是用来配置浏览器和服务器之间安全的通信。它主要是用来防止中间人攻击，因为它强制所有的通信都走TLS。目前IE还不支持 STS头。需要注意的是，在普通的http请求中配置STS是没有作用的，因为攻击者很容易就能更改这些值。为了防止这样的现象发生，很多浏览器内置了一个配置了STS的站点list。</p><p>正确的设置: 注意下面的值必须在https中才有效，如果是在http中配置会没有效果。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>max</span><span>-</span><span>age</span><span>=</span><span>31536000</span><span><span> – </span><span>告诉浏览器将域名缓存到STS</span><span> </span><span>list里面</span><span>，</span><span>时间是一年</span><span>。   </span><span>max</span></span><span>-</span><span>age</span><span>=</span><span>31536000</span><span><span>; </span><span>includeSubDomains</span><span> – </span><span>告诉浏览器将域名缓存到STS</span><span> </span><span>list里面并且包含所有的子域名</span><span>，</span><span>时间是一年</span><span>。</span></span></div></div><div><div><div>2</div></div><div><span>max</span><span>-</span><span>age</span><span>=</span><span>0</span><span><span> – </span><span>告诉浏览器移除在STS缓存里的域名</span><span>，</span><span>或者不保存此域名</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>判断一个主机是否在你的STS缓存中，chrome可以通过访问chrome://net-internals/#hsts，首先，通过域名请求选项来确认此域名是否在你的STS缓存中。然后，通过https访问这个网站，尝试再次请求返回的STS头，来决定是否添加正确。</p><ol>
<li>Content-Security-Policy</li>
</ol><p>CSP是一种由开发者定义的安全性政策性申明，通过CSP所约束的的规责指定可信的内容来源（这里的内容可以指脚本、图片、iframe、fton、style等等可能的远程的资源）。通过CSP协定，让WEB能够加载指定安全域名下的资源文件，保证运行时处于一个安全的运行环境中。</p><p>正确配置</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Content</span><span>-</span><span>Security</span><span>-</span><span><span>Policy</span><span>:</span></span><span>default</span><span>-</span><span><span>src</span><span> </span></span><span>*</span><span><span>; </span><span>base</span></span><span>-</span><span><span>uri</span><span> </span></span><span>'self'</span><span><span>; </span><span>block</span></span><span>-</span><span>all</span><span>-</span><span>mixed</span><span>-</span><span><span>content</span><span>; </span><span>child</span></span><span>-</span><span><span>src</span><span> </span></span><span>'self'</span><span><span> </span><span>render</span><span>.</span></span><span>githubusercontent</span><span>.</span><span>com</span><span><span>; </span><span>connect</span></span><span>-</span><span><span>src</span><span> </span></span><span>'self'</span><span><span> </span><span>uploads</span><span>.</span></span><span>github</span><span>.</span><span>com</span><span><span> </span><span>status</span><span>.</span></span><span>github</span><span>.</span><span>com</span><span><span> </span><span>api</span><span>.</span></span><span>github</span><span>.</span><span>com</span><span><span> </span><span>www</span><span>.</span></span><span>google</span><span>-</span><span><span>analytics</span><span>.</span></span><span>com</span><span><span> </span><span>github</span></span><span>-</span><span><span>cloud</span><span>.</span></span><span>s3</span><span>.</span><span>amazonaws</span><span>.</span><span>com</span><span><span> </span><span>wss</span><span>:</span></span><span>//live.github.com; font-src assets-cdn.github.com; form-action 'self' github.com gist.github.com; frame-src 'self' render.githubusercontent.com; img-src 'self' data: assets-cdn.github.com identicons.github.com www.google-analytics.com collector.githubapp.com *.gravatar.com *.wp.com *.githubusercontent.com; media-src 'none'; object-src assets-cdn.github.com; plugin-types application/x-shockwave-flash; script-src assets-cdn.github.com; style-src 'self' 'unsafe-inline' assets-cdn.github.com</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>X-Frame-Options</li>
</ol><p>这个header主要用来配置哪些网站可以通过frame来加载资源。它主要是用来防止UI redressing 补偿样式攻击。IE8和firefox 18以后的版本都开始支持ALLOW-FROM。chrome和safari都不支持ALLOW-FROM，但是WebKit已经在研究这个了。</p><p>正确的设置</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>X</span><span>-</span><span>Frame</span><span>-</span><span><span>Options</span><span>: </span><span>deny</span><span> </span><span>deny</span><span> – </span><span>禁止所有的资源</span><span>（</span><span>本地或远程</span><span>）</span><span>试图通过frame来加载其他也支持X</span></span><span>-</span><span>Frame</span><span>-</span><span><span>Options</span><span> </span><span>的资源</span><span>。</span></span></div></div><div><div><div>2</div></div><div><span><span>sameorigion</span><span> – </span><span>只允许遵守同源策略的资源</span><span>（</span><span>和站点同源</span><span>）</span><span>通过frame加载那些受保护的资源</span><span>。   </span><span>allow</span></span><span>-</span><span><span>from</span><span> </span><span>http</span><span>:</span></span><span>//www.example.com – 允许指定的资源（必须带上协议http或者https）通过frame来加载受保护的资源。</span></div></div><div><div><div>3</div></div><div><span><span>这个配置只在IE和firefox下面有效</span><span>。</span></span></div></div><div><div><div>4</div></div><div><span><span>其他浏览器则默认允许任何源的资源</span><span>（</span><span>在X</span></span><span>-</span><span>Frame</span><span>-</span><span><span>Options没设置的情况下</span><span>）。</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>Access-Control-Allow-Origin</li>
</ol><p>Access-Control-Allow-Origin是从Cross Origin Resource Sharing (CORS)中分离出来的。这个header是决定哪些网站可以访问资源，通过定义一个通配符来决定是单一的网站还是所有网站可以访问我们的资源。需要注意的是，如果定义了通配符，那么 Access-Control-Allow-Credentials选项就无效了，而且user-agent的cookies不会在请求里发送。</p><p>正确的设置</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Access</span><span>-</span><span>Control</span><span>-</span><span>Allow</span><span>-</span><span><span>Origin</span><span> : </span></span><span>*</span><span> </span><span>*</span><span><span>– </span><span>通配符允许任何远程资源来访问含有Access</span></span><span>-</span><span>Control</span><span>-</span><span>Allow</span><span>-</span><span><span>Origin</span><span> </span><span>的内容</span><span>。   </span><span>http</span><span>:</span></span><span>//www.example.com – 只允许特定站点才能访问(http://[host], 或者 https://[host])</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>7.Public-Key-Pins</p><p>公钥固定（Public Key Pinning）是指一个证书链中必须包含一个白名单中的公钥，也就是说只有被列入白名单的证书签发机构（CA）才能为某个域名*.example.com签发证书，而不是你的浏览器中所存储的任何 CA 都可以为之签发。可以理解为https的证书域名白名单。 ??Public-Key-Pins (PKP)的目的主要是允许网站经营者提供一个哈希过的公共密钥存储在用户的浏览器缓存里。跟Strict-Transport-Security功能相似的是，它能保护用户免遭中间人攻击。这个header可能包含多层的哈希运算，比如pin-sha256=base64(sha256(SPKI))，具体是先将 X.509 证书下的Subject Public Key Info (SPKI) 做sha256哈希运算，然后再做base64编码。然而，这些规定有可能更改，例如有人指出，在引号中封装哈希是无效的，而且在33版本的chrome中也不会保存pkp的哈希到缓存中。</p><p>这个header和 STS的作用很像，因为它规定了最大子域名的数量。此外，pkp还提供了一个Public-Key-Pins-Report-Only 头用来报告异常，但是不会强制阻塞证书信息。当然，这些chrome都是不支持的。</p></section><section><h3>五、使用iframe的风险<a href="#五使用iframe的风险"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>有时前端页面需要用到第三方提供的页面组件</span><span>，</span><span>通常会以iframe的方式引入</span><span>。</span><span>典型的例子是使用iframe在页面上添加第三方提供的广告</span><span>、</span><span>天气预报</span><span>、</span><span>社交分享插件等等</span><span>。</span></span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span><span>iframe在给我们的页面带来更多丰富的内容和能力的同时</span><span>，</span><span>也带来了不少的安全隐患</span><span>。</span><span>因为iframe中的内容是由第三方来提供的</span><span>，</span><span>默认情况下他们不受我们的控制</span><span>，</span><span>他们可以在iframe中运行JavaScirpt脚本</span><span>、</span><span>Flash插件</span><span>、</span><span>弹出对话框等等</span><span>，</span><span>这可能会破坏前端用户体验</span><span>。</span></span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span><span>如果说iframe只是有可能会给用户体验带来影响</span><span>，</span><span>看似风险不大</span><span>，</span><span>那么如果iframe中的域名因为过期而被恶意攻击者抢注</span><span>，</span><span>或者第三方被黑客攻破</span><span>，</span><span>iframe中的内容被替换掉了</span><span>，</span><span>从而利用用户浏览器中的安全漏洞下载安装木马</span><span>、</span><span>恶意勒索软件等等</span><span>，</span><span>这问题可就大了</span><span>。</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如何防御</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>在HTML5中</span><span>，</span><span>iframe有个sandbox安全属性</span><span>，</span><span>通过它可以对iframe的行为进行各种限制</span><span>，</span><span>充分实现</span><span>“</span><span>最小权限</span><span>“</span><span>原则</span><span>。</span><span>例如</span><span>： </span></span><span>&lt;</span><span><span>iframe</span><span> </span><span>sandbox</span><span> </span><span>src</span></span><span>=</span><span>"..."</span><span>&gt;</span><span> </span><span>...</span><span> </span><span>&lt;/</span><span>iframe</span><span>&gt;</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span><span>sandbox提供了丰富的配置参数</span><span>，</span><span>可以进行较为细粒度的控制</span><span>。</span></span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>allow</span><span>-</span><span><span>forms</span><span>：</span><span>允许iframe中提交form表单</span></span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>allow</span><span>-</span><span><span>popups</span><span>：</span><span>允许iframe中弹出新的窗口或者标签页</span><span>（</span><span>例如</span><span>，</span><span>window</span><span>.</span></span><span>open</span><span>()，</span><span>showModalDialog</span><span><span>()，</span><span>target</span></span><span>=</span><span><span>”</span><span>_blank</span><span>”</span><span>等等</span><span>）</span></span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>allow</span><span>-</span><span><span>scripts</span><span>：</span><span>允许iframe中执行JavaScript</span></span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>allow</span><span>-</span><span>same</span><span>-</span><span><span>origin</span><span>：</span><span>允许iframe中的网页开启同源策略</span></span></div></div><div><div><div>8</div></div><div><span><span>更多详细的资料</span><span>，</span><span>可以参考iframe中关于sandbox的介绍</span><span>。</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>六、点击劫持<a href="#六点击劫持"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>这是一种欺骗性比较强</span><span>，</span><span>同时也需要用户高度参与才能完成的一种攻击</span><span>。</span><span>通常的攻击步骤是这样的</span><span>：</span></span></div></div><div><div><div>2</div></div><div><span>　　</span><span>1</span><span><span>、</span><span>攻击者构造一个诱导用户点击的内容</span><span>，</span><span>如Web页面小游戏</span></span></div></div><div><div><div>3</div></div><div><span>　　</span><span>2</span><span><span>、</span><span>将被攻击的页面放入到iframe当中</span></span></div></div><div><div><div>4</div></div><div><span>　　</span><span>3</span><span><span>、</span><span>利用z</span></span><span>-</span><span>index等CSS样式将这个iframe叠加到小游戏的垂直方向的正上方</span></div></div><div><div><div>5</div></div><div><span>　　</span><span>4</span><span><span>、</span><span>把iframe设置为100</span></span><span>%</span><span>透明度</span></div></div><div><div><div>6</div></div><div><span>　　</span><span>5</span><span><span>、</span><span>受害者访问这个页面</span><span>，</span><span>肉眼看到的是一个小游戏</span><span>，</span><span>如果受到诱导进行了点击的话</span><span>，</span><span>实际上点击到的却是iframe中的页面</span></span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span><span>　</span></span><span>点击劫持的危害在于</span><span>，</span><span>攻击利用了受害者的用户身份</span><span>，</span><span>在其不知情的情况下进行一些操作</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如何防御</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>尽量减少第三方依赖</span><span>，</span><span>选用相对成熟的依赖包</span><span>。</span></span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span><span>使用自动化工具检查这些第三方代码有没有安全问题</span><span>，</span></span><span>比如NSP</span><span><span>(</span><span>Node</span><span> </span><span>Security</span><span> </span><span>Platform</span><span>)，</span><span>Snyk等等</span><span>。</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>七、错误的内容推断<a href="#七错误的内容推断"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>攻击场景</span><span>：</span><span>某网站允许用户在评论里上传图片</span><span>，</span><span>攻击者将含有恶意JavaScript的脚本文件扩展名改成图片格式进行上传</span><span>（</span><span>这涉及到了恶意文件上传这个常见安全问题</span><span>，</span><span>但是由于和前端相关度不高因此暂不详细介绍</span><span>）。</span><span>接下来</span><span>，</span><span>受害者在访问这段评论的时候</span><span>，</span><span>浏览器会去请求这个伪装成图片的JavaScript脚本</span><span>，</span><span>而此时如果浏览器错误的推断了这个响应的内容类型</span><span>（</span></span><span>MIME</span><span><span> </span><span>types</span><span>），</span><span>那么就会把这个图片文件当做JavaScript脚本执行</span><span>，</span><span>于是攻击也就成功了</span><span>。</span></span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span><span>问题的关键</span><span>：</span><span>后端服务器在返回的响应中设置的Content</span></span><span>-</span><span><span>Type</span><span> </span><span>Header仅仅只是给浏览器提供当前响应内容类型的建议</span><span>，</span><span>而浏览器有可能会自作主张的根据响应中的实际内容去推断内容的类型</span><span>。</span></span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span><span>上例中</span><span>，</span><span>后端通过Content</span></span><span>-</span><span><span>Type</span><span> </span><span>Header建议浏览器按图片来渲染HTTP响应</span><span>，</span><span>但浏览器发现响应的其实是JavaScript</span><span>，</span><span>于是就擅自做主把这段响应当做JS脚本来解释执行</span><span>，</span><span>安全问题也就产生了</span><span>。</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如何防御</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>浏览器根据响应内容来推断其类型</span><span>，</span><span>本来这是个很</span><span>“</span><span>智能</span><span>”</span><span>的功能</span><span>，</span><span>是浏览器强大的容错能力的体现</span><span>，</span><span>但是却会带来安全风险</span><span>。</span><span>要避免出现这样的安全问题</span><span>，</span><span>办法就是通过设置X</span></span><span>-</span><span>Content</span><span>-</span><span>Type</span><span>-</span><span><span>Options这个HTTP</span><span> </span><span>Header明确禁止浏览器去推断响应类型</span><span>。</span></span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span><span>同样是上面的攻击场景</span><span>，</span><span>后端服务器返回的Content</span></span><span>-</span><span><span>Type建议浏览器按照图片进行内容渲染</span><span>，</span><span>浏览器发现有X</span></span><span>-</span><span>Content</span><span>-</span><span>Type</span><span>-</span><span><span>Options</span><span> </span></span><span>HTTP</span><span><span> </span><span>Header的存在</span><span>，</span><span>并且其参数值是nosniff</span><span>，</span><span>因此不会再去推断内容类型</span><span>，</span><span>而是强制按照图片进行渲染</span><span>，</span><span>从而最终防止了安全问题的发生</span><span>。</span></span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>更多关于X</span><span>-</span><span>Content</span><span>-</span><span>Type</span><span>-</span><span><span>Options的细节请参考</span><span>：</span><span>https</span><span>:</span></span><span>//developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>八、不安全的第三方依赖包<a href="#八不安全的第三方依赖包"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>现如今进行应用开发</span><span>，</span><span>无论是后端服务器应用还是前端应用开发</span><span>，</span><span>绝大多数时候我们都是在借助开发框架和各种类库进行快速开发</span><span>。</span></span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span><span>这样做的好处显而易见</span><span>，</span><span>但是与此同时安全风险也在不断累积</span><span>——</span><span>应用使用了如此多的第三方代码</span><span>，</span><span>不论应用自己的代码的安全性有多高</span><span>，</span><span>一旦这些来自第三方的代码有安全漏洞</span><span>，</span><span>那么对应用整体的安全性依然会造成严峻的挑战</span><span>。</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如何防御</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>尽量减少第三方依赖</span><span>，</span><span>选用相对成熟的依赖包</span><span>。</span></span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span><span>使用自动化工具检查这些第三方代码有没有安全问题</span><span>，</span></span><span>比如NSP</span><span><span>(</span><span>Node</span><span> </span><span>Security</span><span> </span><span>Platform</span><span>)，</span><span>Snyk等等</span><span>。</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>九、HTTPS中间人攻击<a href="#九https中间人攻击"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>即使是服务器端开启了HTTPS</span><span>，</span><span>也还是存在安全隐患</span><span>，</span><span>黑客可以利用SSL</span><span> </span><span>Stripping这种攻击手段</span><span>，</span><span>强制让HTTPS降级回HTTP</span><span>，</span><span>从而继续进行中间人攻击</span><span>。</span></span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span><span>问题的本质在于浏览器发出去第一次请求就被攻击者拦截了下来并做了修改</span><span>，</span><span>根本不给浏览器和服务器进行HTTPS通信的机会</span><span>。</span><span>大致过程如下</span><span>，</span><span>用户在浏览器里输入URL的时候往往不是从https</span><span>:</span></span><span>//开始的，而是直接从域名开始输入，随后浏览器向服务器发起HTTP通信，然而由于攻击者的存在，它把服务器端返回的跳转到HTTPS页面的响应拦截了，并且代替客户端和服务器端进行后续的通信。由于这一切都是暗中进行的，所以使用前端应用的用户对此毫无察觉。</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如何防御</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>解决这个安全问题的办法是使用HSTS</span><span>（</span></span><span>HTTP</span><span><span> </span><span>Strict</span><span> </span><span>Transport</span><span> </span><span>Security</span><span>），</span><span>它通过下面这个HTTP</span><span> </span><span>Header以及一个预加载的清单</span><span>，</span><span>来告知浏览器在和网站进行通信的时候强制性的使用HTTPS</span><span>，</span><span>而不是通过明文的HTTP进行通信</span><span>：</span></span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>Strict</span><span>-</span><span>Transport</span><span>-</span><span><span>Security</span><span>: </span><span>max</span></span><span>-</span><span>age</span><span>=</span><span><span>; </span><span>includeSubDomains</span><span>; </span><span>preload</span></span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span><span>这里的</span><span>“</span><span>强制性</span><span>”</span><span>表现为浏览器无论在何种情况下都直接向服务器端发起HTTPS请求</span><span>，</span><span>而不再像以往那样从HTTP跳转到HTTPS</span><span>。</span><span>另外</span><span>，</span><span>当遇到证书或者链接不安全的时候</span><span>，</span><span>则首先警告用户</span><span>，</span><span>并且不再让用户选择是否继续进行不安全的通信</span><span>。</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>十、本地存储数据泄露<a href="#十本地存储数据泄露"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>随着前后端分离</span><span>，</span><span>尤其是后端服务无状态化架构风格的兴起</span><span>，</span><span>随着SPA应用大量出现</span><span>，</span><span>存储在前端数据量也在逐渐增多</span><span>。</span></span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span><span>前端应用是完全暴露在用户以及攻击者面前的</span><span>，</span><span>在前端存储任何敏感</span><span>、</span><span>机密的数据</span><span>，</span><span>都会面临泄露的风险</span><span>，</span><span>就算是在前端通过JS脚本对数据进行加密基本也无济于事</span><span>。</span></span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span><span>尽管有浏览器的同源策略限制</span><span>，</span><span>但是如果前端应用有XSS漏洞</span><span>，</span><span>那么本地存储的所有数据就都可能被攻击者的JS脚本读取到</span><span>。</span><span>如果用户在公用电脑上使用了这个前端应用</span><span>，</span><span>那么当用户离开后</span><span>，</span><span>这些数据是否也被彻底清除了呢</span><span>？</span><span>前端对数据加密后再存储看上去是个防御办法</span><span>，</span><span>但其实仅仅提高了一点攻击门槛而已</span><span>，</span><span>因为加密所用到的密钥同样存储在前端</span><span>，</span><span>有耐心的攻击者依然可以攻破加密这道关卡</span><span>。</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如何防御</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>在前端存储敏感</span><span>、</span><span>机密信息始终都是一件危险的事情</span><span>，</span><span>推荐的做法是尽可能不在前端存这些数据</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>十一、CDN劫持/污染<a href="#十一cdn劫持污染"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>以出于性能考虑</span><span>，</span><span>前端应用通常会把一些静态资源存放到CDN上</span><span>，</span><span>再提高前端应用的访问速度的同时也隐含了一个新的安全风险</span><span>。</span></span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span><span>如果攻击者劫持了CDN</span><span>，</span><span>或者对CDN中的资源进行了污染</span><span>，</span><span>那么我们的前端应用拿到的就是有问题的JS脚本或者Stylesheet文件</span><span>。</span><span>这种攻击方式造成的效果和XSS跨站脚本攻击相似</span><span>。</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如何防御</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>防御这种攻击的办法是使用浏览器提供的SRI</span><span>（</span><span>Subresource</span><span> </span><span>Integrity</span><span>）</span><span>功能</span><span>。</span></span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span><span>每个资源文件都有一个SRI值</span><span>。</span><span>由两部分组成</span><span>，</span><span>减号</span><span>（</span></span><span>-</span><span><span>）</span><span>左侧是生成SRI值用到的哈希算法名</span><span>，</span><span>右侧是经过Base64编码后的该资源文件的Hash值</span><span>。</span></span><span>&lt;</span><span><span>script</span><span> </span><span>src</span></span><span>=</span><span>"“https://example.js”"</span><span><span> </span><span>integrity</span></span><span>=</span><span>"“sha384-eivAQsRgJIi2KsTdSnfoEGIRTo25NCAqjNJNZalV63WKX3Y51adIzLT4So1pk5tX”"</span><span>/&gt;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span><span>浏览器在处理这个script元素的时候</span><span>，</span><span>就会检查对应的JS脚本文件的完整性</span><span>，</span><span>看其是否和script元素中integrity属性指定的SRI值一致</span><span>，</span><span>如果不匹配</span><span>，</span><span>浏览器则会中止对这个JS脚本的处理</span><span>。</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h5>参考地址<a href="#参考地址"><span>#</span></a></h5><p><a href="https://www.cnblogs.com/AdamFamily/p/10059253.html" target="_blank">https://www.cnblogs.com/AdamFamily/p/10059253.html</a></p><p><a href="https://cloud.tencent.com/developer/article/1008829" target="_blank">https://cloud.tencent.com/developer/article/1008829</a></p><p><a href="https://blog.csdn.net/weixin_41088946/article/details/107101049" target="_blank">https://blog.csdn.net/weixin_41088946/article/details/107101049</a></p><p><a href="https://wenku.baidu.com/view/3a0762f90242a8956bece42e.html" target="_blank">https://wenku.baidu.com/view/3a0762f90242a8956bece42e.html</a></p></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/%E8%A7%A3%E5%86%B3%E6%8E%A7%E5%88%B6%E5%8F%B0%E6%8A%A5%E9%BB%84%60passive%20event%20listener%20to%20a%20scroll-blocking%20&apos;touchmove&apos;%20event.%20Consider%20mark%60/</id>
      <title type="text">开发过程中遇到的报黄及解决</title>
      <published>2019-07-31T00:00:00.000Z</published>
      <updated>2019-07-31T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/%E8%A7%A3%E5%86%B3%E6%8E%A7%E5%88%B6%E5%8F%B0%E6%8A%A5%E9%BB%84%60passive%20event%20listener%20to%20a%20scroll-blocking%20&apos;touchmove&apos;%20event.%20Consider%20mark%60/"/>
      <summary type="text">解决控制台报黄`passive event listener to a scroll-blocking &apos;touchmove&apos; event. Consider mark`</summary>
      <content type="html"><![CDATA[<section><h3>解决控制台报黄<code>passive event listener to a scroll-blocking 'touchmove' event. Consider mark</code><a href="#解决控制台报黄passive-event-listener-to-a-scroll-blocking-touchmove-event-consider-mark"><span>#</span></a></h3><ul>
<li>1.下载插件</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>npm</span><span> </span><span>i</span><span> </span></span><span>default</span><span>-</span><span>passive</span><span>-</span><span><span>events</span><span> </span></span><span>-</span><span>S</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p>2、main.js中加入：<code>import 'default-passive-events'</code></p>
</li>
<li>
<p>报黄原因：Chrome51 版本以后，Chrome 增加了新的事件捕获机制－Passive Event Listeners；Passive Event Listeners：就是告诉前页面内的事件监听器内部是否会调用preventDefault函数来阻止事件的默认行为，以便浏览器根据这个信息更好地做出决策来优化页面性能。当属性passive的值为true的时候，代表该监听器内部不会调用preventDefault函数来阻止默认滑动行为，Chrome浏览器称这类型的监听器为被动（passive）监听器。目前Chrome主要利用该特性来优化页面的滑动性能，所以Passive Event Listeners特性当前仅支持mousewheel/touch相关事件。</p>
</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/%E8%A7%A3%E5%86%B3Chrome%E5%8A%A8%E7%94%BB%E2%80%9D%E5%8D%A1%E9%A1%BF%E2%80%9D%E7%9A%84%E5%8A%9E%E6%B3%95/</id>
      <title type="text">解决Chrome动画 卡顿 的办法</title>
      <published>2018-08-31T00:00:00.000Z</published>
      <updated>2018-08-31T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/%E8%A7%A3%E5%86%B3Chrome%E5%8A%A8%E7%94%BB%E2%80%9D%E5%8D%A1%E9%A1%BF%E2%80%9D%E7%9A%84%E5%8A%9E%E6%B3%95/"/>
      <summary type="text">解决Chrome动画”卡顿”的办法</summary>
      <content type="html"><![CDATA[<p>解决Chrome动画”卡顿”的办法,为动画DOM元素添加CSS3样式</p>

<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>-webkit-transform:transition3d(0</span><span>,</span><span>0</span><span>,</span><span>0</span></span><span>);</span></div></div><div><div><div>2</div></div><div><span>//</span><span>或</span></div></div><div><div><div>3</div></div><div><span>-webkit-transform:translateZ(0</span><span>);</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>这两个属性都会开启GPU硬件加速模式，从而让览器在渲染动画时从CPU转向GPU;</p>
</li>
<li>
<p>其实说白了这是一个小伎俩，也可以算是一个Hack，-webkit-transform:transition3d和-webkit-transform，但我们设置值为0后，并没有真正使用3D效果，但浏览器却因此开启了GPU硬件加速模式。</p>
</li>
<li>
<p>这种GPU硬件加速在当今PC机及移动设备上都已普及，在移动端的性能提升是相当显著地，所以建议大家在做动画时可以尝试一下开启GPU硬件加速。</p>
</li>
<li>
<p>当然也可以这样开启所有浏览器的GPU硬件加速：</p>
</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>webkit-transform</span><span>: translateZ(0</span><span>);</span></div></div><div><div><div>2</div></div><div><span>-moz-transform: translateZ(0</span><span>);</span></div></div><div><div><div>3</div></div><div><span>-ms-transform: translateZ(0</span><span>);</span></div></div><div><div><div>4</div></div><div><span>-o-transform: translateZ(0</span><span>);</span></div></div><div><div><div>5</div></div><div><span>transform: translateZ(0</span><span>);</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>或者:</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>webkit-transform</span><span><span>: translate3d(0</span><span>,</span><span>0</span><span>,</span><span>0</span></span><span>);</span></div></div><div><div><div>2</div></div><div><span><span>-moz-transform: translate3d(0</span><span>,</span><span>0</span><span>,</span><span>0</span></span><span>);</span></div></div><div><div><div>3</div></div><div><span><span>-ms-transform: translate3d(0</span><span>,</span><span>0</span><span>,</span><span>0</span></span><span>);</span></div></div><div><div><div>4</div></div><div><span><span>-o-transform: translate3d(0</span><span>,</span><span>0</span><span>,</span><span>0</span></span><span>);</span></div></div><div><div><div>5</div></div><div><span><span>transform: translate3d(0</span><span>,</span><span>0</span><span>,</span><span>0</span></span><span>);</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>使用<code>-webkit-transform:transition3d(0,0,0)</code>开启<code>GPU</code>硬件加速的<code>chrome</code>中渲染动画性能明显顺畅了许多</li>
</ul>
<section><h3>chrome诡异的Bug<a href="#chrome诡异的bug"><span>#</span></a></h3><ul>
<li>
<p>对所有动画DOM元素添加<code>-webkit-transform:transition3d(0,0,0)</code>开启GPU硬件加速之后，又出现了一个<code>chrome</code>诡异的Bug</p>
</li>
<li>
<p>当你有多个<code>position:absolute;</code>元素添加<code>-webkit-transform:transition3d(0,0,0);</code>开启<code>GPU</code>硬件加速之后，会有几个元素凭空消失</p>
</li>
<li>
<p>这可能是跟添加<code>-webkit-transform</code>之后<code>chrome</code>尝试使用<code>GPU</code>硬件加速有关系，最后还是要等待<code>Chrome</code>官方更新解决了，当前<code>Chrome</code>版本是33。如果谁发现比较好的解决办法，欢迎提出^_^</p>
</li>
</ul><section><h4>如何避免这个问题<a href="#如何避免这个问题"><span>#</span></a></h4><ul>
<li>
<p>在使用<code>-webkit-transform</code>尝试对很多<code>DOM</code>元素编写3D动画时，尽量不要对这些元素及他们的父元素使用<code>position:absolute/fixed</code>。(其实这种情况很难避免)</p>
</li>
<li>
<p>临时解决办法是,减少使用<code>-webkit-transform:transition3d(0,0,0)</code>的<code>DOM</code>元素数量，例如从9个减至6个就没有元素消失的现象了。</p>
</li>
</ul></section></section>
<section><h3>开启GPU硬件加速可能触发的问题<a href="#开启gpu硬件加速可能触发的问题"><span>#</span></a></h3><ul>
<li>通过<code>-webkit-transform:transition3d/translateZ</code>开启<code>GPU</code>硬件加速之后，有些时候可能会导致浏览器频繁闪烁或抖动，可以尝试以下办法解决之:</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>-webkit-backface-visibility:hidden;</span></div></div><div><div><div>2</div></div><div><span>-webkit-perspective:1000;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h3>如何监测动画帧速率<a href="#如何监测动画帧速率"><span>#</span></a></h3><ul>
<li>推荐两种实时监测网页渲染帧速率的方法：
<ul>
<li>1.<code>Chrome</code>的<code>DevTool</code>中<code>TimeLine</code>的<code>Frame</code>模块</li>
<li>2.地址栏输入”<code>chrome:flags</code>”搜索”<code>fps</code>”，将”FPS计数器”开启，浏览器重启后右上角会实时显示帧速率。</li>
</ul>
</li>
</ul></section>
<section><h3>通过-webkit-transform/translateZ开启GPU硬件加速的适用范围<a href="#通过-webkit-transformtranslatez开启gpu硬件加速的适用范围"><span>#</span></a></h3><ul>
<li>
<p>使用很多大尺寸图片(尤其是<code>PNG24</code>图)进行动画的页面。</p>
</li>
<li>
<p>页面有很多大尺寸图片并且进行了<code>css</code>缩放处理，页面可以滚动时。</p>
</li>
<li>
<p>使用<code>background-size:cover</code>设置大尺寸背景图，并且页面可以滚动时。(详见:<a href="https://coderwall.com/p/j5udlw" target="_blank">https://coderwall.com/p/j5udlw</a>)</p>
</li>
<li>
<p>编写大量<code>DOM</code>元素进行<code>CSS3</code>动画时(<code>transition</code>/<code>transform</code>/<code>keyframes</code>/<code>absTop</code>&amp;<code>Left</code>)</p>
</li>
<li>
<p>使用很多<code>PNG</code>图片拼接成<code>CSS Sprite</code>时</p>
</li>
<li>
<p><strong>暂时只有这五种情况，欢迎大家补充</strong></p>
</li>
</ul><section><h4>通过开启GPU硬件加速虽然可以提升动画渲染性能或解决一些棘手问题，但使用仍需谨慎，使用前一定要进行严谨的测试，否则它反而会大量占用浏览网页用户的系统资源，尤其是在移动端，肆无忌惮的开启GPU硬件加速会导致大量消耗设备电量，降低电池寿命等问题。<a href="#通过开启gpu硬件加速虽然可以提升动画渲染性能或解决一些棘手问题但使用仍需谨慎使用前一定要进行严谨的测试否则它反而会大量占用浏览网页用户的系统资源尤其是在移动端肆无忌惮的开启gpu硬件加速会导致大量消耗设备电量降低电池寿命等问题"><span>#</span></a></h4><blockquote><p>参考地址:<a href="http://blog.bingo929.com/transform-translate3d-translatez-transition-gpu-hardware-acceleration.html" target="_blank">http://blog.bingo929.com/transform-translate3d-translatez-transition-gpu-hardware-acceleration.html</a></p></blockquote></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/JS%E5%B0%86%E5%AF%B9%E8%B1%A1%E8%BD%AC%E5%8C%96%E4%B8%BA%E6%95%B0%E7%BB%84/</id>
      <title type="text">JS将对象转化为数组</title>
      <published>2018-08-26T00:00:00.000Z</published>
      <updated>2018-08-26T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/JS%E5%B0%86%E5%AF%B9%E8%B1%A1%E8%BD%AC%E5%8C%96%E4%B8%BA%E6%95%B0%E7%BB%84/"/>
      <summary type="text">JS将对象转化为数组</summary>
      <content type="html"><![CDATA[<section><h2>将对象转化为数组<a href="#将对象转化为数组"><span>#</span></a></h2><ul>
<li>方法一</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>let</span><span><span> </span><span>obj</span></span><span>=</span><span>{</span><span>a</span><span>:</span><span>1</span><span>,</span><span>b</span><span>:</span><span>2</span><span>}</span></div></div><div><div><div>2</div></div><div><span>let</span><span><span> </span><span>arr</span><span> </span></span><span>=</span><span> []</span></div></div><div><div><div>3</div></div><div><span>let</span><span><span> </span><span>x</span></span><span>=</span><span><span>Object</span><span>.</span></span><span>entries</span><span><span>(</span><span>obj</span><span>)</span></span><span>//[["a", 1],["b", 2]]</span></div></div><div><div><div>4</div></div><div><span>arr</span><span>=</span><span><span>x</span><span>.</span></span><span>map</span><span><span>(</span><span>item</span></span><span>=&gt;</span><span>{</span></div></div><div><div><div>5</div></div><div><span>    </span><span>return</span><span><span> </span><span>item</span><span>[</span></span><span>1</span><span>]</span></div></div><div><div><div>6</div></div><div><span>})</span></div></div><div><div><div>7</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>arr</span><span>)</span></span><span>//[1,2]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>方法二</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>let</span><span><span> </span><span>obj</span></span><span>=</span><span>{</span><span>a</span><span>:</span><span>1</span><span>,</span><span>b</span><span>:</span><span>2</span><span>}</span></div></div><div><div><div>2</div></div><div><span>let</span><span><span> </span><span>arr</span><span> </span></span><span>=</span><span> []</span></div></div><div><div><div>3</div></div><div><span>for</span><span> (</span><span>let</span><span><span> </span><span>i</span><span> </span></span><span>in</span><span><span> </span><span>obj</span><span>) {</span></span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>arr</span><span>.</span><span>push</span><span><span>(</span><span>obj</span><span>[</span><span>i</span><span>]); </span></span><span>//属性</span></div></div><div><div><div>5</div></div><div><span>    </span><span>//arr.push(obj[i]); //值</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>arr</span><span>);</span></span><span>//[1,2]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>方法三</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>let</span><span><span> </span><span>obj</span></span><span>=</span><span>{</span><span>a</span><span>:</span><span>1</span><span>,</span><span>b</span><span>:</span><span>2</span><span>}</span></div></div><div><div><div>2</div></div><div><span>let</span><span><span> </span><span>arr</span><span> </span></span><span>=</span><span><span> </span><span>Object</span><span>.</span></span><span>values</span><span><span>(</span><span>obj</span><span>)</span></span></div></div><div><div><div>3</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>arr</span><span>);</span></span><span>//[1,2]</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/vuejs%E5%9F%BA%E7%A1%80/</id>
      <title type="text">Vuejs基础</title>
      <published>2018-08-26T00:00:00.000Z</published>
      <updated>2018-08-26T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/vuejs%E5%9F%BA%E7%A1%80/"/>
      <summary type="text">Vuejs基础</summary>
      <content type="html"><![CDATA[<section><h2>Vue.js是什么<a href="#vuejs是什么"><span>#</span></a></h2><ul>
<li>Vue.js（读音 /vjuː/，类似于 view） 是一套构建用户界面的<strong>渐进式框架</strong>。</li>
<li>与其他重量级框架不同的是，Vue 采用自底向上增量开发的设计。Vue 的核心库只关注视图层，它不仅易于上手，还便于与第三方库或既有项目整合。另一方面，当与单文件组件和 Vue 生态系统支持的库结合使用时，Vue 也完全能够为复杂的单页应用程序提供驱动。</li>
</ul></section>
<section><h2>vue的特点<a href="#vue的特点"><span>#</span></a></h2><ul>
<li>核心只关注视图层(view)</li>
<li>易学，轻量，灵活</li>
<li>适用于移动端项目</li>
<li>渐进式框架</li>
</ul></section>
<section><h2>框架和库<a href="#框架和库"><span>#</span></a></h2><ul>
<li>
<p>框架 (vue的核心是库，但是我们用的时候，用的就是他的框架了)</p>
<blockquote><p>总结&lt;拥有完整的解决方案&gt;，我们写好，人家调用我（被动）</p></blockquote>
</li>
<li>
<p>库</p>
<ul>
<li>jquery</li>
<li>underscore模板库(模板引擎)</li>
<li>zepto</li>
<li>animate.css动画库</li>
</ul>
</li>
<li>
<p>总结:</p>
</li>
<li>
<p>共同点&lt;要用的时候&gt; 直接调用一下即可</p>
</li>
<li>
<p>人家写好，我们调用他（主动）</p>
</li>
</ul></section>
<section><h2>渐进式(渐进增强&lt;低版本不支持&gt;，做成支持的，让高版本的更炫更支持)<a href="#渐进式渐进增强做成支持的让高版本的更炫更支持"><span>#</span></a></h2><ul>
<li>vue全家桶
<ul>
<li>核心</li>
<li>vue-router 可以帮我们实现一个单页应用</li>
<li>vuex 状态管理，可以帮我们完成组件化开发</li>
<li>axios 用来获取数据的</li>
</ul>
</li>
<li>通过组合完成一个完整的框架</li>
</ul><blockquote><p>渐进式的理解</p></blockquote><ul>
<li>声明式渲染(无需关心如何实现)</li>
<li>组件系统</li>
<li>客户端路由(vue-router)</li>
<li>大规模状态管理(vuex)</li>
<li>构建工具(vue-cli)</li>
</ul></section>
<section><h2>vue的两个核心点<a href="#vue的两个核心点"><span>#</span></a></h2><ul>
<li>
<p>响应的数据变化</p>
<ul>
<li>当数据发生改变-&gt;视图自动更新</li>
</ul>
</li>
<li>
<p>组合的视图组件</p>
<ul>
<li>ui页面映射为组件树</li>
<li>划分组件可维护、可复用、可测试</li>
</ul>
</li>
</ul></section>
<section><h2>MVVM模式&lt;双向绑定&gt;(angular、vue框架)<a href="#mvvm模式angularvue框架"><span>#</span></a></h2><ul>
<li>M</li>
<li>V</li>
<li>viewModel视图模型</li>
</ul></section>
<section><h2>MVC模式&lt;单向&gt;(backbone框架)<a href="#mvc模式backbone框架"><span>#</span></a></h2><ul>
<li>M</li>
<li>V</li>
<li>C</li>
</ul></section>
<section><h2>vue优点<a href="#vue优点"><span>#</span></a></h2><ul>
<li>数据驱动(主要操作的是数据,几乎不直接操作dom)</li>
</ul></section>
<section><h2>如何安装vue<a href="#如何安装vue"><span>#</span></a></h2><ul>
<li>
<ol>
<li>通过bower
安装bower: <code>npm install bower -g</code>
mac本: <code>sudo npm install bower -g</code>
查看vue的版本 ： <code>bower info vue</code>
安装vue：<code>bower install vue@1.0.28</code></li>
</ol>
</li>
<li>
<ol>
<li>通过npm安装
通过npm: <code>npm install vue</code>
通过npm全局安装: <code>npm install vue -g</code></li>
</ol>
</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/%E7%AE%AD%E5%A4%B4%E5%87%BD%E6%95%B0/</id>
      <title type="text">箭头函数</title>
      <published>2018-08-26T00:00:00.000Z</published>
      <updated>2018-08-26T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/%E7%AE%AD%E5%A4%B4%E5%87%BD%E6%95%B0/"/>
      <summary type="text">箭头函数、ES6</summary>
      <content type="html"><![CDATA[<blockquote><p>箭头函数&lt;不具备this和arguments&gt;，自己家没有this就会往上级找this，从而解决this的指向问题。</p></blockquote>

<section><h2>如何更改this指向<a href="#如何更改this指向"><span>#</span></a></h2><ul>
<li>1)call、apply、bind</li>
<li>2)var that=this;</li>
<li>3)箭头函数</li>
</ul></section>
<section><h2>如何确定this是谁<a href="#如何确定this是谁"><span>#</span></a></h2><p>看谁调用的，点前面是谁，this就是谁</p></section>
<section><h2>箭头函数怎么写<a href="#箭头函数怎么写"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>//将下列函数改为箭头函数</span></div></div><div><div><div>2</div></div><div><span>function</span><span> </span><span>a</span><span><span>(</span><span>b</span><span>){</span></span></div></div><div><div><div>3</div></div><div><span>    </span><span>return</span><span><span> </span><span>b</span></span><span>+</span><span>1</span><span>;</span></div></div><div><div><div>4</div></div><div><span>}</span></div></div><div><div><div>5</div></div><div><span>//第一步:</span></div></div><div><div><div>6</div></div><div><span>let</span><span> </span><span>a</span><span>=</span><span><span>(</span><span>b</span><span>)</span></span><span>=&gt;</span><span>{</span><span>return</span><span><span> </span><span>b</span></span><span>+</span><span>1</span><span>;}</span></div></div><div><div><div>7</div></div><div><span>//第二步(简化):</span></div></div><div><div><div>8</div></div><div><span>let</span><span> </span><span>a</span><span>=</span><span>b</span><span>=&gt;</span><span>b</span><span>+</span><span>1</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p>总结：</p></blockquote><ul>
<li>箭头函数中没有<code>function</code>关键字，去掉<code>function</code>关键字</li>
<li>当形参只有一个的时候，可以省略小括号</li>
<li>小括号和大括号之间有一个箭头：有大括号，必须要写<code>return</code>;如果没有大括号，表示箭头后面的结果就是<code>return</code>的结果</li>
</ul><p>将下列函数改为箭头函数:</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>a</span><span><span>(</span><span>b</span><span>){</span></span></div></div><div><div><div>2</div></div><div><span>    </span><span>return</span><span> </span><span>function</span><span><span>(</span><span>c</span><span>){</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>return</span><span><span> </span><span>b</span></span><span>+</span><span>c</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div><div><div><div>6</div></div><div><span>a</span><span>(</span><span>1</span><span>)(</span><span>2</span><span>)</span><span>// 3 -&gt; 先执行a 再执行里面的匿名函数</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>箭头函数:</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>//第一步</span></div></div><div><div><div>2</div></div><div><span>let</span><span> </span><span>a</span><span>=</span><span>b</span><span>=&gt;</span><span>{</span></div></div><div><div><div>3</div></div><div><span>    </span><span>return</span><span> </span><span>function</span><span><span>(</span><span>c</span><span>){</span></span></div></div><div><div><div>4</div></div><div><span>        </span><span>return</span><span><span> </span><span>b</span></span><span>+</span><span>c</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div><span>//第二步:删除function和一个形参的小括号</span></div></div><div><div><div>8</div></div><div><span>let</span><span> </span><span>a</span><span>=</span><span>b</span><span>=&gt;</span><span>{</span></div></div><div><div><div>9</div></div><div><span>    </span><span>return</span><span><span> </span><span>c</span></span><span>=&gt;</span><span>{</span></div></div><div><div><div>10</div></div><div><span>        </span><span>return</span><span><span> </span><span>b</span></span><span>+</span><span>c</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span>}</span></div></div><div><div><div>13</div></div><div><span>//第三步:删return和大括号</span></div></div><div><div><div>14</div></div><div><span>let</span><span> </span><span>a</span><span>=</span><span>b</span><span>=&gt;</span><span>c</span><span>=&gt;</span><span>b</span><span>+</span><span><span>c</span><span> </span></span><span>//高阶函数(俩个箭头及两个以上箭头的)</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>闭包<a href="#闭包"><span>#</span></a></h2><ul>
<li>函数执行的一瞬间</li>
<li>导致内存泄漏-&gt;因为会产出不销毁的作用域</li>
<li>当执行后返回的结果必须是引用数据类型，被外界变量接收，此时这个函数不会销毁</li>
<li>作用&lt;私有化&gt;</li>
<li>闭包能干什么&lt;模块化&gt;</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>//以下函数不是闭包:</span></div></div><div><div><div>2</div></div><div><span>function</span><span> </span><span>a</span><span><span>(</span><span>b</span><span>){</span></span></div></div><div><div><div>3</div></div><div><span>    </span><span>return</span><span> </span><span>function</span><span><span>(</span><span>c</span><span>){</span></span></div></div><div><div><div>4</div></div><div><span>        </span><span>return</span><span><span> </span><span>b</span></span><span>+</span><span>c</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div><span>a</span><span>(</span><span>1</span><span>)</span></div></div><div><div><div>8</div></div><div><span>a</span><span>(</span><span>1</span><span>)(</span><span>2</span><span>)</span></div></div><div><div><div>9</div></div><div><span>//不是闭包的原因:函数执行的一瞬间确实有形成闭包，但是函数执行完成后，作用域就被销毁了，所以不是闭包</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>//以下函数是闭包:</span></div></div><div><div><div>12</div></div><div><span>let</span><span> </span><span>a</span><span>=</span><span>function</span><span><span> (</span><span>b</span><span>){</span></span></div></div><div><div><div>13</div></div><div><span>  </span><span>return</span><span> </span><span>function</span><span><span>(</span><span>c</span><span>){</span></span></div></div><div><div><div>14</div></div><div><span>      </span><span>return</span><span><span> </span><span>b</span></span><span>+</span><span>c</span></div></div><div><div><div>15</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>}();</span></div></div><div><div><div>17</div></div><div><span>//是闭包的原因:函数执行的一瞬间确实有形成闭包,当执行后返回的结果是引用数据类型，被外界变量a接收，此时这个函数不会销毁,会产出不销毁的作用域,容易导致内存泄漏，所以是闭包</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><p>在vue中很多时候不能用箭头函数</p></blockquote></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/JS%E6%95%B0%E7%BB%84%E4%B8%AD%E7%9A%84%E6%96%B9%E6%B3%952/</id>
      <title type="text">JS数组中的方法2</title>
      <published>2018-08-20T00:00:00.000Z</published>
      <updated>2018-08-20T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/JS%E6%95%B0%E7%BB%84%E4%B8%AD%E7%9A%84%E6%96%B9%E6%B3%952/"/>
      <summary type="text">JS数组中的方法2:forEach、filter、map、some、every、reduce、includes(es6)、find(es6)</summary>
      <content type="html"><![CDATA[<section><h2>保证node的版本<a href="#保证node的版本"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>node -v //查询node版本</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>最好升级到8.5以上版本</li>
</ul></section>
<section><h2>编译器<a href="#编译器"><span>#</span></a></h2><ul>
<li>webstorm版本&gt;2017以上版本</li>
<li>vscode</li>
<li>sublime</li>
</ul></section>
<section><h2>webstorm配置npm和语法<a href="#webstorm配置npm和语法"><span>#</span></a></h2><ul>
<li>File-&gt;Setting中配置 每打开一个项目都要重新配置</li>
<li>File-&gt;Default Setting 中配置后 以后就不用配置了
<ul>
<li>react jsx 语法是支持react的语法 包含es6语法 可以直接使用jsx语法</li>
</ul>
</li>
</ul><section><h3>1.forEach(没有返回值)<a href="#1foreach没有返回值"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>let</span><span><span> </span><span>arr</span></span><span>=</span><span>[</span><span>1</span><span>,</span><span>2</span><span>,</span><span>3</span><span>,</span><span>4</span><span>,</span><span>5</span><span>]</span></div></div><div><div><div>2</div></div><div><span>for</span><span>(</span><span>let</span><span><span> </span><span>i</span></span><span>=</span><span>0</span><span><span>;</span><span>i</span></span><span>&lt;</span><span><span>arr</span><span>.</span></span><span>length</span><span><span>;</span><span>i</span></span><span>++</span><span>){</span><span>//纯编程的 编程式语法:自己调用循环 可以很明确的看出来代码怎么执行的</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>arr</span><span>[</span><span>i</span><span>])</span></span></div></div><div><div><div>4</div></div><div><span>}</span></div></div><div><div><div>5</div></div><div><span><span>arr</span><span>.</span></span><span>forEach</span><span>(</span><span>function</span><span><span>(</span><span>item</span><span>){</span></span><span>//声明式语法 好处:不关心如何实现 不支持return，不管写不写return都会执行完</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span><span>（</span><span>item</span><span>）</span></span></div></div><div><div><div>7</div></div><div><span><span>},</span><span>改变this指向</span><span>)</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p>面试题
<code>forEach</code>，<code>for in</code>，<code>for</code>，<code>for of</code>的区别（为什么遍历数组的时候不采用<code>for in</code>）</p>
<ul>
<li>按理说 索引应该是数字number数据类型的，但是<code>for in</code>循环中key会变成<code>string</code>字符串数据类型</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>for</span><span>(</span><span>let</span><span><span> </span><span>key</span><span> </span></span><span>in</span><span><span> </span><span>arr</span><span>){</span></span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>typeof</span><span><span> </span><span>key</span><span>) </span></span><span>//string  包括数组的私有属性也能打印出来</span></div></div><div><div><div>3</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>如果给<code>arr</code>加上个属性 <code>arr.b='100'</code>  属于数组的私有属性<code>for in</code>可以打印出来</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>for</span><span>(</span><span>let</span><span><span> </span><span>val</span><span> </span></span><span>of</span><span><span> </span><span>arr</span><span>){</span></span><span>//支持return 并且是val（值）of数组（不能遍历对象）</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul><blockquote><p>总结</p></blockquote><ul>
<li><code>forEach</code>不支持<code>return</code></li>
<li><code>for in</code>循环遍历出来的包含私有属性</li>
<li><code>for of</code> 既能<code>return</code>（并且是<code>val</code>（值）<code>of</code>数组），又能遍历私有属性（不能遍历对象）</li>
</ul><blockquote><p>扩展: 遍历对象的方法:<code>Object.keys</code> -&gt;将对象的key做成一个新的数组</p></blockquote><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>let</span><span><span> </span><span>obj</span></span><span>=</span><span>{</span><span>a</span><span>:</span><span>1</span><span>,</span><span>b</span><span>:</span><span>2</span><span>}</span></div></div><div><div><div>2</div></div><div><span>//[a,b]</span></div></div><div><div><div>3</div></div><div><span>for</span><span>(</span><span>let</span><span><span> </span><span>val</span><span> </span></span><span>of</span><span><span> </span><span>Object</span><span>.</span></span><span>keys</span><span><span>(</span><span>obj</span><span>)){</span></span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>val</span><span>)</span></span><span>// a        b</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>obj</span><span>[</span><span>val</span><span>])</span></span><span>// 把val变成变量 只能用[],不能用点，点会把val变成字符串，就取不出来了</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.<code>filter </code>（过滤）- 删除<a href="#2filter-过滤--删除"><span>#</span></a></h3><ul>
<li>是否操作原数组</li>
<li>这个方法的返回结果&lt;过滤后的新数组&gt;</li>
<li>回调函数的返回结果:
<ul>
<li>返回true表示这一项放到新数组中</li>
<li>返回false表示这一项不放到新数组中</li>
</ul>
</li>
</ul><blockquote><p>过滤出数组中大于2小于5的数</p></blockquote><ul>
<li>错误示范</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>let</span><span><span> </span><span>arr</span></span><span>=</span><span>[</span><span>1</span><span>,</span><span>2</span><span>,</span><span>3</span><span>,</span><span>4</span><span>,</span><span>5</span><span>].</span><span>filter</span><span>(</span><span>function</span><span><span>(</span><span>item</span><span>,</span><span>index</span><span>)){</span></span></div></div><div><div><div>2</div></div><div><span>  </span><span>return</span><span> </span><span>2</span><span>&lt;</span><span>item</span><span>&lt;</span><span>5</span><span> </span><span>//--&gt;不行  会先比较前面2&lt;item  永远都是true  会输出[1,2,3,4,5]</span></div></div><div><div><div>3</div></div><div><span>}</span></div></div><div><div><div>4</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>arr</span><span>) </span></span><span>//[1,2,3,4,5]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>正确示范</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>let</span><span><span> </span><span>arr</span></span><span>=</span><span>[</span><span>1</span><span>,</span><span>2</span><span>,</span><span>3</span><span>,</span><span>4</span><span>,</span><span>5</span><span>].</span><span>filter</span><span>(</span><span>function</span><span><span>(</span><span>item</span><span>,</span><span>index</span><span>)){</span></span></div></div><div><div><div>2</div></div><div><span>  </span><span>return</span><span><span> </span><span>item</span></span><span>&gt;</span><span>2</span><span>&amp;&amp;</span><span>item</span><span>&lt;</span><span>5</span></div></div><div><div><div>3</div></div><div><span>}</span></div></div><div><div><div>4</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>arr</span><span>) </span></span><span>//[3,4]</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>3.<code>map</code>(映射)  - 更新<a href="#3map映射----更新"><span>#</span></a></h3><ul>
<li>将原有的数组 映射成新数组</li>
<li>是否操作原数组</li>
<li>这个方法的返回结果&lt;返回新数组&gt;</li>
<li>回调函数的返回结果&lt;回调函数中返回什么&gt;，这一项就是什么</li>
</ul><blockquote><p>举例&lt;有一个数组&gt;<code>[1,2,3]</code>,如何将他变成</p></blockquote><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>ul</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>&lt;</span><span>li</span><span>&gt;1&lt;/</span><span>li</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>&lt;</span><span>li</span><span>&gt;2&lt;/</span><span>li</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>&lt;</span><span>li</span><span>&gt;3&lt;/</span><span>li</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span>&lt;/</span><span>ul</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span>-</span><span><span> </span><span>思路</span><span>:</span></span></div></div><div><div><div>7</div></div><div><span>let</span><span><span> </span><span>arr</span></span><span>=</span><span>[</span><span>1</span><span>,</span><span>2</span><span>,</span><span>3</span><span>].</span><span>map</span><span>(</span><span>function</span><span><span>(</span><span>item</span><span>){</span></span></div></div><div><div><div>8</div></div><div><span>   </span><span>return</span><span> </span><span>2</span></div></div><div><div><div>9</div></div><div><span>})</span></div></div><div><div><div>10</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>arr</span><span>)</span></span><span>//[2,2,2]</span></div></div><div><div><div>11</div></div><div><span>let</span><span><span> </span><span>arr1</span></span><span>=</span><span>[</span><span>1</span><span>,</span><span>2</span><span>,</span><span>3</span><span>].</span><span>map</span><span>(</span><span>function</span><span><span>(</span><span>item</span><span>){</span></span></div></div><div><div><div>12</div></div><div><span>   </span><span>return</span><span><span> </span><span>item</span></span><span>*=</span><span>3</span></div></div><div><div><div>13</div></div><div><span>})</span></div></div><div><div><div>14</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>arr1</span><span>)</span></span><span>//[3,6,9]</span></div></div><div><div><div>15</div></div><div><span>-</span><span><span> </span><span>实现功能</span><span>:</span><span>es6中的模板字符串拼</span><span> </span><span>$</span><span>{}</span><span>中间包变量</span></span></div></div><div><div><div>16</div></div><div><span>let</span><span><span> </span><span>arr2</span></span><span>=</span><span>[</span><span>1</span><span>,</span><span>2</span><span>,</span><span>3</span><span>].</span><span>map</span><span>(</span><span>function</span><span><span>(</span><span>item</span><span>){</span></span></div></div><div><div><div>17</div></div><div><span>   </span><span>return</span><span> </span><span>`&lt;li&gt;</span><span>${</span><span>item</span><span>}</span><span>&lt;/li&gt;`</span><span> </span><span>//是es6中的模板字符串，遇到变量用${}取值</span></div></div><div><div><div>18</div></div><div><span>})</span></div></div><div><div><div>19</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>arr2</span><span>)</span></span><span>//[&lt;li&gt;1&lt;/li&gt;,&lt;li&gt;2&lt;/li&gt;,&lt;li&gt;3&lt;/li&gt;]</span></div></div><div><div><div>20</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>arr2</span><span>.</span></span><span>join</span><span>(</span><span>''</span><span>))</span><span>//&lt;li&gt;1&lt;/li&gt;&lt;li&gt;2&lt;/li&gt;&lt;li&gt;3&lt;/li&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><p>总结</p></blockquote><ul>
<li>如果想删除数组中的某一项，可以用<code>filter</code></li>
<li>如果想更新或者修改某个数组，可以用<code>map</code></li>
</ul></section></section>
<section><h2>4.<code>includes</code> (是否包含)<a href="#4includes-是否包含"><span>#</span></a></h2><blockquote><p>数组中只要有5就拿出来</p></blockquote><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>let</span><span><span> </span><span>arr</span></span><span>=</span><span>[</span><span>1</span><span>,</span><span>2</span><span>,</span><span>3</span><span>,</span><span>4</span><span>,</span><span>55</span><span>]</span></div></div><div><div><div>2</div></div><div><span><span>arr</span><span>.</span></span><span>includes</span><span>(</span><span>5</span><span>) </span><span>//false  返回的是布尔类型 有5就是true，没有5就是false  很局限</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>5.<code>find</code><a href="#5find"><span>#</span></a></h2><ul>
<li>返回找到的那一项</li>
<li>不会改变原数组</li>
<li>回调函数中:
<ul>
<li>返回true表示找到了，找到后停止循环</li>
<li>返回undefined表示没找到</li>
</ul>
</li>
</ul><blockquote><p>数组中只要包含5就拿出来</p></blockquote><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>let</span><span><span> </span><span>arr</span></span><span>=</span><span>[</span><span>1</span><span>,</span><span>2</span><span>,</span><span>3</span><span>,</span><span>4</span><span>,</span><span>55</span><span>,</span><span>555</span><span>]</span></div></div><div><div><div>2</div></div><div><span>let</span><span><span> </span><span>newArr</span></span><span>=</span><span><span>arr</span><span>.</span></span><span>find</span><span>(</span><span>function</span><span><span>(</span><span>item</span><span>,</span><span>index</span><span>){</span></span></div></div><div><div><div>3</div></div><div><span>  </span><span>return</span><span><span> </span><span>item</span><span>.</span></span><span>toString</span><span>().</span><span>indexOf</span><span>(</span><span>5</span><span>)</span><span>&gt;-</span><span>1</span><span>  </span><span>//找到了</span></div></div><div><div><div>4</div></div><div><span>})</span></div></div><div><div><div>5</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>newArr</span><span>)  </span></span><span>//55</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p>总结:</p></blockquote><ul>
<li>找到具体的某一项,用find。实际应用中&lt;比如有用户列表&gt;，用户都有自己的用户名和密码，拿到用户的密码对应找到用户的用户名，找到一个就会停止往下找。</li>
</ul></section>
<section><h2>6.<code>some</code><a href="#6some"><span>#</span></a></h2><ul>
<li>找true，找到true后停止,返回true;找不到返回false。</li>
</ul></section>
<section><h2>7.<code>every</code><a href="#7every"><span>#</span></a></h2><ul>
<li>找false，找到false后停止,返回false</li>
</ul><blockquote><p>判断一个数组中有没有5,用<code>some</code></p></blockquote><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>let</span><span><span> </span><span>arr</span></span><span>=</span><span>[</span><span>1</span><span>,</span><span>2</span><span>,</span><span>3</span><span>,</span><span>4</span><span>,</span><span>55</span><span>,</span><span>555</span><span>]</span></div></div><div><div><div>2</div></div><div><span>let</span><span><span> </span><span>newArr</span></span><span>=</span><span><span>arr</span><span>.</span></span><span>some</span><span>(</span><span>function</span><span><span>(</span><span>item</span><span>,</span><span>index</span><span>){</span></span></div></div><div><div><div>3</div></div><div><span>  </span><span>return</span><span><span> </span><span>item</span><span>.</span></span><span>toString</span><span>().</span><span>indexOf</span><span>(</span><span>5</span><span>)</span><span>&gt;-</span><span>1</span><span>  </span><span>//找到了</span></div></div><div><div><div>4</div></div><div><span>})</span></div></div><div><div><div>5</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>newArr</span><span>)  </span></span><span>//true</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>8.<code>reduce</code>(收敛)<a href="#8reduce收敛"><span>#</span></a></h2><ul>
<li>四个参数、next下一个、index索引、item原数组</li>
<li>返回的结果&lt;叠加后的结果&gt;</li>
<li>回调函数返回的结果:</li>
<li>原数组不变</li>
</ul><blockquote><p>求数组中的和</p></blockquote><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>//第一步分析:</span></div></div><div><div><div>2</div></div><div><span>[</span><span>1</span><span>,</span><span>2</span><span>,</span><span>3</span><span>,</span><span>4</span><span>,</span><span>5</span><span>].</span><span>reduce</span><span>(</span><span>function</span><span><span>(</span><span>prev</span><span>,</span><span>next</span><span>,</span><span>index</span><span>,</span><span>item</span><span>){</span></span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>arguments</span><span>)</span></div></div><div><div><div>4</div></div><div><span>    </span><span>//{'0':1,'1':2,'2':1,'3':[1,2,3,4,5]}-&gt;prev数组的第一项,next数组的第二项</span></div></div><div><div><div>5</div></div><div><span>    </span><span>//{'0':undefined,'1':3,'2':2,'3':[1,2,3,4,5]}-&gt;prev是undefined,next数组的第三项</span></div></div><div><div><div>6</div></div><div><span>    </span><span>//{'0':undefined,'1':4,'2':3,'3':[1,2,3,4,5]}-&gt;prev是undefined,next数组的第四项</span></div></div><div><div><div>7</div></div><div><span>    </span><span>//{'0':undefined,'1':5,'2':4,'3':[1,2,3,4,5]}-&gt;prev是undefined,next数组的第五项</span></div></div><div><div><div>8</div></div><div><span>    </span><span>//--&gt;prev是undefined的原因，因为这里没有return</span></div></div><div><div><div>9</div></div><div><span>})</span></div></div><div><div><div>10</div></div><div><span>//第二步分析-&gt;有return的时候:</span></div></div><div><div><div>11</div></div><div><span>[</span><span>1</span><span>,</span><span>2</span><span>,</span><span>3</span><span>,</span><span>4</span><span>,</span><span>5</span><span>].</span><span>reduce</span><span>(</span><span>function</span><span><span>(</span><span>prev</span><span>,</span><span>next</span><span>,</span><span>index</span><span>,</span><span>item</span><span>){</span></span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>arguments</span><span>)</span></div></div><div><div><div>13</div></div><div><span>    </span><span>return</span><span> </span><span>100</span><span> </span><span>//本次的返回值会作为下一次的prev</span></div></div><div><div><div>14</div></div><div><span>    </span><span>//{'0':1,'1':2,'2':1,'3':[1,2,3,4,5]}-&gt;prev数组的第一项,next数组的第二项</span></div></div><div><div><div>15</div></div><div><span>    </span><span>//{'0':100,'1':3,'2':2,'3':[1,2,3,4,5]}-&gt;prev是100,next数组的第三项</span></div></div><div><div><div>16</div></div><div><span>    </span><span>//{'0':100,'1':4,'2':3,'3':[1,2,3,4,5]}-&gt;prev是100,next数组的第四项</span></div></div><div><div><div>17</div></div><div><span>    </span><span>//{'0':100,'1':5,'2':4,'3':[1,2,3,4,5]}-&gt;prev是100,next数组的第五项</span></div></div><div><div><div>18</div></div><div><span>})</span></div></div><div><div><div>19</div></div><div><span>//求和:</span></div></div><div><div><div>20</div></div><div><span>let</span><span><span> </span><span>sum</span></span><span>=</span><span>[</span><span>1</span><span>,</span><span>2</span><span>,</span><span>3</span><span>,</span><span>4</span><span>,</span><span>5</span><span>].</span><span>reduce</span><span>(</span><span>function</span><span><span>(</span><span>prev</span><span>,</span><span>next</span><span>,</span><span>index</span><span>,</span><span>item</span><span>){</span></span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>prev</span><span>,</span><span>next</span><span>)</span></span></div></div><div><div><div>22</div></div><div><span>    </span><span>return</span><span><span> </span><span>prev</span></span><span>+</span><span>next</span></div></div><div><div><div>23</div></div><div><span>})</span></div></div><div><div><div>24</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>sum</span><span>) </span></span><span>//15</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><p>求30<em>2+30</em>3+30*4</p></blockquote><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>//思路:</span></div></div><div><div><div>2</div></div><div><span>let</span><span><span> </span><span>sum2</span></span><span>=</span><span>[{</span><span>price</span><span>:</span><span>30</span><span>,</span><span>count</span><span>:</span><span>2</span><span>},{</span><span>price</span><span>:</span><span>30</span><span>,</span><span>count</span><span>:</span><span>3</span><span>},{</span><span>price</span><span>:</span><span>30</span><span>,</span><span>count</span><span>:</span><span>4</span><span>}].</span><span>reduce</span><span>(</span><span>function</span><span><span>(</span><span>prev</span><span>,</span><span>next</span><span>){</span></span></div></div><div><div><div>3</div></div><div><span>    </span><span>return</span><span><span> </span><span>prev</span><span>.</span></span><span>price</span><span>*</span><span><span>prev</span><span>.</span></span><span>count</span><span>+</span><span><span>next</span><span>.</span></span><span>price</span><span>+</span><span><span>next</span><span>.</span></span><span>count</span></div></div><div><div><div>4</div></div><div><span>    </span><span>//30*2+30*3  -&gt;150</span></div></div><div><div><div>5</div></div><div><span>    </span><span>//150.price*150.count + ...  -&gt;NaN</span></div></div><div><div><div>6</div></div><div><span>})</span></div></div><div><div><div>7</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>sum2</span><span>) </span></span><span>//NaN</span></div></div><div><div><div>8</div></div><div><span>//在数组最前面加上0 会导致多循环一次</span></div></div><div><div><div>9</div></div><div><span>let</span><span><span> </span><span>sum2</span></span><span>=</span><span>[</span><span>0</span><span>,{</span><span>price</span><span>:</span><span>30</span><span>,</span><span>count</span><span>:</span><span>2</span><span>},{</span><span>price</span><span>:</span><span>30</span><span>,</span><span>count</span><span>:</span><span>3</span><span>},{</span><span>price</span><span>:</span><span>30</span><span>,</span><span>count</span><span>:</span><span>4</span><span>}].</span><span>reduce</span><span>(</span><span>function</span><span><span>(</span><span>prev</span><span>,</span><span>next</span><span>){</span></span></div></div><div><div><div>10</div></div><div><span>    </span><span>return</span><span><span> </span><span>prev</span></span><span>+</span><span><span>next</span><span>.</span></span><span>price</span><span>+</span><span><span>next</span><span>.</span></span><span>count</span></div></div><div><div><div>11</div></div><div><span>    </span><span>//0+30*2  -&gt;60</span></div></div><div><div><div>12</div></div><div><span>    </span><span>//60+30*3  -&gt;150</span></div></div><div><div><div>13</div></div><div><span>    </span><span>//150+30*4 -&gt;270</span></div></div><div><div><div>14</div></div><div><span>})</span></div></div><div><div><div>15</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>sum2</span><span>) </span></span><span>//270</span></div></div><div><div><div>16</div></div><div><span>//传第二个参数0来解决 -&gt; 默认指定第一次的prev</span></div></div><div><div><div>17</div></div><div><span>let</span><span><span> </span><span>sum2</span></span><span>=</span><span>[{</span><span>price</span><span>:</span><span>30</span><span>,</span><span>count</span><span>:</span><span>2</span><span>},{</span><span>price</span><span>:</span><span>30</span><span>,</span><span>count</span><span>:</span><span>3</span><span>},{</span><span>price</span><span>:</span><span>30</span><span>,</span><span>count</span><span>:</span><span>4</span><span>}].</span><span>reduce</span><span>(</span><span>function</span><span><span>(</span><span>prev</span><span>,</span><span>next</span><span>){</span></span></div></div><div><div><div>18</div></div><div><span>    </span><span>return</span><span><span> </span><span>prev</span></span><span>+</span><span><span>next</span><span>.</span></span><span>price</span><span>+</span><span><span>next</span><span>.</span></span><span>count</span></div></div><div><div><div>19</div></div><div><span>    </span><span>//0+30*2  -&gt;60</span></div></div><div><div><div>20</div></div><div><span>    </span><span>//60+30*3  -&gt;150</span></div></div><div><div><div>21</div></div><div><span>    </span><span>//150+30*4 -&gt;270</span></div></div><div><div><div>22</div></div><div><span>},</span><span>0</span><span>)</span></div></div><div><div><div>23</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>sum2</span><span>) </span></span><span>//270</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>总结&lt;求和&gt;、求叠加、两个数组合成一个数组，可以用<code>reduce</code></p><blockquote><p>扩展</p></blockquote><ul>
<li>数组扁平化&lt;将一个二维数组变为一维数组怎么写&gt;？可以使用<code>reduce</code> -&gt; 将<code>[[1,2,3],[4,5,6],[7,8,9]]变为[1,2,3,4,5,6,7,8,9]</code></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>let</span><span><span> </span><span>arr</span></span><span>=</span><span>[[</span><span>1</span><span>,</span><span>2</span><span>,</span><span>3</span><span>],[</span><span>4</span><span>,</span><span>5</span><span>,</span><span>6</span><span>],[</span><span>7</span><span>,</span><span>8</span><span>,</span><span>9</span><span>]].</span><span>reduce</span><span>(</span><span>function</span><span><span>(</span><span>prev</span><span>,</span><span>next</span><span>){</span></span></div></div><div><div><div>2</div></div><div><span>    </span><span>return</span><span><span> </span><span>prev</span><span>.</span></span><span>concat</span><span><span>(</span><span>next</span><span>)</span></span></div></div><div><div><div>3</div></div><div><span>})</span></div></div><div><div><div>4</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>arr</span><span>)</span></span><span>//[1,2,3,4,5,6,7,8,9]</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/HEXO%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</id>
      <title type="text">HEXO常用命令</title>
      <published>2018-07-15T00:00:00.000Z</published>
      <updated>2018-07-15T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/HEXO%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/"/>
      <summary type="text">HEXO常用命令</summary>
      <content type="html"><![CDATA[<section><h2>hexo安装<a href="#hexo安装"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>npm</span><span> </span><span>install</span><span> </span><span>hexo</span><span> </span></span><span>-</span><span><span>g</span><span> </span></span><span>//安装</span></div></div><div><div><div>2</div></div><div><span><span>npm</span><span> </span><span>update</span><span> </span><span>hexo</span><span> </span></span><span>-</span><span><span>g</span><span> </span></span><span>//升级</span></div></div><div><div><div>3</div></div><div><span><span>hexo</span><span> </span><span>init</span><span> </span></span><span>//初始化</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>hexo命令<a href="#hexo命令"><span>#</span></a></h2><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>hexo</span><span> </span><span>n</span><span> </span></span><span>"我的博客"</span><span> </span><span>//新建文章-简写</span></div></div><div><div><div>2</div></div><div><span><span>hexo</span><span> </span></span><span>new</span><span> </span><span>"我的博客"</span><span> </span><span>//新建文章</span></div></div><div><div><div>3</div></div><div><span><span>hexo</span><span> </span></span><span>new</span><span><span> </span><span>page</span><span> </span></span><span>"title"</span><span> </span><span>//新建页面</span></div></div><div><div><div>4</div></div><div><span><span>hexo</span><span> </span></span><span>new</span><span><span> </span><span>post</span><span> </span></span><span>"title"</span><span> </span><span>//写作</span></div></div><div><div><div>5</div></div><div><span><span>hexo</span><span> </span></span><span>new</span><span><span> </span><span>photo</span><span> </span></span><span>"My Gallery"</span><span> </span><span>//模版</span></div></div><div><div><div>6</div></div><div><span><span>hexo</span><span> </span><span>p</span><span> </span></span><span>//草稿-简写</span></div></div><div><div><div>7</div></div><div><span><span>hexo</span><span> </span><span>publish</span><span> [</span><span>layout</span><span>] </span></span><span>&lt;</span><span>title</span><span>&gt;</span><span> </span><span>//草稿</span></div></div><div><div><div>8</div></div><div><span><span>hexo</span><span> </span><span>g</span><span> </span></span><span>//生成静态页面至public目录 使用 Hexo 生成静态文件快速而且简单 -简写</span></div></div><div><div><div>9</div></div><div><span><span>hexo</span><span> </span><span>generate</span><span> </span></span><span>//生成静态页面至public目录 使用 Hexo 生成静态文件快速而且简单</span></div></div><div><div><div>10</div></div><div><span><span>hexo</span><span> </span><span>generate</span><span> </span></span><span>--</span><span><span>watch</span><span> </span></span><span>//监视文件变动</span></div></div><div><div><div>11</div></div><div><span><span>hexo</span><span> </span><span>s</span><span> </span></span><span>//启动服务预览/开启预览访问端口（默认端口4000，'ctrl + c'关闭server）-简写</span></div></div><div><div><div>12</div></div><div><span><span>hexo</span><span> </span><span>server</span><span> </span></span><span>//启动服务预览/开启预览访问端口（默认端口4000，'ctrl + c'关闭server）</span></div></div><div><div><div>13</div></div><div><span><span>hexo</span><span> </span><span>d</span><span> </span></span><span>//开始部署，将.deploy目录部署到GitHub-简写</span></div></div><div><div><div>14</div></div><div><span><span>hexo</span><span> </span><span>deploy</span><span> </span></span><span>//将.deploy目录部署到GitHub</span></div></div><div><div><div>15</div></div><div><span><span>hexo</span><span> </span><span>server</span><span> </span></span><span>//Hexo 会监视文件变动并自动更新，您无须重启服务器。</span></div></div><div><div><div>16</div></div><div><span><span>hexo</span><span> </span><span>server</span><span> </span></span><span>-</span><span><span>s</span><span> </span></span><span>//静态模式</span></div></div><div><div><div>17</div></div><div><span><span>hexo</span><span> </span><span>server</span><span> </span></span><span>-</span><span><span>g</span><span> </span></span><span>//完成后部署</span></div></div><div><div><div>18</div></div><div><span><span>hexo</span><span> </span><span>server</span><span> </span></span><span>-</span><span><span>p</span><span> </span></span><span>5000</span><span> </span><span>//更改端口为5000</span></div></div><div><div><div>19</div></div><div><span><span>hexo</span><span> </span><span>server</span><span> </span></span><span>-</span><span><span>i</span><span> </span></span><span>192.168</span><span>.</span><span>1.1</span><span> </span><span>//自定义 IP</span></div></div><div><div><div>20</div></div><div><span><span>hexo</span><span> </span><span>clean</span><span> </span></span><span>//清除缓存 网页正常情况下可以忽略此条命令</span></div></div><div><div><div>21</div></div><div><span><span>hexo</span><span> </span><span>generate</span><span> </span></span><span>--</span><span><span>deploy</span><span> </span></span><span>//完成后部署</span></div></div><div><div><div>22</div></div><div><span><span>hexo</span><span> </span><span>deploy</span><span> </span></span><span>--</span><span><span>generate</span><span> </span></span><span>//完成后部署</span></div></div><div><div><div>23</div></div><div><span><span>hexo</span><span> </span><span>d</span><span> </span></span><span>-</span><span><span>g</span><span> </span></span><span>//完成后部署-简写</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/%E4%BA%8C%E7%BB%B4%E6%95%B0%E7%BB%84%E9%99%8D%E7%BB%B4%E6%88%90%E4%B8%80%E7%BB%B4%E6%95%B0%E7%BB%84/</id>
      <title type="text">二维数组降维成一维数组</title>
      <published>2018-07-15T00:00:00.000Z</published>
      <updated>2018-07-15T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/%E4%BA%8C%E7%BB%B4%E6%95%B0%E7%BB%84%E9%99%8D%E7%BB%B4%E6%88%90%E4%B8%80%E7%BB%B4%E6%95%B0%E7%BB%84/"/>
      <summary type="text">二维数组降维成一维数组,包含reduce、前端面试题</summary>
      <content type="html"><![CDATA[<section><h2>把<code>[[2,5],[7,3]]</code>降维成<code>[2,5,7,3]</code><a href="#把2573降维成2573"><span>#</span></a></h2><section><h3>方法一<a href="#方法一"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>let</span><span><span> </span><span>arr</span></span><span>=</span><span>[[</span><span>2</span><span>,</span><span>5</span><span>],[</span><span>7</span><span>,</span><span>3</span><span>]];</span></div></div><div><div><div>2</div></div><div><span><span>arr</span><span>.</span></span><span>toString</span><span>().</span><span>split</span><span>  </span><span>//[2,5,7,3]</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>方法二<a href="#方法二"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>fn</span><span><span>(</span><span>arr</span><span>){</span></span></div></div><div><div><div>2</div></div><div><span>    </span><span>let</span><span><span> </span><span>a</span></span><span>=</span><span>[];</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>arr</span><span>.</span><span>map</span><span><span>(</span><span>item</span></span><span>=&gt;</span><span>{</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>a</span><span>=</span><span>[</span><span>...</span><span><span>a</span><span>,</span></span><span>...</span><span><span>item</span><span>]</span></span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>});</span></div></div><div><div><div>6</div></div><div><span>    </span><span>return</span><span><span> </span><span>a</span></span></div></div><div><div><div>7</div></div><div><span>}</span></div></div><div><div><div>8</div></div><div><span>fn</span><span>([[</span><span>2</span><span>,</span><span>5</span><span>],[</span><span>7</span><span>,</span><span>3</span><span>]])  </span><span>//[2,5,7,3]</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>方法三<a href="#方法三"><span>#</span></a></h3><p>reduce</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>let</span><span><span> </span><span>arr</span></span><span>=</span><span>[[</span><span>1</span><span>,</span><span>2</span><span>,</span><span>3</span><span>],[</span><span>4</span><span>,</span><span>5</span><span>,</span><span>6</span><span>],[</span><span>7</span><span>,</span><span>8</span><span>,</span><span>9</span><span>]].</span><span>reduce</span><span>(</span><span>function</span><span><span>(</span><span>prev</span><span>,</span><span>next</span><span>){</span></span></div></div><div><div><div>2</div></div><div><span>    </span><span>return</span><span><span> </span><span>prev</span><span>.</span></span><span>concat</span><span><span>(</span><span>next</span><span>)</span></span></div></div><div><div><div>3</div></div><div><span>})</span></div></div><div><div><div>4</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>arr</span><span>)</span></span><span>//[1,2,3,4,5,6,7,8,9]</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/%E5%9F%BA%E4%BA%8EGitHub%E5%88%9B%E5%BB%BA%E8%87%AA%E5%B7%B1HEXO%E7%9A%84%E5%8D%9A%E5%AE%A2/</id>
      <title type="text">基于GitHub创建自己HEXO的博客</title>
      <published>2018-07-04T00:00:00.000Z</published>
      <updated>2018-07-04T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/%E5%9F%BA%E4%BA%8EGitHub%E5%88%9B%E5%BB%BA%E8%87%AA%E5%B7%B1HEXO%E7%9A%84%E5%8D%9A%E5%AE%A2/"/>
      <summary type="text">基于GitHub创建自己HEXO的博客</summary>
      <content type="html"><![CDATA[<section><h2>搭建环境准备<a href="#搭建环境准备"><span>#</span></a></h2><ul>
<li>Node.js 的安装和准备</li>
<li>Git的安装和准备</li>
<li>gitHub账户的配置</li>
</ul><section><h3>Node.js 的安装和准备<a href="#nodejs-的安装和准备"><span>#</span></a></h3><ul>
<li>1.下载node.js安装文件：<a href="https://nodejs.org/en/" target="_blank">https://nodejs.org/en/</a></li>
<li>2.cmd，打开命令行界面,查看安装版本</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>node</span><span> </span></span><span>-</span><span>v</span></div></div><div><div><div>2</div></div><div><span><span>npm</span><span> </span></span><span>-</span><span>v</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>配置Git环境<a href="#配置git环境"><span>#</span></a></h3><ul>
<li>下载Git安装文件：<a href="https://git-scm.com/downloads" target="_blank">https://git-scm.com/downloads</a></li>
<li>打开命令行输入,检查安装是否成功</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>git</span><span> </span></span><span>--</span><span>version</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>github账户的注册和配置<a href="#github账户的注册和配置"><span>#</span></a></h3><ul>
<li>
<p>Github注册：<a href="https://github.com/" target="_blank">https://github.com/</a></p>
</li>
<li>
<p>创建代码库：</p>
<ul>
<li>
<p>在<code>Repository name</code>下填写<code>yourname.github.io</code>，<code>Description (optional)</code>下填写一些简单的描述（不写也没有关系)</p>
<blockquote><p>注意：
比如我的github名称是gaodaxiu0406 ,
这里你就填 gaodaxiu0406.github.io</p></blockquote>
</li>
</ul>
</li>
<li>
<p>代码库设置:<code>Setting</code></p>
<ul>
<li>接下来开启<code>gh-pages</code>功能，点击界面右侧的<code>Settings</code>，你将会打开这个库的<code>setting</code>页面，向下拖动，直到看见<code>GitHub Pages</code></li>
<li>点击<code>Automatic page generator</code>，<code>Github</code>将会自动替你创建出一个<code>gh-pages</code>的页面</li>
</ul>
</li>
</ul></section></section>
<section><h2>安装<code>Hexo</code><a href="#安装hexo"><span>#</span></a></h2><ul>
<li>首先在E盘(选择你的<code>HEXO</code>存放的文件夹,最好不要安装到C盘)目录下创建<code>Hexo</code>文件夹，并在命令行的窗口进入到该目录</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>E</span><span>:    </span><span>进入E盘</span></span></div></div><div><div><div>2</div></div><div><span><span>cd</span><span> </span><span>Hexo</span><span> </span><span>进入Hexo文件夹</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>安装<code>HEXO</code></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>npm</span><span> </span><span>install</span><span> </span><span>hexo</span></span><span>-</span><span><span>cli</span><span> </span></span><span>-</span><span>g</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>可能你会看到一个<code>WARN</code>，但是不用担心，这不会影响你的正常使用。</li>
</ul><section><h3>检查安装是否成功<a href="#检查安装是否成功"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>hexo</span><span> </span></span><span>-</span><span>v</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>输出版本号即为安装成功</p></section></section>
<section><h2>hexo的相关配置<a href="#hexo的相关配置"><span>#</span></a></h2><section><h3>初始化Hexo<a href="#初始化hexo"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>hexo</span><span> </span><span>init</span><span> </span></span><span>// 初始化hexo</span></div></div><div><div><div>2</div></div><div><span><span>npm</span><span> </span><span>install</span><span> </span></span><span>// 安装项目所有依赖</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>首次体验Hexo<a href="#首次体验hexo"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>hexo</span><span> </span><span>g</span><span>   #</span><span>生成</span></span></div></div><div><div><div>2</div></div><div><span><span>hexo</span><span> </span><span>s</span><span>   #</span><span>启动服务</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>在浏览器中打开<code>http://localhost:4000/</code> 即可预览你的<code>HEXO</code>页面</p></section></section>
<section><h2>怎样将<code>Hexo</code>与<code>github page</code> 联系起来<a href="#怎样将hexo与github-page-联系起来"><span>#</span></a></h2><section><h3>大概分为以下几步<a href="#大概分为以下几步"><span>#</span></a></h3><ul>
<li>配置<code>git</code>个人信息</li>
<li>配置<code>Deployment</code></li>
</ul><section><h4>1.配置Git个人信息<a href="#1配置git个人信息"><span>#</span></a></h4><ul>
<li>
<p>1.设置Git的user name和email：(如果是第一次的话)</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>git</span><span> </span><span>config</span><span> </span></span><span>--</span><span><span>global</span><span> </span><span>user</span><span>.</span></span><span>name</span><span> </span><span>"gaodaxiu0406"</span></div></div><div><div><div>2</div></div><div><span><span>git</span><span> </span><span>config</span><span> </span></span><span>--</span><span><span>global</span><span> </span><span>user</span><span>.</span></span><span>email</span><span> </span><span>"1260833716@qq.com"</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>2.检查是否已经有SSH Key(密钥)。</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cd</span><span> </span></span><span>~/</span><span>.</span><span>ssh</span></div></div><div><div><div>2</div></div><div><span>ls</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>3.生成密钥(如果没有密钥的话)</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>ssh</span><span>-</span><span><span>keygen</span><span> </span></span><span>-</span><span><span>t</span><span> </span><span>rsa</span><span> </span></span><span>-</span><span>C</span><span> </span><span>"1260833716@qq.com"</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>连续3个回车</span><span>。</span><span>如果不需要密码的话</span><span>。</span></span></div></div><div><div><div>2</div></div><div><span><span>最后得到了两个文件</span><span>：</span><span>id_rsa和id_rsa</span><span>.</span></span><span>pub</span><span>。</span></div></div><div><div><div>3</div></div><div><span><span>默认的存储路径是</span><span>：</span><span>C</span><span>:\</span><span>Users</span><span>\</span><span>Administrator</span><span>\.</span></span><span>ssh</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>4.添加密钥到<code>ssh-agent</code></p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>eval</span><span> </span></span><span>"$(ssh-agent -s)"</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<p>添加生成的 <code>SSH key</code> 到 <code>ssh-agent</code>。</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>ssh</span><span>-</span><span><span>add</span><span> </span></span><span>~/</span><span>.</span><span>ssh</span><span>/</span><span>id_rsa</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>5.登陆Github, 添加 ssh</p>
<ul>
<li>把<code>id_rsa.pub</code>文件里的内容复制到<code>SSH keys</code></li>
</ul>
</li>
<li>
<p>6.测试：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>ssh</span><span> </span></span><span>-</span><span>T</span><span><span> </span><span>git</span><span>@</span><span>github</span><span>.</span></span><span>com</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>你将会看到：如果看到Hi后面是你的用户名，就说明成功了。</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>如果提示Are</span><span> </span><span>you</span><span> </span><span>sure</span><span> </span><span>you</span><span> </span><span>want</span><span> </span><span>to</span><span> </span></span><span>continue</span><span><span> </span><span>connecting</span><span> (</span><span>yes</span></span><span>/</span><span><span>no</span><span>)</span></span><span>?</span><span><span>，</span><span>输入yes</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul></section><section><h4>2.配置<code>Deployment</code><a href="#2配置deployment"><span>#</span></a></h4><ul>
<li>
<p>配置<code>_config.yml</code>中有关<code>deploy</code>的部分：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>deploy</span><span>:</span></span></div></div><div><div><div>2</div></div><div><span><span>type</span><span>: </span><span>git</span></span></div></div><div><div><div>3</div></div><div><span><span>repository</span><span>: </span><span>git</span><span>@</span><span>github</span><span>.</span></span><span>com</span><span><span>:</span><span>gaodaxiu0406</span></span><span>/</span><span><span>gaodaxiu0406</span><span>.</span></span><span>github</span><span>.</span><span>io</span><span>.</span><span>git</span></div></div><div><div><div>4</div></div><div><span><span>branch</span><span>: </span><span>master</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul></section></section></section>
<section><h2>写博客、发布文章<a href="#写博客发布文章"><span>#</span></a></h2><ul>
<li>
<p>1.定位到我们的hexo根目录，执行命令：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>hexo</span><span> </span></span><span>new</span><span> </span><span>'my-first-blog'</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>hexo会帮我们在<code>HEXO</code>文件夹—&gt;<code>source</code>文件夹—&gt;<code>_posts</code>文件夹下生成相关<code>.md</code>文件,用马克飞象打开写文章就可以</p>
</li>
<li>
<p>文章编辑好之后，运行生成、部署命令：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>hexo</span><span> </span><span>g</span><span>   </span></span><span>// 生成</span></div></div><div><div><div>2</div></div><div><span><span>hexo</span><span> </span><span>d</span><span>   </span></span><span>// 部署</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<p>或者(合并写法)</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>hexo</span><span> </span><span>d</span><span> </span></span><span>-</span><span><span>g</span><span> #</span><span>在部署前先生成</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul><section><h3>踩坑提醒<a href="#踩坑提醒"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>deloyer</span><span> </span><span>not</span><span> </span><span>found</span><span>:</span><span>git</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这样的错误是需要装插件</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>npm</span><span> </span><span>install</span><span> </span><span>hexo</span></span><span>-</span><span>deployer</span><span>-</span><span><span>git</span><span> </span></span><span>--</span><span>save</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p>下篇<a href="https://gaodaxiu-blog.netlify.app/posts/hexo%E4%B8%BB%E9%A2%98%E8%AE%BE%E7%BD%AE">https://gaodaxiu-blog.netlify.app/posts/hexo主题设置</a>(<a href="https://gaodaxiu-blog.netlify.app/posts/hexo%E4%B8%BB%E9%A2%98%E8%AE%BE%E7%BD%AE(huno%E4%B8%BB%E9%A2%98)">https://gaodaxiu-blog.netlify.app/posts/hexo%E4%B8%BB%E9%A2%98%E8%AE%BE%E7%BD%AE(huno%E4%B8%BB%E9%A2%98)</a>)</p></blockquote></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/JS%E6%95%B0%E7%BB%84%E4%B8%AD%E7%9A%84%E6%96%B9%E6%B3%951/</id>
      <title type="text">JS数组中的方法1</title>
      <published>2018-04-25T00:00:00.000Z</published>
      <updated>2018-04-25T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/JS%E6%95%B0%E7%BB%84%E4%B8%AD%E7%9A%84%E6%96%B9%E6%B3%951/"/>
      <summary type="text">JS数组中的方法1:charCodeAt、push、unshift、splice、pop、shift、slice、concat、indexOf、lastIndexof、forEach、map、join、toString、reverse、sort</summary>
      <content type="html"><![CDATA[<section><h2>数组中的方法<a href="#数组中的方法"><span>#</span></a></h2><section><h3>1.给数组添加值<a href="#1给数组添加值"><span>#</span></a></h3><section><h4>1.1 <code>charCodeAt</code>（索引） 返回结果对应的是ASCII码;原字符串不变<a href="#11-charcodeat索引-返回结果对应的是ascii码原字符串不变"><span>#</span></a></h4></section><section><h4>1.2 <code>push()</code>;向数组末尾增加n项<a href="#12-push向数组末尾增加n项"><span>#</span></a></h4><ul>
<li>参数&lt;想向数组末尾增加的内容&gt;,可以传递多个值,统一向数组末尾增加n向</li>
<li>返回值&lt;新增后数组的长度&gt;</li>
<li>原数组&lt;改变&gt;</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>ary</span></span><span>=</span><span>[</span><span>12</span><span>,</span><span>23</span><span>,</span><span>34</span><span>,</span><span>45</span><span>];</span></div></div><div><div><div>2</div></div><div><span><span>ary</span><span>.</span></span><span>push</span><span>(</span><span>56</span><span>);</span></div></div><div><div><div>3</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>ary</span><span>);</span></span><span>//--&gt;[12,23,34,45,56]</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>1.3 <code>unshift();</code>向数组开头增加n项<a href="#13-unshift向数组开头增加n项"><span>#</span></a></h4><ul>
<li>
<p>参数&lt;想向数组开头增加的内容&gt;,可以传递多个值,统一向数组开头增加n向</p>
</li>
<li>
<p>返回值&lt;新增后数组的长度&gt;</p>
</li>
<li>
<p>原数组&lt;改变&gt;</p>
</li>
<li>
<p>扩展&lt;向数组末尾增加&gt;</p>
<ul>
<li><code>splice(a.length,0,x);</code>向末尾增加,可增加多项</li>
</ul>
</li>
</ul></section></section><section><h3>2.删除数组中的项<a href="#2删除数组中的项"><span>#</span></a></h3><section><h4>2.1 <code>pop();</code>删除数组最后一项内容<a href="#21-pop删除数组最后一项内容"><span>#</span></a></h4><ul>
<li>参数&lt;没有&gt;</li>
<li>返回值&lt;被删除的那一项内容&gt;</li>
<li>原数组&lt;改变&gt;</li>
</ul></section><section><h4>2.2 <code>shift();</code>删除数组中的第一项<a href="#22-shift删除数组中的第一项"><span>#</span></a></h4><ul>
<li>
<p>参数&lt;没有&gt;</p>
</li>
<li>
<p>返回值&lt;被删除的那一项内容&gt;</p>
</li>
<li>
<p>原数组&lt;改变&gt;</p>
</li>
<li>
<p>扩展&lt;删除数组最后一项内容的方法&gt;</p>
<ul>
<li>a) <code>pop();</code>删除数组最后一项内容</li>
<li>b) <code>ary.length--;</code></li>
<li>c) <code>ary.splice(ary.length-1);</code></li>
</ul>
</li>
</ul></section></section><section><h3>3.数组中的截取和拼接<a href="#3数组中的截取和拼接"><span>#</span></a></h3><section><h4>3.1 <code>slice</code> 实现数组的截取，在原来的数组中截取某一部分<a href="#31-slice-实现数组的截取在原来的数组中截取某一部分"><span>#</span></a></h4><section><h5>3.1.1 <code>slice(n,m)</code><a href="#311-slicenm"><span>#</span></a></h5><ul>
<li>
<ol>
<li>n&gt;=m 返回空数组</li>
</ol>
</li>
<li>
<ol>
<li>n&lt;0,m&lt;0,n&lt;m 从索引m开始找到索引为n处，不包含n，将找到的部分，以新数组返回，原数组不变。原数组的索引最后一位是0,倒数第二位索引是-1,以此类推;例如</li>
</ol>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>ary1</span></span><span>=</span><span>[</span><span>11</span><span>,</span><span>22</span><span>,</span><span>33</span><span>,</span><span>44</span><span>,</span><span>55</span><span>,</span><span>66</span><span>,</span><span>77</span><span>,</span><span>88</span><span>,</span><span>99</span><span>];</span></div></div><div><div><div>2</div></div><div><span>var</span><span><span> </span><span>res</span></span><span>=</span><span><span>ary1</span><span>.</span></span><span>slice</span><span>(</span><span>-</span><span>4</span><span>,</span><span>-</span><span>3</span><span>);</span></div></div><div><div><div>3</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>res</span><span>,</span><span>ary1</span><span>);</span></span></div></div><div><div><div>4</div></div><div><span>//[66]   (9) [11, 22, 33, 44, 55, 66, 77, 88, 99]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<ol>
<li>n&gt;0,m&lt;0  原数组的长度（从前往后）变为总长度+m(m为负数，即原数组总长度减短)，<code>slice(n,m)</code>返回索引n开始到减短后的数组末尾  当n和m的绝对值相加&gt;=原数组总长度时，<code>slice(n,m)</code>返回空数组;例如</li>
</ol>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>ary1</span></span><span>=</span><span>[</span><span>11</span><span>,</span><span>22</span><span>,</span><span>33</span><span>,</span><span>44</span><span>,</span><span>55</span><span>,</span><span>66</span><span>,</span><span>77</span><span>,</span><span>88</span><span>,</span><span>99</span><span>];</span></div></div><div><div><div>2</div></div><div><span>var</span><span><span> </span><span>res</span></span><span>=</span><span><span>ary1</span><span>.</span></span><span>slice</span><span>(</span><span>3</span><span>,</span><span>-</span><span>3</span><span>);</span></div></div><div><div><div>3</div></div><div><span>//[44, 55, 66]   (9) [11, 22, 33, 44, 55, 66, 77, 88, 99]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<ol>
<li>n&gt;0,m&gt;0,m&gt;n</li>
</ol>
<ul>
<li>参数&lt;从索引n开始找到索引m处&gt;(不包含m);</li>
<li>返回值&lt;索引n项到索引m-1项&gt;,将找到的部分以新数组返回;</li>
<li>原数组&lt;不变&gt;;</li>
</ul>
</li>
<li>
<ol>
<li><code>slice(n)</code>;</li>
</ol>
<ul>
<li>参数&lt;从索引n开始一直找到数组末尾&gt;</li>
<li>将找到的部分以新数组返回</li>
<li>原数组&lt;不变&gt;</li>
</ul>
</li>
<li>
<ol>
<li><code>slice(0);/slice()</code></li>
</ol>
<ul>
<li>把原来的数组克隆一份一模一样的新数组返回</li>
<li>原数组&lt;不变&gt;</li>
</ul>
</li>
</ul></section><section><h5>3.1.2 <code>concat();</code>把两个数组拼接在一起<a href="#312-concat把两个数组拼接在一起"><span>#</span></a></h5><ul>
<li>参数:
<ul>
<li><code>ary1.concat(ary2);</code>将ary1和ary2进行拼接,ary2在后面</li>
<li><code>ary1.concat();</code>把ary1克隆一份一模一样的数组</li>
</ul>
</li>
<li>原数组&lt;不变&gt;</li>
</ul></section><section><h5>3.1.3 <code>splice</code><a href="#313-splice"><span>#</span></a></h5><p>修改数组中某一项的值</p><ul>
<li>
<ol>
<li>利用对象的操作方式修改某一项的值,例如2=100;</li>
</ol>
<ul>
<li>原数组&lt;改变&gt;</li>
</ul>
</li>
<li>
<ol>
<li>数组中的方法<code>splice</code></li>
</ol>
</li>
</ul><p><code>splice</code> 既能实现删除,也能实现增加,还能实现修改</p><section><h6>3.1.3.1 splice的删除<a href="#3131-splice的删除"><span>#</span></a></h6><ul>
<li>返回值&lt;删除的数据以新数组的方式返回&gt;</li>
<li>原数组&lt;改变&gt;</li>
</ul><ol>
<li><code>splice(n,m);</code>从索引n开始,删除m个元素,把删除的内容以一个新数组的方式返回,原数组改变</li>
<li><code>splice(n);</code>从索引n开始,删除到数组的末尾</li>
<li><code>splice(0);</code>从索引0开始,删除到数组的末尾;原数组返回空数组,splice(0)相当于克隆一份原数组,这样的克隆会修改原来的数;例如:</li>
</ol><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>a</span></span><span>=</span><span>[</span><span>11</span><span>,</span><span>22</span><span>,</span><span>33</span><span>,</span><span>44</span><span>,</span><span>55</span><span>,</span><span>66</span><span>,</span><span>77</span><span>];</span></div></div><div><div><div>2</div></div><div><span>var</span><span><span> </span><span>res</span></span><span>=</span><span><span>a</span><span>.</span></span><span>splice</span><span>(</span><span>0</span><span>);</span></div></div><div><div><div>3</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>res</span><span>,</span><span>a</span><span>);</span></span></div></div><div><div><div>4</div></div><div><span>//(7) [11, 22, 33, 44, 55, 66, 77] , []</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li><code>splice();</code>相当于没有对原数组进行任何操作,splice()返回一个空数组.原数组不变;例如:</li>
</ol><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>a</span></span><span>=</span><span>[</span><span>11</span><span>,</span><span>22</span><span>,</span><span>33</span><span>,</span><span>44</span><span>,</span><span>55</span><span>,</span><span>66</span><span>,</span><span>77</span><span>];</span></div></div><div><div><div>2</div></div><div><span>var</span><span><span> </span><span>res</span></span><span>=</span><span><span>a</span><span>.</span></span><span>splice</span><span>();</span></div></div><div><div><div>3</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>res</span><span>,</span><span>a</span><span>);</span></span></div></div><div><div><div>4</div></div><div><span>//[] , (7) [11, 22, 33, 44, 55, 66, 77]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li><code>splice(a.length-1);</code>删除最后一项，把所有索引最后一个删除掉;例如:</li>
</ol><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>a</span></span><span>=</span><span>[</span><span>11</span><span>,</span><span>22</span><span>,</span><span>33</span><span>,</span><span>44</span><span>,</span><span>55</span><span>,</span><span>66</span><span>];</span></div></div><div><div><div>2</div></div><div><span>var</span><span><span> </span><span>res</span></span><span>=</span><span><span>a</span><span>.</span></span><span>splice</span><span><span>(</span><span>a</span><span>.</span></span><span>length</span><span>-</span><span>1</span><span>);</span></div></div><div><div><div>3</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>res</span><span>,</span><span>a</span><span>);</span></span></div></div><div><div><div>4</div></div><div><span>//[66] , (5) [11, 22, 33, 44, 55]</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h6>3.1.3.2 splice的修改<a href="#3132-splice的修改"><span>#</span></a></h6><ol>
<li><code>splice(n,m,x);</code> 从索引n开始，删除m个，用x替换删除的部分,x可以是多项;例如:</li>
</ol><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>b</span></span><span>=</span><span>[</span><span>1</span><span>,</span><span>2</span><span>,</span><span>3</span><span>,</span><span>4</span><span>,</span><span>5</span><span>,</span><span>6</span><span>];</span></div></div><div><div><div>2</div></div><div><span>var</span><span><span> </span><span>res</span></span><span>=</span><span><span>b</span><span>.</span></span><span>splice</span><span>(</span><span>1</span><span>,</span><span>2</span><span>,</span><span>11</span><span>,</span><span>12</span><span>,</span><span>13</span><span>);</span></div></div><div><div><div>3</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>res</span><span>,</span><span>b</span><span>);</span></span></div></div><div><div><div>4</div></div><div><span>//[2, 3] , (7) [1, 11, 12, 13, 4, 5, 6]</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h6>3.1.3.3 splice的增加<a href="#3133-splice的增加"><span>#</span></a></h6><ol>
<li><code>splice(n,0,x);</code> 从索引n开始，删除0个，用x替换删除的部分—&gt;相当于把x增加到索引n的前面;例如:</li>
</ol><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>a</span></span><span>=</span><span>[</span><span>11</span><span>,</span><span>22</span><span>,</span><span>33</span><span>,</span><span>44</span><span>,</span><span>55</span><span>,</span><span>66</span><span>];</span></div></div><div><div><div>2</div></div><div><span>var</span><span><span> </span><span>res</span></span><span>=</span><span><span>a</span><span>.</span></span><span>splice</span><span>(</span><span>1</span><span>,</span><span>0</span><span>,</span><span>77</span><span>,</span><span>88</span><span>);</span></div></div><div><div><div>3</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>res</span><span>,</span><span>a</span><span>);</span></span></div></div><div><div><div>4</div></div><div><span>//[] , (8) [11, 77, 88, 22, 33, 44, 55, 66]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li><code>splice(a.length,0,x);</code>向末尾增加,可增加多项</li>
</ol></section></section></section></section><section><h3>4.通过属性值查找索引<code>indexOf</code>、<code>lastIndexof</code><a href="#4通过属性值查找索引indexoflastindexof"><span>#</span></a></h3><p>通过属性值查找索引&lt;只有在标准浏览器下兼容的&gt;(数组中不兼容 字符串中兼容)原数组不变</p><ul>
<li>
<ol>
<li><code>indexOf()</code></li>
</ol>
</li>
<li>
<ol>
<li><code>lastIndexof()</code></li>
</ol>
</li>
</ul></section><section><h3>5.遍历数组中的每一项<a href="#5遍历数组中的每一项"><span>#</span></a></h3><section><h4>5.1 forEach(function(x,y,i){});没有返回值,例如:<a href="#51-foreachfunctionxyi没有返回值例如"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>b</span></span><span>=</span><span>[</span><span>11</span><span>,</span><span>22</span><span>,</span><span>33</span><span>,</span><span>44</span><span>,</span><span>55</span><span>,</span><span>66</span><span>,</span><span>11</span><span>];</span></div></div><div><div><div>2</div></div><div><span><span>b</span><span>.</span></span><span>forEach</span><span>(</span><span>function</span><span><span> (</span><span>item</span><span>,</span><span>index</span><span>) {</span></span></div></div><div><div><div>3</div></div><div><span>    </span><span>//item为数组当前项,index为数组中的索引</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>item</span><span>,</span><span>index</span><span>);</span></span></div></div><div><div><div>5</div></div><div><span>});</span></div></div><div><div><div>6</div></div><div><span>//没有返回值</span></div></div><div><div><div>7</div></div><div><span>var</span><span><span> </span><span>new1b</span></span><span>=</span><span><span>b</span><span>.</span></span><span>forEach</span><span>(</span><span>function</span><span><span> (</span><span>a</span><span>,</span><span>b</span><span>) {</span></span></div></div><div><div><div>8</div></div><div><span>    </span><span>return</span><span><span> </span><span>a</span></span><span>*</span><span>10</span><span>;</span></div></div><div><div><div>9</div></div><div><span>});</span></div></div><div><div><div>10</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>new1b</span><span>);</span></span><span>//undefined</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>5.2 map(function(x,y,i){return;});<a href="#52-mapfunctionxyireturn"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>b</span></span><span>=</span><span>[</span><span>11</span><span>,</span><span>22</span><span>,</span><span>33</span><span>,</span><span>44</span><span>,</span><span>55</span><span>,</span><span>66</span><span>,</span><span>11</span><span>];</span></div></div><div><div><div>2</div></div><div><span><span>b</span><span>.</span></span><span>map</span><span>(</span><span>function</span><span><span> (</span><span>item</span><span>,</span><span>index</span><span>) {</span></span></div></div><div><div><div>3</div></div><div><span>    </span><span>//item为数组当前项,index为数组中的索引</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>item</span><span>,</span><span>index</span><span>);</span></span></div></div><div><div><div>5</div></div><div><span>});</span></div></div><div><div><div>6</div></div><div><span>var</span><span><span> </span><span>newb</span></span><span>=</span><span><span>b</span><span>.</span></span><span>map</span><span>(</span><span>function</span><span><span> (</span><span>item</span><span>,</span><span>index</span><span>) {</span></span></div></div><div><div><div>7</div></div><div><span>    </span><span>return</span><span><span> </span><span>item</span></span><span>*</span><span>10</span><span>;</span></div></div><div><div><div>8</div></div><div><span>});</span></div></div><div><div><div>9</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>newb</span><span>);</span></span><span>//[110, 220, 330, 440, 550, 660, 110]</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>6.将数组转化为字符串<a href="#6将数组转化为字符串"><span>#</span></a></h3><section><h4>6.1 <code>join("")</code><a href="#61-join"><span>#</span></a></h4><p>按照每一个分隔符，把数组中的每一项拼接成一个字符串</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>b</span></span><span>=</span><span>[</span><span>12</span><span>,</span><span>22</span><span>,</span><span>33</span><span>,</span><span>44</span><span>,</span><span>55</span><span>];</span></div></div><div><div><div>2</div></div><div><span>var</span><span><span> </span><span>res</span></span><span>=</span><span><span>b</span><span>.</span></span><span>join</span><span>(</span><span>'+'</span><span>);</span></div></div><div><div><div>3</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>res</span><span>,</span><span>b</span><span>);</span></span></div></div><div><div><div>4</div></div><div><span>//"12+22+33+44+55"  (5) [12, 22, 33, 44, 55]</span></div></div><div><div><div>5</div></div><div><span>//扩展:eval：JS中把字符串变为JS表达式执行的一种方法</span></div></div><div><div><div>6</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>eval</span><span><span>(</span><span>res</span><span>));</span></span><span>//166</span></div></div><div><div><div>7</div></div><div><span>//简写:</span></div></div><div><div><div>8</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>eval</span><span><span>(</span><span>b</span><span>.</span></span><span>join</span><span>(</span><span>'+'</span><span>)));</span><span>//166</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>6.2 <code>toString()</code><a href="#62-tostring"><span>#</span></a></h4><p>原数组不变</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>b</span></span><span>=</span><span>[</span><span>12</span><span>,</span><span>22</span><span>,</span><span>33</span><span>,</span><span>44</span><span>,</span><span>55</span><span>];</span></div></div><div><div><div>2</div></div><div><span>var</span><span><span> </span><span>res</span></span><span>=</span><span><span>b</span><span>.</span></span><span>toString</span><span>();</span></div></div><div><div><div>3</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>res</span><span>);</span></span><span>//"12,22,33,44,55"</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>7.排序<a href="#7排序"><span>#</span></a></h3><section><h4>7.1 <code>reverse()</code><a href="#71-reverse"><span>#</span></a></h4><p>把数组倒过来排列,原数组也倒过来排列;例如:</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>b</span></span><span>=</span><span>[</span><span>11</span><span>,</span><span>22</span><span>,</span><span>33</span><span>,</span><span>44</span><span>,</span><span>55</span><span>,</span><span>66</span><span>,</span><span>11</span><span>];</span></div></div><div><div><div>2</div></div><div><span>var</span><span><span> </span><span>res</span></span><span>=</span><span><span>b</span><span>.</span></span><span>reverse</span><span>();</span></div></div><div><div><div>3</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>res</span><span>,</span><span>b</span><span>);</span></span></div></div><div><div><div>4</div></div><div><span>//(7) [11, 66, 55, 44, 33, 22, 11]   (7) [11, 66, 55, 44, 33, 22, 11]</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>7.2 sort();给数组进行排序,原数组也进行排序<a href="#72-sort给数组进行排序原数组也进行排序"><span>#</span></a></h4><ol>
<li><code>ary.sort();</code> 只能处理10以内的数字</li>
<li><code>sort(function(a,b){return a-b;});</code>从小到大排序</li>
<li><code>sort(function(a,b){return b-a;);</code>从大到小排序</li>
</ol></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E6%A8%A1%E5%9D%97%E5%8C%96/%E7%BB%84%E4%BB%B6%E5%8C%96%E5%BC%80%E5%8F%91/</id>
      <title type="text">微信小程序模块化/组件化开发</title>
      <published>2018-02-11T00:00:00.000Z</published>
      <updated>2018-02-11T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E6%A8%A1%E5%9D%97%E5%8C%96/%E7%BB%84%E4%BB%B6%E5%8C%96%E5%BC%80%E5%8F%91/"/>
      <summary type="text">微信小程序模块化/组件化开发</summary>
      <content type="html"><![CDATA[<section><h2>将公用组件抽离出来<a href="#将公用组件抽离出来"><span>#</span></a></h2><p>把一些内容抽取到一个公有的页面中</p><section><h3>1.在home下可以共用模板<a href="#1在home下可以共用模板"><span>#</span></a></h3><ul>
<li>1.在home文件夹下新建个目录(list-tmpl)
<ul>
<li>模板中只能放两种文件、wxml;不支持js和json</li>
<li>模板的标志template标签</li>
<li>模板要给他起个名字，就是我们要调用这个模板的时候要用的名字<code>&lt;template name='name'&gt;&lt;/template&gt;</code></li>
<li>可以放多个模板，但每个模板都要有自己的名字</li>
<li>同样css样式也要公有化</li>
</ul>
</li>
<li>2.导入模板(使用相对路径)
<ul>
<li><code>&lt;import src='list-tmpl/list-tmpl.wxml'/&gt;</code></li>
<li>is-&gt;模板名字,data-&gt;传入数据;<code>&lt;template is='list' data='{{item}}'&gt;&lt;/template&gt;</code></li>
</ul>
</li>
</ul><p>此时home.wxml文件</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>import</span><span> </span><span>src</span><span>=</span><span>'list-tmpl/list-tmpl.wxml'</span><span>/&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>swiper</span><span> </span><span>autoplay</span><span>=</span><span>'{{true}}'</span><span> </span><span>interval</span><span>=</span><span>'1000'</span><span> </span><span>indicator-dots</span><span>=</span><span>'{{true}}'</span><span> </span><span>circular</span><span>=</span><span>'{{true}}'</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>&lt;</span><span>swiper-item</span><span> </span><span>wx:for</span><span>=</span><span>'{{imgs}}'</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>&lt;</span><span>image</span><span> </span><span>src</span><span>=</span><span>'{{item}}'</span><span>&gt;&lt;/</span><span>image</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>&lt;/</span><span>swiper-item</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span>&lt;/</span><span>swiper</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span>&lt;</span><span>block</span><span> </span><span>wx:for</span><span>=</span><span>"{{lists}}"</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>&lt;</span><span>template</span><span> </span><span>is</span><span>=</span><span>'list'</span><span> </span><span>data</span><span>=</span><span>'{{item}}'</span><span>&gt;&lt;/</span><span>template</span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span>&lt;/</span><span>block</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.引入css样式,此时home.wxss文件<a href="#2引入css样式此时homewxss文件"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>@import</span><span> </span><span>'list-tmpl/list-tmpl.wxss'</span><span>;</span></div></div><div><div><div>2</div></div><div><span>swiper</span><span>{</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>height: </span><span>400</span><span>rpx;</span></div></div><div><div><div>4</div></div><div><span>}</span></div></div><div><div><div>5</div></div><div><span>swiper </span><span>image</span><span>{</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>width: </span><span><span>100</span><span>%</span></span><span>;</span></div></div><div><div><div>7</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h2>点击跳转详情页<a href="#点击跳转详情页"><span>#</span></a></h2><ul>
<li>事件不能直接绑在template标签上，因为在编译的过程中，最终会直接用一个模板将template替换掉。
<ul>
<li>解决方案&lt;在template标签外面包一层view标签&gt;，在view标签上绑定bindtap点击事件</li>
</ul>
</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/</id>
      <title type="text">微信小程序</title>
      <published>2018-02-10T00:00:00.000Z</published>
      <updated>2018-02-10T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/"/>
      <summary type="text">微信小程序</summary>
      <content type="html"><![CDATA[<section><h2>app文件<a href="#app文件"><span>#</span></a></h2><ul>
<li>app.json全局的配置样式</li>
<li>app.wxss全局的css样式</li>
<li>app.js全局的js样式</li>
</ul><section><h3>app.json<a href="#appjson"><span>#</span></a></h3><p>在该文件中不能使用‘//’来注释信息，否则报错</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>{</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>"pages": [</span></div></div><div><div><div>3</div></div><div><span>    </span><span>"pages/welcome/welcome"</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>],</span></div></div><div><div><div>5</div></div><div><span>  </span><span>"window"</span><span>: {</span></div></div><div><div><div>6</div></div><div><span>    </span><span>"navigationBarBackgroundColor"</span><span>: </span><span>"#b0b0b0"</span><span>,   //导航条的颜色</span></div></div><div><div><div>7</div></div><div><span>    </span><span>"navigationBarTextStyle"</span><span>: </span><span>"#fff"</span><span>,   //文字的样式</span></div></div><div><div><div>8</div></div><div><span>    </span><span>"navigationBarTitleText"</span><span>: </span><span>"Welcome"</span><span>,  //标题</span></div></div><div><div><div>9</div></div><div><span>    </span><span>"backgroundColor"</span><span>: </span><span>"#eeeeee"</span><span>,   //下拉样式的背景色</span></div></div><div><div><div>10</div></div><div><span>    </span><span>"backgroundTextStyle"</span><span>: </span><span>"light"</span><span>, //light和dark两个值，下拉样式中三个点的颜色，dark代表白色，light代表黑色</span></div></div><div><div><div>11</div></div><div><span>    </span><span>"enablePullDownRefresh"</span><span>: true   //是否可见下拉刷新</span></div></div><div><div><div>12</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>pages的第一个参数就是默认打开的页面</li>
<li>微信开发者工具，一个开发者只能一次打开一个页面，不能同时开多个页面</li>
</ul></section><section><h3>welcome.wxml<a href="#welcomewxml"><span>#</span></a></h3><ul>
<li>view替代div，view相当于一个盒子、一个视图框、一个容器</li>
<li>text标签替换span/p标签，text标签是我们所谓的文本标签</li>
<li>image标签，图片标签，src图片路径可以使用绝对路径/相对路径</li>
<li>文本不套text标签，在手机端是无法被选中的(无法复制)</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>view</span><span> </span><span>class</span><span>=</span><span>'container'</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>&lt;</span><span>image</span><span> </span><span>src</span><span>=</span><span>'../../images/touxiang.jpg'</span><span> </span><span>class</span><span>=</span><span>'avatar'</span><span>&gt;&lt;/</span><span>image</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>&lt;</span><span>text</span><span> </span><span>class</span><span>=</span><span>'title'</span><span>&gt;one&lt;/</span><span>text</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>&lt;</span><span>text</span><span> </span><span>class</span><span>=</span><span>'content'</span><span>&gt;hello world&lt;/</span><span>text</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span>&lt;/</span><span>view</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h4>1.事件(<code>https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/event.html</code>)<a href="#1事件httpsmpweixinqqcomdebugwxadocdevframeworkviewwxmleventhtml"><span>#</span></a></h4><ul>
<li>
<p>事件分为冒泡事件和非冒泡事件：</p>
<ul>
<li>冒泡事件：当一个组件上的事件被触发后，该事件会向父节点传递。
<ul>
<li>bindtap 绑定点击事件  会冒泡</li>
</ul>
</li>
<li>非冒泡事件：当一个组件上的事件被触发后，该事件不会向父节点传递。
<ul>
<li>catchtap 不会冒泡</li>
</ul>
</li>
</ul>
</li>
<li>
<p>WXML的冒泡事件列表：</p>
</li>
</ul>

<table><thead><tr><th>类型</th><th>触发条件</th><th>最低版本</th></tr></thead><tbody><tr><td><code>touchstart</code></td><td>手指触摸动作开始</td><td></td></tr><tr><td><code>touchmove</code></td><td>手指触摸后移动</td><td></td></tr><tr><td><code>touchcancel</code></td><td>手指触摸动作被打断，如来电提醒，弹窗</td><td></td></tr><tr><td><code>touchend</code></td><td>手指触摸动作结束</td><td></td></tr><tr><td><code>tap</code></td><td>手指触摸后马上离开</td><td></td></tr><tr><td><code>longpress</code></td><td>手指触摸后，超过350ms再离开，如果指定了事件回调函数并触发了这个事件，tap事件将不被触发</td><td><code>1.5.0</code></td></tr><tr><td><code>longtap</code></td><td>手指触摸后，超过350ms再离开（推荐使用longpress事件代替）</td><td></td></tr><tr><td><code>transitionend</code></td><td>会在 WXSS transition 或 wx.createAnimation 动画结束后触发</td><td></td></tr><tr><td><code>animationstart</code></td><td>会在一个 WXSS animation 动画开始时触发</td><td></td></tr><tr><td><code>animationiteration</code></td><td>会在一个 WXSS animation 一次迭代结束时触发</td><td></td></tr><tr><td><code>animationend</code></td><td>会在一个 WXSS animation 动画完成时触发</td><td></td></tr></tbody></table><ul>
<li><strong>注：除上表之外的其他组件自定义事件如无特殊声明都是非冒泡事件，如<code>&lt;form/&gt;</code>的submit事件，<code>&lt;input/&gt;</code>的input事件，<code>&lt;scroll-view/&gt;</code>的scroll事件，(详见各个组件)</strong></li>
</ul></section></section><section><h3>welcome.wxss<a href="#welcomewxss"><span>#</span></a></h3><ul>
<li>小程序开发文档地址：<a href="https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxss.html" target="_blank">https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxss.html</a>，WXSS样式中有介绍</li>
<li>目前支持的选择器有：</li>
</ul>

<table><thead><tr><th>选择器</th><th>样例</th><th>样例描述</th></tr></thead><tbody><tr><td>.class</td><td><code>.intro</code></td><td>选择所有拥有 class=“intro” 的组件</td></tr><tr><td>#id</td><td><code>#firstname</code></td><td>选择拥有 id=“firstname” 的组件</td></tr><tr><td>element</td><td><code>view</code></td><td>选择所有 view 组件</td></tr><tr><td>element,element</td><td><code>view, checkbox</code></td><td>选择所有文档的 view 组件和所有的 checkbox 组件</td></tr><tr><td>::after</td><td><code>view::after</code></td><td>在 view 组件后边插入内容</td></tr><tr><td>::before</td><td><code>view::before</code></td><td>在 view 组件前边插入内容</td></tr></tbody></table><ul>
<li>支持flex布局</li>
<li>不以px为单位，因为要支持适配各种尺寸手机，用rpx为单位
<ul>
<li>1rpx=2px(在iphone6下)</li>
<li>宽度(iphone6) 750rpx=100%</li>
<li>高度一般采用rpx</li>
<li>线条 1px(仍然是实际的高度);</li>
</ul>
</li>
</ul><section><h4>尺寸单位<a href="#尺寸单位"><span>#</span></a></h4><ul>
<li>rpx（responsive pixel）: 可以根据屏幕宽度进行自适应。规定屏幕宽为750rpx。如在 iPhone6 上，屏幕宽度为375px，共有750个物理像素，则750rpx = 375px = 750物理像素，1rpx = 0.5px = 1物理像素。</li>
</ul>

<table><thead><tr><th>设备</th><th>rpx换算px(屏幕宽度/750)</th><th>px换算rpx (750/屏幕宽度)</th></tr></thead><tbody><tr><td>iPhone5</td><td>1rpx = 0.42px</td><td>1px = 2.34rpx</td></tr><tr><td>iPhone6</td><td>1rpx = 0.5px</td><td>1px = 2rpx</td></tr><tr><td>iPhone6 Plus</td><td>1rpx = 0.552px</td><td>1px = 1.81rpx</td></tr></tbody></table><ul>
<li>
<p>建议： 开发微信小程序时设计师可以用 iPhone6 作为视觉稿的标准。</p>
</li>
<li>
<p>注意： 在较小的屏幕上不可避免的会有一些毛刺，请在开发时尽量避免这种情况。</p>
</li>
</ul></section></section><section><h3>app.wxss中设置公用样式(如字体)<a href="#appwxss中设置公用样式如字体"><span>#</span></a></h3></section><section><h3>点击跳转页面<a href="#点击跳转页面"><span>#</span></a></h3><section><h4>1.welcome.js<a href="#1welcomejs"><span>#</span></a></h4><div><div><div><figure><figcaption><span>pages/welcome/welcome.js</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>Page</span><span>({</span></div></div><div><div><div>2</div></div><div><span>  </span><span>/*页面的初始数据*/</span></div></div><div><div><div>3</div></div><div><span>  </span><span>data</span><span>:</span><span> {</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>5</div></div><div><span>  </span><span>bindToHome</span><span>(){</span></div></div><div><div><div>6</div></div><div><span>    </span><span>//关闭当前页面,跳转到应用内的某个页面，所有的方法都是异步的</span></div></div><div><div><div>7</div></div><div><span>    </span><span>//redirectTo 重定向 跳到下页，下页无返回按钮</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>wx</span><span>.</span><span>redirectTo</span><span>({</span></div></div><div><div><div>9</div></div><div><span>      </span><span>url</span><span>:</span><span> </span><span>'../home/home'</span><span>,</span></div></div><div><div><div>10</div></div><div><span>      </span><span>success</span><span>:</span><span>function</span><span>(){</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span><span>      </span></span><span>},</span></div></div><div><div><div>13</div></div><div><span>      </span><span>fail</span><span>:</span><span>function</span><span>(){</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span><span>      </span></span><span>},</span></div></div><div><div><div>16</div></div><div><span>      </span><span>complete</span><span>:</span><span>function</span><span>(){</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span><span>      </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>});</span></div></div><div><div><div>20</div></div><div><span>    </span><span>//navigateTo保留当前页面，跳转到应用内的某个页面 只适合导航跳转</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>wx</span><span>.</span><span>navigateTo</span><span>({</span></div></div><div><div><div>22</div></div><div><span>      </span><span>url</span><span>:</span><span> </span><span>'../home/home'</span><span>,</span></div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>})</span></div></div><div><div><div>24</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span>})</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h4>2.welcome.wxml<a href="#2welcomewxml"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>view</span><span> </span><span>class</span><span>=</span><span>'container'</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>&lt;</span><span>image</span><span> </span><span>src</span><span>=</span><span>'../../images/touxiang.jpg'</span><span> </span><span>class</span><span>=</span><span>'avatar'</span><span> </span><span>bindtap</span><span>=</span><span>'bindToHome'</span><span>&gt;&lt;/</span><span>image</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>&lt;</span><span>text</span><span> </span><span>class</span><span>=</span><span>'title'</span><span>&gt;one&lt;/</span><span>text</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>&lt;</span><span>text</span><span> </span><span>class</span><span>=</span><span>'content'</span><span>&gt;hello world&lt;/</span><span>text</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span>&lt;/</span><span>view</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>更改子级页面的title<a href="#更改子级页面的title"><span>#</span></a></h3><ul>
<li>内部/子级页面没有pages属性，只有window属性</li>
</ul><section><h4>1.home.json<a href="#1homejson"><span>#</span></a></h4><ul>
<li>子页面不需要写window了</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>"navigationBarBackgroundColor"</span><span>: </span><span>"green"</span><span>,</span></div></div><div><div><div>3</div></div><div><span>    </span><span>"navigationBarTextStyle"</span><span>: </span><span>"yellow"</span><span>,</span></div></div><div><div><div>4</div></div><div><span>    </span><span>"navigationBarTitleText"</span><span>: </span><span>"主页"</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>主页的tab键<a href="#主页的tab键"><span>#</span></a></h3><section><h4>1.app.json<a href="#1appjson"><span>#</span></a></h4><ul>
<li>
<p>tabBar配置文档地址<code>https://mp.weixin.qq.com/debug/wxadoc/dev/framework/config.html</code></p>
</li>
<li>
<p>tabBar(tab的列表最少2个，最多5个)
</p><figure><img alt="Alt 伪元素选择器" loading="lazy" width="1676" height="624" src="/_astro/tabBarErr.Dznale1h_Z2fFPGY.webp" /><figcaption>Alt 伪元素选择器</figcaption></figure>“当tab列表不足2个的时候会报错”<p></p>
</li>
<li>
<p>tabBar列表有两个</p>
</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>"tabBar"</span><span>: {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>"borderStyle"</span><span>:</span><span> </span><span>"white"</span><span>,</span><span>//tab盒子的border-top，有两个值black（黑色）、white（白色）</span></div></div><div><div><div>3</div></div><div><span>    </span><span>"color"</span><span>:</span><span> </span><span>"red"</span><span>,</span><span>//字体颜色</span></div></div><div><div><div>4</div></div><div><span>    </span><span>"selectedColor"</span><span>:</span><span> </span><span>"orange"</span><span>,</span><span>//激活的字体颜色</span></div></div><div><div><div>5</div></div><div><span>    </span><span>"list"</span><span>:</span><span> [{</span></div></div><div><div><div>6</div></div><div><span>      </span><span>"pagePath"</span><span>:</span><span> </span><span>"pages/home/home"</span><span>,</span><span>//页面路径(跳转的对应路径)，只能使用相对路径</span></div></div><div><div><div>7</div></div><div><span>      </span><span>"text"</span><span>:</span><span> </span><span>"首页"</span><span>,</span></div></div><div><div><div>8</div></div><div><span>      </span><span>"iconPath"</span><span>:</span><span> </span><span>"images/anhoo.png"</span><span>,</span><span>//页面默认的icon路径，只能使用相对路径</span></div></div><div><div><div>9</div></div><div><span>      </span><span>"selectedIconPath"</span><span>:</span><span> </span><span>"images/anhoo1.png"</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>},{</span></div></div><div><div><div>11</div></div><div><span>      </span><span>"pagePath"</span><span>:</span><span> </span><span>"pagePath"</span><span>,</span></div></div><div><div><div>12</div></div><div><span>      </span><span>"text"</span><span>:</span><span> </span><span>"text"</span><span>,</span></div></div><div><div><div>13</div></div><div><span>      </span><span>"iconPath"</span><span>:</span><span> </span><span>"images/anhoo.png"</span><span>,</span></div></div><div><div><div>14</div></div><div><span>      </span><span>"selectedIconPath"</span><span>:</span><span> </span><span>"selectedIconPath"</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}]</span></div></div><div><div><div>16</div></div><div><span><span>  </span></span><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><ul>
<li>
<p><strong>此处有坑</strong></p>
<ul>
<li>升级到1.2版本后，如果有tabBar，只能使用switchTab方式切换</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>//保留当前页面，跳转到应用内的某个页面 navigateTo只适合导航跳转</span></div></div><div><div><div>2</div></div><div><span>// wx.navigateTo({</span></div></div><div><div><div>3</div></div><div><span>//   url: '../home/home',</span></div></div><div><div><div>4</div></div><div><span>// });</span></div></div><div><div><div>5</div></div><div><span>//跳转到tabBar页面,并关闭其他所有非tabBary页面</span></div></div><div><div><div>6</div></div><div><span>//如果有tabBar，只能使用switchTab方式切换</span></div></div><div><div><div>7</div></div><div><span><span>wx</span><span>.</span></span><span>switchTab</span><span>({</span></div></div><div><div><div>8</div></div><div><span>  </span><span>url</span><span>:</span><span> </span><span>''</span><span>,</span></div></div><div><div><div>9</div></div><div><span>})</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>此时app.json文件</p>
</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>{</span></div></div><div><div><div>2</div></div><div><span>  </span><span>"pages"</span><span>: [</span></div></div><div><div><div>3</div></div><div><span>    </span><span>"pages/welcome/welcome"</span><span>,</span></div></div><div><div><div>4</div></div><div><span>    </span><span>"pages/home/home"</span><span>,</span></div></div><div><div><div>5</div></div><div><span>    </span><span>"pages/notes/notes"</span><span>,</span></div></div><div><div><div>6</div></div><div><span>    </span><span>"pages/event/event"</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>],</span></div></div><div><div><div>8</div></div><div><span>  </span><span>"window"</span><span>: {</span></div></div><div><div><div>9</div></div><div><span>    </span><span>"navigationBarBackgroundColor"</span><span>:</span><span> </span><span>"#b0b0b0"</span><span>,</span></div></div><div><div><div>10</div></div><div><span>    </span><span>"navigationBarTextStyle"</span><span>:</span><span> </span><span>"green"</span><span>,</span></div></div><div><div><div>11</div></div><div><span>    </span><span>"navigationBarTitleText"</span><span>:</span><span> </span><span>"Welcome"</span></div></div><div><div><div>12</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>13</div></div><div><span>  </span><span>"tabBar"</span><span>: {</span></div></div><div><div><div>14</div></div><div><span>    </span><span>"borderStyle"</span><span>:</span><span> </span><span>"white"</span><span>,</span></div></div><div><div><div>15</div></div><div><span>    </span><span>"color"</span><span>:</span><span> </span><span>"red"</span><span>,</span></div></div><div><div><div>16</div></div><div><span>    </span><span>"selectedColor"</span><span>:</span><span> </span><span>"orange"</span><span>,</span></div></div><div><div><div>17</div></div><div><span>    </span><span>"list"</span><span>:</span><span> [{</span></div></div><div><div><div>18</div></div><div><span>      </span><span>"pagePath"</span><span>:</span><span> </span><span>"pages/home/home"</span><span>,</span></div></div><div><div><div>19</div></div><div><span>      </span><span>"text"</span><span>:</span><span> </span><span>"首页"</span><span>,</span></div></div><div><div><div>20</div></div><div><span>      </span><span>"iconPath"</span><span>:</span><span> </span><span>"images/anhoo1.png"</span><span>,</span></div></div><div><div><div>21</div></div><div><span>      </span><span>"selectedIconPath"</span><span>:</span><span> </span><span>"images/anhoo.png"</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>},{</span></div></div><div><div><div>23</div></div><div><span>      </span><span>"pagePath"</span><span>:</span><span> </span><span>"pages/notes/notes"</span><span>,</span></div></div><div><div><div>24</div></div><div><span>      </span><span>"text"</span><span>:</span><span> </span><span>"笔记"</span><span>,</span></div></div><div><div><div>25</div></div><div><span>      </span><span>"iconPath"</span><span>:</span><span> </span><span>"images/anhoo1.png"</span><span>,</span></div></div><div><div><div>26</div></div><div><span>      </span><span>"selectedIconPath"</span><span>:</span><span> </span><span>"images/anhoo.png"</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}]</span></div></div><div><div><div>28</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section><section><h3>主页banner制作<a href="#主页banner制作"><span>#</span></a></h3><ul>
<li>为了开发方便，将app.json中的pages配置调换一下位置，将home文件的配置放在最上面</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span> </span><span>"pages"</span><span>: [</span></div></div><div><div><div>2</div></div><div><span>    </span><span>"pages/home/home"</span><span>,</span></div></div><div><div><div>3</div></div><div><span>    </span><span>"pages/notes/notes"</span><span>,</span></div></div><div><div><div>4</div></div><div><span>    </span><span>"pages/event/event"</span><span>,</span></div></div><div><div><div>5</div></div><div><span>    </span><span>"pages/welcome/welcome"</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>此时默认打开的就是首页</p><section><h4>1.home.wxml<a href="#1homewxml"><span>#</span></a></h4><ul>
<li>
<p>不能使用jQuery等，因为微信小程序中没有dom</p>
</li>
<li>
<p>swiper内置的组件，滑动插件</p>
<ul>
<li><code>autoplay='{{true}}'</code>自动播放，默认<code>{{false}}</code>;</li>
<li><strong>此处有坑&lt;不能写成&gt;<code>autoplay='true'</code>或者<code>autoplay='false'</code>，这样写是字符串，默认转为布尔类型，即使设置为<code>false</code>，<code>'false'</code>转为布尔类型也是<code>true</code>，也会自动播放，所以一定要加<code>双大括号</code></strong></li>
<li>interval自动切换间隔时间</li>
<li><code>indicator-dots='{{true}}'</code>轮播图对应的小点</li>
<li><strong>同autoplay，一定要加<code>双大括号</code></strong></li>
<li><code>circular='{{true}}'</code>循环轮播</li>
<li><strong>同autoplay，一定要加<code>双大括号</code></strong></li>
<li><code>vertical='{{true}}'</code> 轮播图上下滚动</li>
<li><strong>此处有坑&lt;设置banner图的高&gt;，不能给swiper-item标签设置，要给他的父级swiper标签设置</strong></li>
</ul>
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>//设置banner图的高为600rpx,此处的style不需要加`双大括号`</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>swiper</span><span> </span><span>autoplay</span><span>=</span><span>'{{true}}'</span><span> </span><span>interval</span><span>=</span><span>'1000'</span><span> </span><span>indicator-dots</span><span>=</span><span>'{{true}}'</span><span> </span><span>circular</span><span>=</span><span>'{{true}}'</span><span> </span><span>vertical</span><span>=</span><span>'{{true}}'</span><span> </span><span>style</span><span>=</span><span>'height:600rpx;'</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>&lt;</span><span>swiper-item</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>&lt;</span><span>image</span><span> </span><span>src</span><span>=</span><span>'/images/banner1.jpg'</span><span>&gt;&lt;/</span><span>image</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>&lt;/</span><span>swiper-item</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>&lt;</span><span>swiper-item</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>&lt;</span><span>image</span><span> </span><span>src</span><span>=</span><span>'/images/banner2.jpg'</span><span>&gt;&lt;/</span><span>image</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>&lt;/</span><span>swiper-item</span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>&lt;</span><span>swiper-item</span><span>&gt;</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>&lt;</span><span>image</span><span> </span><span>src</span><span>=</span><span>'/images/banner3.jpg'</span><span>&gt;&lt;/</span><span>image</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>&lt;/</span><span>swiper-item</span><span>&gt;</span></div></div><div><div><div>12</div></div><div><span><span>  </span></span><span>&lt;</span><span>swiper-item</span><span>&gt;</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>&lt;</span><span>image</span><span> </span><span>src</span><span>=</span><span>'/images/banner4.jpg'</span><span>&gt;&lt;/</span><span>image</span><span>&gt;</span></div></div><div><div><div>14</div></div><div><span><span>  </span></span><span>&lt;/</span><span>swiper-item</span><span>&gt;</span></div></div><div><div><div>15</div></div><div><span><span>  </span></span><span>&lt;</span><span>swiper-item</span><span>&gt;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>&lt;</span><span>image</span><span> </span><span>src</span><span>=</span><span>'/images/banner5.jpg'</span><span>&gt;&lt;/</span><span>image</span><span>&gt;</span></div></div><div><div><div>17</div></div><div><span><span>  </span></span><span>&lt;/</span><span>swiper-item</span><span>&gt;</span></div></div><div><div><div>18</div></div><div><span>&lt;/</span><span>swiper</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>
</li>
</ul></section></section><section><h3>绑定动态数据<a href="#绑定动态数据"><span>#</span></a></h3><ul>
<li>数据是单向绑定，数据改动了可以渲染视图，但是视图改动了不会刷新数据</li>
<li>wx 静态遍历不需要</li>
<li>1.home.js</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>data</span><span>:</span><span>{</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>imgs:[</span></div></div><div><div><div>3</div></div><div><span>    </span><span>'/images/banner1.jpg'</span><span>,</span></div></div><div><div><div>4</div></div><div><span>    </span><span>'/images/banner2.jpg'</span><span>,</span></div></div><div><div><div>5</div></div><div><span>    </span><span>'/images/banner3.jpg'</span><span>,</span></div></div><div><div><div>6</div></div><div><span>    </span><span>'/images/banner4.jpg'</span><span>,</span></div></div><div><div><div>7</div></div><div><span>    </span><span>'/images/banner5.jpg'</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>]</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p><code>{{item}} wx:for='{{imgs}}'</code></p>
</li>
<li>
<p>2.home.wxml</p>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>swiper</span><span> </span><span>autoplay</span><span>=</span><span>'{{true}}'</span><span> </span><span>interval</span><span>=</span><span>'1000'</span><span> </span><span>indicator-dots</span><span>=</span><span>'{{true}}'</span><span> </span><span>circular</span><span>=</span><span>'{{true}}'</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>&lt;</span><span>swiper-item</span><span> </span><span>wx:for</span><span>=</span><span>'{{imgs}}'</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>&lt;</span><span>image</span><span> </span><span>src</span><span>=</span><span>'{{item}}'</span><span>&gt;&lt;/</span><span>image</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>&lt;/</span><span>swiper-item</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span>&lt;/</span><span>swiper</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p><code>wx:for-item='num'</code>可指定item叫什么名字，这里的item就叫num</p>
</li>
<li>
<p>2.home.wxml</p>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>swiper</span><span> </span><span>autoplay</span><span>=</span><span>'{{true}}'</span><span> </span><span>interval</span><span>=</span><span>'1000'</span><span> </span><span>indicator-dots</span><span>=</span><span>'{{true}}'</span><span> </span><span>circular</span><span>=</span><span>'{{true}}'</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>&lt;</span><span>swiper-item</span><span> </span><span>wx:for</span><span>=</span><span>'{{imgs}}'</span><span> </span><span>wx:for-item</span><span>=</span><span>'num'</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>&lt;</span><span>image</span><span> </span><span>src</span><span>=</span><span>'{{num}}'</span><span>&gt;&lt;/</span><span>image</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>&lt;/</span><span>swiper-item</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span>&lt;/</span><span>swiper</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li><strong>注意:<code>wx:for-item='num'</code>,num不加<code>双大括号</code></strong></li>
</ul></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/ReactNative%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/</id>
      <title type="text">ReactNative环境搭建</title>
      <published>2018-01-24T00:00:00.000Z</published>
      <updated>2018-01-24T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/ReactNative%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/"/>
      <summary type="text">ReactNative环境搭建</summary>
      <content type="html"><![CDATA[<blockquote><p>官方中文文档地址<a href="https://reactnative.cn/docs/0.51/getting-started.html" target="_blank">https://reactnative.cn/docs/0.51/getting-started.html</a></p></blockquote>
<ul>
<li>如果是ios并不长，如果是安卓相对繁琐一些</li>
<li>操作系统分为/Linux/Windows</li>
<li>在macOS下可以开发ios和安卓的，但是Linux/Windows只能开发安卓的(如果工作中老板要你用ReactNative，你尽量和老板申请个mac本)</li>
</ul>

<section><h2>步骤<a href="#步骤"><span>#</span></a></h2><section><h3>1.安装Node.js/Homebrew<a href="#1安装nodejshomebrew"><span>#</span></a></h3><ul>
<li>百度搜索Node.js</li>
<li>Mac环境(百度搜索Homebrew)</li>
</ul></section><section><h3>1-1.Node.js安装<a href="#1-1nodejs安装"><span>#</span></a></h3><ul>
<li>
<p>安装后需要配置一下环境变量(我的电脑-属性-高级系统设置-环境变量(path中的数据新增nodejs路径))</p>
</li>
<li>
<p>1-1-1.nodejs安装提示</p>
<ul>
<li>window配置环境变量参考:<code>https://jingyan.baidu.com/article/f3e34a128dc9aff5eb6535dc.html</code></li>
<li>ReactNative和很多开发工具一样，会大量使用命令行工具，建议学习一些基本windows/unix/linux指令(mac和linux下是比较相似的，在windows下是不一样的)
<ul>
<li>参考.bat文件、unix/linux下的.sh文件(dir/ls 列出文件;copy/cp 拷贝;cd/cd 切换目录)</li>
</ul>
</li>
</ul>
</li>
<li>
<p>1-1-2.关于Node.js版本(建议使用6以上的版本)</p>
</li>
<li>
<p>1-1-3.npm的作用和package.json</p>
<ul>
<li>npm是nodejs的包管理器，nodejs是一个开源的环境，所谓包管理器就是取之于开源贡献者的代码，用之于开发者，这样一个桥梁的一个作用。</li>
<li>包管理器主要源自于国外，国内做的比较好的就是淘宝(淘宝镜像)。</li>
</ul>
</li>
<li>
<p>1-1-4.关于淘宝镜像的问题</p>
<ul>
<li>
<p>有时候会有一定的同步问题，如果npm install的时候非常慢，建议安装，安装后先移除项目目录下node_modules文件夹</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>npm</span><span> </span><span>config</span><span> </span><span>set</span><span> </span><span>registry</span><span> </span><span>https</span><span>:</span></span><span>//registry.npm.taobao.org --global</span></div></div><div><div><div>2</div></div><div><span><span>npm</span><span> </span><span>config</span><span> </span><span>set</span><span> </span><span>disturl</span><span> </span><span>https</span><span>:</span></span><span>//npm.taobao.org/list --global</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
</ul></section><section><h3>1-2.Homebrew安装<a href="#1-2homebrew安装"><span>#</span></a></h3><ul>
<li>macOS需要安装<code>Homebrew</code>，前提是有<code>Ruby</code>，一般mac自带<code>Ruby</code>(可参考reactnative.cn官方中文文档)</li>
<li>通常情况下<code>Homebrew</code>已经有了，不需要安装</li>
</ul></section><section><h3>1-3.JDK安装<a href="#1-3jdk安装"><span>#</span></a></h3><ul>
<li>
<p>安卓的版是需要JAVA的，所以要安装JDK</p>
</li>
<li>
<p>1-3-1.JDK小贴士</p>
<ul>
<li>目前jdk有两个版本(OPENJDK/Oracle Java JDK)，使用Android Studio开发需要JDK</li>
</ul>
</li>
<li>
<p>1-3-2.注意事项</p>
<ul>
<li>版本差别不大，1.7/1.8应该都可以</li>
<li>JAVA安装成功之后通常需要设置一个JAVA_HOME的环境变量，window参考:<a href="https://jingyan.baidu.com/article/f3e34a128dc9aff5eb6535dc.html" target="_blank">https://jingyan.baidu.com/article/f3e34a128dc9aff5eb6535dc.html</a>;<code>MacOS</code>/<code>Linux</code>/<code>Unix</code>通常需要<code>export JAVA_HOME=(java路径)</code> 具体可以百度下。</li>
</ul>
</li>
</ul></section></section>
<section><h2>2.开发工具<a href="#2开发工具"><span>#</span></a></h2><ul>
<li>
<p>2-1.安装<code>Xcode</code>、<code>Android Studio</code></p>
<ul>
<li><code>Mac</code>(<code>Xcode</code>)&lt;开发ios用&gt;<code>Xcode</code>，必须用<code>Mac</code>开发。</li>
<li><code>Android Studio</code>比较麻烦一些
<ul>
<li>官方做法：<a href="https://developer.android.com" target="_blank">https://developer.android.com</a> (在不翻墙的情况下到该地址下载<code>Android Studio</code>)</li>
<li>非官方做法：百度<code>Android Studio</code>，即可下载</li>
</ul>
</li>
</ul>
</li>
<li>
<p>2-2.工具任意以下其中之一</p>
<ul>
<li><code>webstore</code>(推荐使用，代码跟踪、代码提示做的比较好)</li>
<li><code>Visual Studio Code</code></li>
<li><code>Atom</code></li>
</ul>
</li>
<li>
<p>2-3.语法设置</p>
<ul>
<li>会用react的人都知道，react是使用JSX语法，而<code>ReactNative</code>也是使用<code>JSX</code>语法，在<code>webstore</code>中需要设置成react JSX，否则会有很多报错
<figure><img alt="Alt webstore打开设置窗口" loading="lazy" width="653" height="1116" src="/_astro/webstore%E6%89%93%E5%BC%80%E8%AE%BE%E7%BD%AE%E7%AA%97%E5%8F%A3.Dm0WxHGC_1U6DRs.webp" /><figcaption>Alt webstore打开设置窗口</figcaption></figure>“webstore打开设置窗口”
<figure><img alt="Alt JSX语法设置" loading="lazy" width="2037" height="1402" src="/_astro/JSX%E8%AF%AD%E6%B3%95%E8%AE%BE%E7%BD%AE.CvqEEFHF_Z1LIK80.webp" /><figcaption>Alt JSX语法设置</figcaption></figure>“JSX语法设置”</li>
</ul>
</li>
<li>
<p>2-4.推荐使用Vim编辑器</p>
<ul>
<li>可结合<code>webstore</code>/<code>Visual Studio Code</code>/<code>Atom</code> 这三款工具使用，特点就是快。</li>
</ul>
</li>
</ul></section>
<section><h2>3.难点<a href="#3难点"><span>#</span></a></h2><ul>
<li>
<p>3-1.什么是Android SDK</p>
</li>
<li>
<p>3-2.SDK安装步骤</p>
<ul>
<li>
<ol>
<li>在AndroidStudio中点开偏好</li>
</ol>
</li>
<li>
<ol>
<li>在搜索框中输入Android SDK</li>
</ol>
</li>
<li>
<ol>
<li>然后勾选需要安装的SDK工具</li>
</ol>
</li>
<li>
<ol>
<li>在SDK Platforms窗口中，选择Show Package Details,然后在Android6.0(Marshmallow)中勾选Google Apis、Android SDK Platform 23、Intel x86 Atom64 System Image以及Google APIs intel x86 Atom64 System Image</li>
</ol>
</li>
<li>
<ol>
<li>在SDK Tools窗口中，选择Show Package Details，然后在Android SDK Build Tools中勾选Android SDK Build-Tools 23.0.1</li>
</ol>
</li>
<li>
<ol>
<li>配置ANDROID_HOME环境变量</li>
</ol>
<ul>
<li>在MacOS下，在~/.bash_profile中添加</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>export</span><span> </span><span>ANDROID_HOME</span><span>=~/</span><span>Library</span><span>/</span><span>Android</span><span>/</span><span>sdk</span></div></div><div><div><div>2</div></div><div><span>export</span><span> </span><span>PATH</span><span>=</span><span><span>$</span><span>{</span></span><span>PATH</span><span><span>}:</span><span>$</span><span>{</span></span><span>ANDROID_HOME</span><span>}</span><span>/</span><span>tools</span></div></div><div><div><div>3</div></div><div><span>export</span><span> </span><span>PATH</span><span>=</span><span><span>$</span><span>{</span></span><span>PATH</span><span><span>}:</span><span>$</span><span>{</span></span><span>ANDROID_HOME</span><span>}</span><span>/</span><span>platform</span><span>-</span><span>tools</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>在Linux下需要在.bashrc中添加相应内容</li>
<li>在windows下参考<a href="https://jingyan.baidu.com/article/f3e34a128dc9aff5eb6535dc.html" target="_blank">https://jingyan.baidu.com/article/f3e34a128dc9aff5eb6535dc.html</a></li>
</ul>
</li>
</ul>
</li>
<li>
<p>3-3.Android模拟器</p>
<ul>
<li>建议使用Genymotion(建议)
<ul>
<li>建议使用Genymotion官网注册一个账号(注意，他不认数字的邮箱，必须是字母的)</li>
<li>下载一个genymotion软件</li>
<li><strong>个人版是免费的，企业版收费</strong></li>
<li><strong>Genymotio实际用的是virtualbox</strong></li>
</ul>
</li>
<li><code>Android Studio</code>自带的AVD(不建议)
<ul>
<li>如果要在<code>Android Studio</code>中使用AVD必须安装HAXM否则会慢，可以在<code>Android Studio</code>中配置，首先需要安装(配置过程及其复杂)
<ul>
<li>大概需要安装的有:<code>Android SDK</code>、<code>Android SDK Platform</code>、<code>Performance</code> (<code>Intel &amp;reg; HAXM</code>)、<code>Android Virtual</code> Device</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p>3-4.windows下配置特别提醒</p>
<ul>
<li>windows下配置较为困难，如果配置完成后发现红屏幕，有各种各样的原因，其中在windows7下通常需要设置<code>Virtualbox</code>的网络最为棘手。</li>
</ul>
</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/%E6%B5%8F%E8%A7%88%E5%99%A8%E7%9A%84%E8%B7%A8%E5%9F%9F%E9%97%AE%E9%A2%98%E4%BB%A5%E5%8F%8A%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88(%E8%BD%AC%E8%BD%BD)/</id>
      <title type="text">浏览器的跨域问题以及解决方案(转载)</title>
      <published>2017-10-07T00:00:00.000Z</published>
      <updated>2017-10-07T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/%E6%B5%8F%E8%A7%88%E5%99%A8%E7%9A%84%E8%B7%A8%E5%9F%9F%E9%97%AE%E9%A2%98%E4%BB%A5%E5%8F%8A%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88(%E8%BD%AC%E8%BD%BD)/"/>
      <summary type="text">浏览器的跨域问题以及解决方案(转载)</summary>
      <content type="html"><![CDATA[<section><h2>解决跨域一:<code>Cookie</code>如何实现跨域<a href="#解决跨域一cookie如何实现跨域"><span>#</span></a></h2><ul>
<li><code>Cookie</code>是服务器写入浏览器的一段信息，只有同源的网页才能共享，但是，两个网页一级域名相同，只是二级域名不同，浏览器允许通过设置document.domain共Cookie。</li>
</ul><ul>
<li>举例来说，A网站是:<code>http:weibo.qq.com</code>;B网站是:<code>http:lol.qq.com</code>;那么只需设置相同的<code>document.domain</code>,两个网页就可共享<code>Cookie</code>。</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>document</span><span>.</span></span><span>domain</span><span> </span><span>=</span><span> </span><span>'qq.com'</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>现在，A网页通过脚本设置一个<code>Cookie</code>。</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>document</span><span>.</span></span><span>Cookie</span><span> </span><span>=</span><span> </span><span>"test1=hello"</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>B网页就能读到这个<code>Cookie</code>。</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>getCookie</span><span> </span></span><span>=</span><span><span> </span><span>document</span><span>.</span></span><span>cookie</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p>注意：这种方法只适用于<code>Cookie</code>和<code>iframe</code>窗口，<code>LocalStorage</code>和<code>IndexDB</code>无法通过这种方法规避，而要使用下文将介绍的<code>PostMessage API</code>。
另外，服务器也可以在设置<code>Cookie</code>的时候，指定<code>Cookie</code>的所属域名为一级域名,比如：<code>.qq.com</code></p></blockquote><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Set-Cookie:key=value;domain=&lt;</span><span>span</span><span> style="color:</span><span>#cc0000;"</span><span>&gt;</span><span>.qq</span><span>.com&lt;</span><span>/</span><span>span</span><span>&gt;</span><span>;path=</span><span>/</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>这样的话，二级域名和三级域名不用做任何设置，都可以读取这个<code>Cookie</code>。</li>
</ul></section>
<section><h2>解决跨域问题二&lt;如何跨域获取dom&gt;<a href="#解决跨域问题二"><span>#</span></a></h2><ul>
<li>
<p>如果两个网页不同源，就无法拿到对方的DOM。典型的例子是<code>iframe</code>窗口和<code>window.open</code>方法打开的窗口，它们与父窗口无法通信。</p>
</li>
<li>
<p>比如,父窗口运行下面的命令，如果<code>iframe</code>窗口不是同源将会报错。</p>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>document</span><span>.</span></span><span>getElementById</span><span>(</span><span>"iframe"</span><span>).</span><span>contentWindow</span><span>.</span><span>document</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>上面命令中，父窗口想获取子窗口的DOM，应为跨源导致报错。反之亦然，子窗口获取主窗口的DOM也会报错。</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>window</span><span>.</span></span><span>parent</span><span>.</span><span>document</span><span>.</span><span>body</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p>如果两个窗口一级域名相同，只是二级域名不同，那么设置4-1介绍的<code>document.domain</code>属性，就可规避同源政策，拿到<code>DOM</code>。</p>
</li>
<li>
<p>对于完全不相同的网站，目前有三种方法，可以解决跨域窗口的通信问题。</p>
<ul>
<li>(1)片段识别符(<code>fragment identifier</code>)</li>
<li>(2)<code>window.name</code></li>
<li>(3)跨文档通信<code>API</code>(<code>Cross-document messaging</code>)</li>
</ul>
</li>
</ul><section><h3>1) 片段识别符<a href="#1-片段识别符"><span>#</span></a></h3><ul>
<li>片段识别符指的是，<code>URL</code>的<code>#</code>号后面的部分，比如<code>http://qq.com/x.html#fragment</code>的<code>#fragment</code>。如果只是改变片段标识符，页面将不会重新刷新、父窗口可以把信息，写入子窗口的片段标识符。</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>src</span><span> </span></span><span>=</span><span><span> </span><span>originURL</span></span><span>+</span><span>'#'</span><span>+</span><span><span>data</span><span>;</span></span></div></div><div><div><div>2</div></div><div><span><span>document</span><span>.</span></span><span>getElementById</span><span>(</span><span>'iframe'</span><span>).</span><span>src</span><span> </span><span>=</span><span><span> </span><span>src</span><span>;</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>子窗口通过监听hashchange事件得到通知</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>window</span><span>.</span></span><span>onhashchange</span><span> </span><span>=</span><span><span> </span><span>checkMessage</span><span>;</span></span></div></div><div><div><div>2</div></div><div><span>  </span><span>function</span><span> </span><span>checkMessage</span><span>(){</span></div></div><div><div><div>3</div></div><div><span>  </span><span>var</span><span><span> </span><span>message</span><span> </span></span><span>=</span><span><span> </span><span>window</span><span>.</span></span><span>location</span><span>.</span><span>hash</span><span>;</span></div></div><div><div><div>4</div></div><div><span>  </span><span>//...</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>同样的，子窗口也可以改变父窗口的片段标识符。</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>parent</span><span>.</span></span><span>location</span><span>.</span><span>href</span><span> </span><span>=</span><span><span> </span><span>target</span></span><span>+</span><span>"#"</span><span>+</span><span><span>hash</span><span>;</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2) <code>window.name</code><a href="#2-windowname"><span>#</span></a></h3><ul>
<li>浏览器窗口有<code>window.name</code>属性。这个属性的最大特点是，无论是否同源，只要在同一个窗口里，前一个网页设置这个属性，后一个网页就可以读取它。</li>
<li>父窗口先发开一个子窗口，载入一个不同源的网页，该网页将信息写入<code>window.name</code>属性。</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>window</span><span>.</span></span><span>name</span><span> </span><span>=</span><span><span> </span><span>data</span><span>;</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>接着，子窗口跳回一个与主窗口同域的网址。</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>location</span><span> </span></span><span>=</span><span> </span><span>'http://parent.url.com/xxx.html'</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>然后，主窗口就可以读取子窗口的window.name了。</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>data</span><span> </span></span><span>=</span><span><span> </span><span>document</span><span>.</span></span><span>getElementById</span><span>(</span><span>'iframe'</span><span>).</span><span>contentWindow</span><span>.</span><span>name</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h4>优点<a href="#优点"><span>#</span></a></h4><p><code>window.name</code>容量很大，可以防止非常长的字符串；</p></section><section><h4>缺点<a href="#缺点"><span>#</span></a></h4><p>必须监听子窗口<code>window.name</code>属性的变化，会影响网页性能。</p></section></section><section><h3>3) 跨文档消息传输<code>window.postMessage</code><a href="#3-跨文档消息传输windowpostmessage"><span>#</span></a></h3><ul>
<li>上面两种方法都属于破解，<code>HTML5</code>为解决这个问题，引入一个全新的<code>API</code>：跨文档消息传输<code>Cross Document Messaging</code>。</li>
<li>下一代浏览器都将支持这个功能:<code>Chrome 2.0+</code>、<code>Internet Explorer 8.0+</code>, <code>Firefox 3.0+</code>, <code>Opera 9.6+</code>, 和 <code>Safari 4.0+</code> 。</li>
<li><code>Facebook</code>已经使用了这个功能，用<code>postMessage</code>支持基于<code>web</code>的实时消息传递。</li>
</ul><section><h4>使用方法<a href="#使用方法"><span>#</span></a></h4><ul>
<li><code>otherWindow.postMessage(message, targetOrigin);</code>
<ul>
<li><code>otherWindow</code>: 对接收信息页面的<code>window</code>的引用。可以是页面中<code>iframe</code>的<code>contentWindow</code>属性;<code>window.open</code>的返回值；
通过<code>name</code>或下标从<code>window.frames</code>取到的值。</li>
<li><code>message</code>: 具体的信息内容，<code>string</code>类型。</li>
<li><code>targetOrigin</code>: 接受消息的窗口的源(<code>origin</code>)，即“协议+域名+端口”。也可以设为“*”，表示不限制域名，向所有窗口发送。
<ul>
<li><code>message</code>事件的事件对象event，提供一下三个属性:
<ul>
<li>(1)<code>.event.source</code>&lt;发送消息的窗口&gt;</li>
<li>(2)<code>.event.origin</code>&lt;消息发向的网站&gt;</li>
<li>(3)<code>.event.data</code>&lt;消息内容&gt;</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul></section><section><h4>具体实例<a href="#具体实例"><span>#</span></a></h4><p><code>a.com/index.html</code>中的代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>iframe</span><span> </span><span>id</span><span>=</span><span>"ifr"</span><span> </span><span>src</span><span>=</span><span>"b.com/index.html"</span><span>&gt;&lt;/</span><span>iframe</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>script</span><span> </span><span>type</span><span>=</span><span>"text/javascript"</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>window</span><span>.</span></span><span>onload</span><span> </span><span>=</span><span> </span><span>function</span><span>() {</span></div></div><div><div><div>4</div></div><div><span>    </span><span>var</span><span><span> </span><span>ifr</span><span> </span></span><span>=</span><span><span> </span><span>document</span><span>.</span></span><span>getElementById</span><span>(</span><span>'ifr'</span><span>);</span></div></div><div><div><div>5</div></div><div><span>    </span><span>var</span><span><span> </span><span>targetOrigin</span><span> </span></span><span>=</span><span> </span><span>'http://b.com'</span><span>;  </span><span>// 若写成'http://b.com/c/proxy.html'效果一样</span></div></div><div><div><div>6</div></div><div><span>                                        </span><span>// 若写成'http://c.com'就不会执行postMessage了</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>ifr</span><span>.</span><span>contentWindow</span><span>.</span><span>postMessage</span><span>(</span><span>'I was there!'</span><span><span>, </span><span>targetOrigin</span><span>);</span></span></div></div><div><div><div>8</div></div><div><span>};</span></div></div><div><div><div>9</div></div><div><span>&lt;/</span><span>script</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><code>b.com/index.html</code>中的代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>script</span><span> </span><span>type</span><span>=</span><span>"text/javascript"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>window</span><span>.</span><span>addEventListener</span><span>(</span><span>'message'</span><span>, </span><span>function</span><span><span>(</span><span>event</span><span>){</span></span></div></div><div><div><div>3</div></div><div><span>        </span><span>// 通过origin属性判断消息来源地址</span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span><span> (</span><span>event</span><span>.</span></span><span>origin</span><span> </span><span>==</span><span> </span><span>'http://a.com'</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>            </span><span>alert</span><span><span>(</span><span>event</span><span>.</span></span><span>data</span><span>);    </span><span>// 弹出"I was there!"</span></div></div><div><div><div>6</div></div><div><span>            </span><span>alert</span><span><span>(</span><span>event</span><span>.</span></span><span>source</span><span>);  </span><span>// 对a.com、index.html中window对象的引用</span></div></div><div><div><div>7</div></div><div><span>                                  </span><span>// 但由于同源策略，这里event.source不可以访问window对象</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>}, </span><span>false</span><span>);</span></div></div><div><div><div>10</div></div><div><span>&lt;/</span><span>script</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section></section>
<section><h2>如何解决跨域<code>LocalStorage</code><a href="#如何解决跨域localstorage"><span>#</span></a></h2><ul>
<li>通过<code>window.postMessage</code>,读写其他窗口的<code>LocalStorage</code>也成为了可能。下面是一个例子，主窗口写入<code>iframe</code>子窗口的<code>LocalStorage</code>。</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>window</span><span>.</span></span><span>onmessage</span><span> </span><span>=</span><span> </span><span>function</span><span><span>(</span><span>e</span><span>){</span></span></div></div><div><div><div>2</div></div><div><span>  </span><span>if</span><span><span>(</span><span>e</span><span>.</span></span><span>origin</span><span> </span><span>!==</span><span> </span><span>'http://bbb.com'</span><span>){</span></div></div><div><div><div>3</div></div><div><span>    </span><span>return</span><span> ;</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>}</span></div></div><div><div><div>5</div></div><div><span>  </span><span>var</span><span><span> </span><span>payload</span><span> </span></span><span>=</span><span> </span><span>JSON</span><span>.</span><span>parse</span><span><span>(</span><span>e</span><span>.</span></span><span>data</span><span>);</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>localStorage</span><span>.</span><span>setItem</span><span><span>(</span><span>payload</span><span>.</span></span><span>key</span><span>,</span><span>JSON</span><span>.</span><span>stringify</span><span><span>(</span><span>payload</span><span>.</span></span><span>data</span><span>));</span></div></div><div><div><div>7</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>上面代码中，子窗口将父窗口发送来的消息，写入自己的<code>LocalStorage</code>。</li>
<li>父窗口发送消息的代码如下.</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>win</span><span> </span></span><span>=</span><span><span> </span><span>document</span><span>.</span></span><span>getElementsByTagName</span><span>(</span><span>'iframe'</span><span>)[</span><span>0</span><span>].</span><span>contentWindow</span><span>;</span></div></div><div><div><div>2</div></div><div><span>var</span><span><span> </span><span>obj</span><span> </span></span><span>=</span><span> {</span><span>name</span><span>:</span><span>'Jack'</span><span>};</span></div></div><div><div><div>3</div></div><div><span><span>win</span><span>.</span></span><span>postMessage</span><span>(</span><span>JSON</span><span>.</span><span>stringify</span><span>({</span><span>key</span><span>:</span><span>'storage'</span><span>,</span><span>data</span><span>:</span><span><span>obj</span><span>}),</span></span><span>'http://bbb.com'</span><span>);</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>加强版的子窗口接受消息的代码如下。</strong></p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>window</span><span>.</span></span><span>onmessage</span><span> </span><span>=</span><span> </span><span>function</span><span><span>(</span><span>e</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span>  </span><span>if</span><span><span> (</span><span>e</span><span>.</span></span><span>origin</span><span> </span><span>!==</span><span> </span><span>'http://bbb.com'</span><span>) </span><span>return</span><span>;</span></div></div><div><div><div>3</div></div><div><span>  </span><span>var</span><span><span> </span><span>payload</span><span> </span></span><span>=</span><span> </span><span>JSON</span><span>.</span><span>parse</span><span><span>(</span><span>e</span><span>.</span></span><span>data</span><span>);</span></div></div><div><div><div>4</div></div><div><span>  </span><span>switch</span><span><span> (</span><span>payload</span><span>.</span></span><span>method</span><span>) {</span></div></div><div><div><div>5</div></div><div><span>    </span><span>case</span><span> </span><span>'set'</span><span>:</span></div></div><div><div><div>6</div></div><div><span><span>      </span></span><span>localStorage</span><span>.</span><span>setItem</span><span><span>(</span><span>payload</span><span>.</span></span><span>key</span><span>, </span><span>JSON</span><span>.</span><span>stringify</span><span><span>(</span><span>payload</span><span>.</span></span><span>data</span><span>));</span></div></div><div><div><div>7</div></div><div><span>      </span><span>break</span><span>;</span></div></div><div><div><div>8</div></div><div><span>    </span><span>case</span><span> </span><span>'get'</span><span>:</span></div></div><div><div><div>9</div></div><div><span>      </span><span>var</span><span><span> </span><span>parent</span><span> </span></span><span>=</span><span><span> </span><span>window</span><span>.</span></span><span>parent</span><span>;</span></div></div><div><div><div>10</div></div><div><span>      </span><span>var</span><span><span> </span><span>data</span><span> </span></span><span>=</span><span><span> </span><span>localStorage</span><span>.</span></span><span>getItem</span><span><span>(</span><span>payload</span><span>.</span></span><span>key</span><span>);</span></div></div><div><div><div>11</div></div><div><span><span>      </span></span><span>parent</span><span>.</span><span>postMessage</span><span><span>(</span><span>data</span><span>, </span></span><span>'http://aaa.com'</span><span>);</span></div></div><div><div><div>12</div></div><div><span>      </span><span>break</span><span>;</span></div></div><div><div><div>13</div></div><div><span>    </span><span>case</span><span> </span><span>'remove'</span><span>:</span></div></div><div><div><div>14</div></div><div><span><span>      </span></span><span>localStorage</span><span>.</span><span>removeItem</span><span><span>(</span><span>payload</span><span>.</span></span><span>key</span><span>);</span></div></div><div><div><div>15</div></div><div><span>      </span><span>break</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p><strong>加强版的父窗口发送消息代码如下:</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>win</span><span> </span></span><span>=</span><span><span> </span><span>document</span><span>.</span></span><span>getElementsByTagName</span><span>(</span><span>'iframe'</span><span>)[</span><span>0</span><span>].</span><span>contentWindow</span><span>;</span></div></div><div><div><div>2</div></div><div><span>var</span><span><span> </span><span>obj</span><span> </span></span><span>=</span><span> { </span><span>name</span><span>:</span><span> </span><span>'Jack'</span><span> };</span></div></div><div><div><div>3</div></div><div><span>// 存入对象</span></div></div><div><div><div>4</div></div><div><span><span>win</span><span>.</span></span><span>postMessage</span><span>(</span><span>JSON</span><span>.</span><span>stringify</span><span>({</span><span>key</span><span>:</span><span> </span><span>'storage'</span><span>, </span><span>method</span><span>:</span><span> </span><span>'set'</span><span>, </span><span>data</span><span>:</span><span><span> </span><span>obj</span><span>}), </span></span><span>'http://bbb.com'</span><span>);</span></div></div><div><div><div>5</div></div><div><span>// 读取对象</span></div></div><div><div><div>6</div></div><div><span><span>win</span><span>.</span></span><span>postMessage</span><span>(</span><span>JSON</span><span>.</span><span>stringify</span><span>({</span><span>key</span><span>:</span><span> </span><span>'storage'</span><span>, </span><span>method</span><span>:</span><span> </span><span>"get"</span><span>}), </span><span>"*"</span><span>);</span></div></div><div><div><div>7</div></div><div><span><span>window</span><span>.</span></span><span>onmessage</span><span> </span><span>=</span><span> </span><span>function</span><span><span>(</span><span>e</span><span>) {</span></span></div></div><div><div><div>8</div></div><div><span>  </span><span>if</span><span><span> (</span><span>e</span><span>.</span></span><span>origin</span><span> </span><span>!=</span><span> </span><span>'http://aaa.com'</span><span>) </span><span>return</span><span>;</span></div></div><div><div><div>9</div></div><div><span>  </span><span>// "Jack"</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>JSON</span><span>.</span><span>parse</span><span><span>(</span><span>e</span><span>.</span></span><span>data</span><span>).</span><span>name</span><span>);</span></div></div><div><div><div>11</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>如何解决<code>AJAX</code>的跨域<a href="#如何解决ajax的跨域"><span>#</span></a></h2><ul>
<li>同源政策规定，<code>AJAX</code>请求只能发给同源的网址，否则就报错。</li>
<li>除了架设服务器代理（浏览器请求同源服务器，再由后者请求外部服务），有三种方法规避这个限制。
<ul>
<li>(1)<code>JSONP</code></li>
<li>(2)<code>WebSocket</code></li>
<li>(3)<code>CORS</code></li>
</ul>
</li>
</ul><section><h3>1) JSONP解决AJAX跨域问题<a href="#1-jsonp解决ajax跨域问题"><span>#</span></a></h3><ul>
<li>JSONP是服务器与客户端跨源通信的常用方法。最大特点就是简单适用，老式浏览器全部支持，服务器改造非常小。</li>
<li>它的基本思想是，网页通过添加一个<code>&lt;script&gt;</code>元素，向服务器请求<code>JSON</code>数据，这种做法不受同源政策限制；服务器收到请求后，将数据放在一个指定名字的回调函数里传回来。</li>
<li>首先，网页动态插入<code>&lt;script&gt;</code>元素，由它向跨源网址发出请求。</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>addScriptTag</span><span><span>(</span><span>src</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span>  </span><span>var</span><span><span> </span><span>script</span><span> </span></span><span>=</span><span><span> </span><span>document</span><span>.</span></span><span>createElement</span><span>(</span><span>'script'</span><span>);</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>script</span><span>.</span><span>setAttribute</span><span>(</span><span>"type"</span><span>,</span><span>"text/javascript"</span><span>);</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>script</span><span>.</span><span>src</span><span> </span><span>=</span><span><span> </span><span>src</span><span>;</span></span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>document</span><span>.</span><span>body</span><span>.</span><span>appendChild</span><span><span>(</span><span>script</span><span>);</span></span></div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span><span>window</span><span>.</span></span><span>onload</span><span> </span><span>=</span><span> </span><span>function</span><span> () {</span></div></div><div><div><div>9</div></div><div><span>  </span><span>addScriptTag</span><span>(</span><span>'http://example.com/ip?callback=foo'</span><span>);</span></div></div><div><div><div>10</div></div><div><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>function</span><span> </span><span>foo</span><span><span>(</span><span>data</span><span>) {</span></span></div></div><div><div><div>13</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>'Your public IP address is: '</span><span> </span><span>+</span><span><span> </span><span>data</span><span>.</span></span><span>ip</span><span>);</span></div></div><div><div><div>14</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>上面代码通过动态添加<code>&lt;script&gt;</code>元素，向服务器<code>example.com</code>发出请求。注意，该请求的查询字符串有一个<code>callback</code>参数，用来指定回调函数的名字，这对于<code>JSONP</code>是必需的。</li>
<li>服务器收到这个请求以后，会将数据放在回调函数的参数位置返回。</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>foo</span><span>({</span></div></div><div><div><div>2</div></div><div><span>  </span><span>"ip"</span><span>:</span><span> </span><span>"8.8.8.8"</span></div></div><div><div><div>3</div></div><div><span>});</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>由于<code>&lt;script&gt;</code>元素请求的脚本，直接作为代码运行。这时，只要浏览器定义了<code>foo</code>函数，该函数就会立即调用。作为参数的JSON数据被视为<code>JavaScript</code>对象，而不是字符串，因此避免了使用<code>JSON.parse</code>的步骤。</li>
</ul></section><section><h3>2) 通过<code>webSocket</code>解决<code>AJAX</code>跨域<a href="#2-通过websocket解决ajax跨域"><span>#</span></a></h3><ul>
<li><code>WebSocket</code>是一种通信协议，使用<code>ws://</code>（非加密）和<code>wss://</code>（加密）作为协议前缀。该协议不实行同源政策，只要服务器支持，就可以通过它进行跨源通信。</li>
<li>下面是一个例子，浏览器发出的<code>WebSocket</code>请求的头信息（摘自维基百科）。</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>GET</span><span> </span><span>/</span><span><span>chat</span><span> </span></span><span>HTTP</span><span>/</span><span>1.1</span></div></div><div><div><div>2</div></div><div><span><span>Host</span><span>: </span><span>server</span><span>.</span></span><span>example</span><span>.</span><span>com</span></div></div><div><div><div>3</div></div><div><span><span>Upgrade</span><span>: </span><span>websocket</span></span></div></div><div><div><div>4</div></div><div><span><span>Connection</span><span>: </span><span>Upgrade</span></span></div></div><div><div><div>5</div></div><div><span>Sec</span><span>-</span><span>WebSocket</span><span>-</span><span><span>Key</span><span>: </span><span>x3JJHMbDL1EzLkh9GBhXDw</span></span><span>==</span></div></div><div><div><div>6</div></div><div><span>Sec</span><span>-</span><span>WebSocket</span><span>-</span><span><span>Protocol</span><span>: </span><span>chat</span><span>, </span><span>superchat</span></span></div></div><div><div><div>7</div></div><div><span>Sec</span><span>-</span><span>WebSocket</span><span>-</span><span><span>Version</span><span>: </span></span><span>13</span></div></div><div><div><div>8</div></div><div><span><span>Origin</span><span>: </span><span>http</span><span>:</span></span><span>//example.com</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>上面代码中，有一个字段是<code>Origin</code>，表示该请求的请求源（origin），即发自哪个域名。
正是因为有了<code>Origin</code>这个字段，所以<code>WebSocket</code>才没有实行同源政策。因为服务器可以根据这个字段，判断是否许可本次通信。如果该域名在白名单内，服务器就会做出如下回应。</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>HTTP</span><span>/</span><span>1.1</span><span> </span><span>101</span><span><span> </span><span>Switching</span><span> </span><span>Protocols</span></span></div></div><div><div><div>2</div></div><div><span><span>Upgrade</span><span>: </span><span>websocket</span></span></div></div><div><div><div>3</div></div><div><span><span>Connection</span><span>: </span><span>Upgrade</span></span></div></div><div><div><div>4</div></div><div><span>Sec</span><span>-</span><span>WebSocket</span><span>-</span><span><span>Accept</span><span>: </span><span>HSmrc0sMlYUkAGmm5OPpG2HaGWk</span></span><span>=</span></div></div><div><div><div>5</div></div><div><span>Sec</span><span>-</span><span>WebSocket</span><span>-</span><span><span>Protocol</span><span>: </span><span>chat</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>3) 通过<code>CORS</code>解决<code>AJAX</code>跨域<a href="#3-通过cors解决ajax跨域"><span>#</span></a></h3><p><code>CORS</code>是跨源资源分享（<code>Cross-Origin Resource Sharing</code>）的缩写。它是<code>W3C</code>标准，是跨源<code>AJAX</code>请求的根本解决方法。相比<code>JSONP</code>只能发<code>GET</code>请求，<code>CORS</code>允许任何类型的请求。</p><section><h4>3.1 定义<a href="#31-定义"><span>#</span></a></h4><ul>
<li>CORS其实出现时间不短了，它在维基百科上的定义是：跨域资源共享（<code>CORS</code>）是一种网络浏览器的技术规范，它为<code>Web</code>服务器定义了一种方式，允许网页从不同的域访问其资源。而这种访问是被同源策略所禁止的。<code>CORS</code>系统定义了一种浏览器和服务器交互的方式来确定是否允许跨域请求。 它是一个妥协，有更大的灵活性，但比起简单地允许所有这些的要求来说更加安全。而<code>W3C</code>的官方文档目前还是工作草案，但是正在朝着<code>W3C</code>推荐的方向前进。</li>
<li>简言之，<code>CORS</code>就是为了让<code>AJAX</code>可以实现可控的跨域访问而生的。</li>
</ul></section><section><h4>以往的解决方案<a href="#以往的解决方案"><span>#</span></a></h4><ul>
<li>以前要实现跨域访问，可以通过<code>JSONP</code>、<code>Flash</code>或者服务器中转的方式来实现，但是现在我们有了<code>CORS</code>。</li>
<li><code>CORS</code>与<code>JSONP</code>相比，无疑更为先进、方便和可靠。
<ul>
<li>1.<code>JSONP</code>只能实现<code>GET</code>请求，而<code>CORS</code>支持所有类型的<code>HTTP</code>请求。</li>
<li>2.使用<code>CORS</code>，开发者可以使用普通的<code>XMLHttpRequest</code>发起请求和获得数据，比起<code>JSONP</code>有更好的错误处理。</li>
<li>3.<code>JSONP</code>主要被老的浏览器支持，它们往往不支持<code>CORS</code>，而绝大多数现代浏览器都已经支持了<code>CORS</code>（这部分会在后文浏览器支持部分介绍）。</li>
</ul>
</li>
</ul></section><section><h4>详细内容<a href="#详细内容"><span>#</span></a></h4><ul>
<li>
<p>要使用<code>CORS</code>，我们需要了解前端和服务器端的使用方法。</p>
</li>
<li>
<p>1.前端</p>
<p>以前我们使用Ajax，代码类似于如下的方式：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>xhr</span><span> </span></span><span>=</span><span> </span><span>new</span><span> </span><span>XMLHttpRequest</span><span>();</span></div></div><div><div><div>2</div></div><div><span><span>xhr</span><span>.</span></span><span>open</span><span>(</span><span>"GET"</span><span>, </span><span>"/relativeHref"</span><span>, </span><span>true</span><span>);</span></div></div><div><div><div>3</div></div><div><span><span>xhr</span><span>.</span></span><span>send</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<p>这里的“/relativeHref”是本域的相对路径。</p>
</li>
<li>
<p>如果我们要使用<code>CORS</code>，相关<code>Ajax</code>代码可能如下所示：</p>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>xhr</span><span> </span></span><span>=</span><span> </span><span>new</span><span> </span><span>XMLHttpRequest</span><span>();</span></div></div><div><div><div>2</div></div><div><span><span>xhr</span><span>.</span></span><span>open</span><span>(</span><span>"GET"</span><span>, </span><span>"http://blog.csdn.net/hfahe"</span><span>, </span><span>true</span><span>);</span></div></div><div><div><div>3</div></div><div><span><span>xhr</span><span>.</span></span><span>send</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>请注意，代码与之前的区别就在于相对路径换成了其他域的绝对路径，也就是你要跨域访问的接口地址。</li>
<li>我们还必须提供浏览器回退功能检测和支持，避免浏览器不支持的情况。</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>createCORSRequest</span><span><span>(</span><span>method</span><span>, </span><span>url</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span>  </span><span>var</span><span><span> </span><span>xhr</span><span> </span></span><span>=</span><span> </span><span>new</span><span> </span><span>XMLHttpRequest</span><span>();</span></div></div><div><div><div>3</div></div><div><span>  </span><span>if</span><span> (</span><span>"withCredentials"</span><span> </span><span>in</span><span><span> </span><span>xhr</span><span>) {</span></span></div></div><div><div><div>4</div></div><div><span>    </span><span>// 此时即支持CORS的情况</span></div></div><div><div><div>5</div></div><div><span>    </span><span>// 检查XMLHttpRequest对象是否有“withCredentials”属性</span></div></div><div><div><div>6</div></div><div><span>    </span><span>// “withCredentials”仅存在于XMLHTTPRequest2对象里</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>xhr</span><span>.</span><span>open</span><span><span>(</span><span>method</span><span>, </span><span>url</span><span>, </span></span><span>true</span><span>);</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>} </span><span>else</span><span> </span><span>if</span><span> (</span><span><span>typeof</span><span>!=</span></span><span> </span><span>"undefined"</span><span>) {</span></div></div><div><div><div>9</div></div><div><span>    </span><span>// 否则检查是否支持XDomainRequest，IE8和IE9支持</span></div></div><div><div><div>10</div></div><div><span>    </span><span>// XDomainRequest仅存在于IE中，是IE用于支持CORS请求的方式</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>xhr</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>XDomainRequest</span><span>();</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>xhr</span><span>.</span><span>open</span><span><span>(</span><span>method</span><span>, </span><span>url</span><span>);</span></span></div></div><div><div><div>13</div></div><div><span><span>  </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>14</div></div><div><span>    </span><span>// 否则，浏览器不支持CORS</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>xhr</span><span> </span><span>=</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>  </span><span>return</span><span><span> </span><span>xhr</span><span>;</span></span></div></div><div><div><div>18</div></div><div><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>var</span><span><span> </span><span>xhr</span><span> </span></span><span>=</span><span> </span><span>createCORSRequest</span><span>(</span><span>'GET'</span><span><span>, </span><span>url</span><span>);</span></span></div></div><div><div><div>21</div></div><div><span>if</span><span> (</span><span>!</span><span><span>xhr</span><span>) {</span></span></div></div><div><div><div>22</div></div><div><span>  </span><span>throw</span><span> </span><span>new</span><span> </span><span>Error</span><span>(</span><span>'CORS not supported'</span><span>);</span></div></div><div><div><div>23</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><p>原文链接<a href="http://blog.csdn.net/u013084331/article/details/51114288" target="_blank">http://blog.csdn.net/u013084331/article/details/51114288</a></p></blockquote></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/MongoDB%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E5%90%AF%E5%8A%A8%E4%B8%8E%E8%BF%9E%E6%8E%A5/</id>
      <title type="text">MongoDB启动与连接</title>
      <published>2017-10-06T00:00:00.000Z</published>
      <updated>2017-10-06T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/MongoDB%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E5%90%AF%E5%8A%A8%E4%B8%8E%E8%BF%9E%E6%8E%A5/"/>
      <summary type="text">MongoDB数据库的启动与连接</summary>
      <content type="html"><![CDATA[<section><h2>什么是<code>MongoDB</code><a href="#什么是mongodb"><span>#</span></a></h2><ul>
<li><code>MongoDB</code>是一个基于分布式文件存储的开源数据库系统</li>
<li><code>MongoDB</code> 将数据存储为一个文档，数据结构由键值(<code>key</code>=&gt;<code>value</code>)对组成。<code>MongoDB</code> 文档类似于 <code>JSON</code> 对象。字段值可以包含其他文档，数组及文档数组。</li>
</ul></section>
<section><h2><code>MongoDB</code>安装<a href="#mongodb安装"><span>#</span></a></h2><section><h3><code>windows</code>安装<a href="#windows安装"><span>#</span></a></h3><blockquote><p><code>Windows</code>官方安装指南 绿色版就是解压之后就可以用</p></blockquote><ul>
<li>mongodb32位绿色版 <a href="http://pan.baidu.com/s/1pLe3vM7" target="_blank">http://pan.baidu.com/s/1pLe3vM7</a></li>
<li>MongoDB64位绿色版 <a href="http://pan.baidu.com/s/1cMM9oq" target="_blank">http://pan.baidu.com/s/1cMM9oq</a></li>
<li>mongo客户端绿色版 <a href="http://pan.baidu.com/s/1kUIQlUZ" target="_blank">http://pan.baidu.com/s/1kUIQlUZ</a></li>
</ul></section><section><h3><code>Mac</code>官方安装指南<a href="#mac官方安装指南"><span>#</span></a></h3><ul>
<li>
<p>1.先安装<code>homebrew</code></p>
<ul>
<li>
<p><code>Homebrew</code>简称<code>brew</code>，是<code>Mac OSX</code>上的软件包管理工具，能在<code>Mac</code>中方便的安装软件或者卸载软件<a href="http://brew.sh/" target="_blank">http://brew.sh/</a></p>
</li>
<li>
<p><code>Homebrew</code>的安装非常简单，打开终端复制、粘贴以下命令，回车，搞定</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/</span><span>usr</span><span>/</span><span>bin</span><span>/</span><span><span>ruby</span><span> </span></span><span>-</span><span><span>e</span><span> </span></span><span>"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
<li>
<p>2.使用<code>brew</code>安装<code>mongodb</code></p>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>brew</span><span> </span><span>install</span><span> </span><span>mongodb</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>3.创建数据存放目录</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>sudo</span><span> </span><span>mkdir</span><span> </span></span><span>-</span><span><span>p</span><span> </span></span><span>/</span><span>data</span><span>/</span><span>db</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p>如果提示输入密码请输入正确的密码</p></blockquote><ul>
<li>4.启动<code>mongodb</code></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>sudo</span><span> </span><span>mongod</span><span> </span></span><span>&amp;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h4><code>Mac</code>可视化工具可安装<code>Robomongo</code><a href="#mac可视化工具可安装robomongo"><span>#</span></a></h4></section></section></section>
<section><h2>mongodb启动与连接<a href="#mongodb启动与连接"><span>#</span></a></h2><section><h3>1.windows启动服务器端<a href="#1windows启动服务器端"><span>#</span></a></h3><ul>
<li>
<ol>
<li>找到<code>mongodb</code>安装目录,一般是 <code>C:\Program Files\MongoDB 2.6 Standard\bin</code> (这里我下载到了<code>C:\Users\Gao\Downloads\数据库\MongoDB</code>这个目录)
<figure><img alt="Alt MongoDB安装目录" loading="lazy" width="1761" height="1212" src="/_astro/MongoDB%E5%AE%89%E8%A3%85%E7%9B%AE%E5%BD%95.ByMt4d8O_I5UQw.webp" /><figcaption>Alt MongoDB安装目录</figcaption></figure></li>
</ol>
</li>
<li>
<ol>
<li>按下Shift+鼠标右键,选择在此处打开命令窗口</li>
</ol>
</li>
<li>
<ol>
<li>在除C盘外的盘符新建一个空目录,例如 D:\Mongodb\data(由于我的电脑没有分盘,所以我就建在C盘下了)
<figure><img alt="Alt 新建data文件夹" loading="lazy" width="1180" height="270" src="/_astro/%E6%96%B0%E5%BB%BAdata%E6%96%87%E4%BB%B6%E5%A4%B9.BUq8YwbB_Zl8X1g.webp" /><figcaption>Alt 新建data文件夹</figcaption></figure></li>
</ol>
<ul>
<li>在命令行中输入mongod —dbpath=刚创建的空目录,如</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>mongod</span><span> </span></span><span>--</span><span>dbpath</span><span>=</span><span><span>C</span><span>:\</span><span>data</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<ol>
<li>注意：—dbpath后的值表示数据库文件的存储路径,而且后面的路径必须事先创建好，必须已经存在，否则服务开启失败</li>
</ol>
</li>
</ul>
<blockquote><p>如果是windows32的系统用户，请加参数 —storageEngine=mmapv1</p></blockquote>
<blockquote><p>如 <code>mongod --dbpath=C:\data --storageEngine=mmapv1</code></p></blockquote>
</li>
<li>
<ol>
<li>再按回车键
<figure><img alt="Alt 启动MongoDB服务器端" loading="lazy" width="2318" height="1092" src="/_astro/%E5%90%AF%E5%8A%A8MongoDB%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AF.kUVR9ubp_L9JjJ.webp" /><figcaption>Alt 启动MongoDB服务器端</figcaption></figure></li>
</ol>
<ul>
<li>
<ol>
<li>如果出现<code>waiting for connections on port 27017</code>就表示启动成功,已经在<code>27017</code>端口上监听了客户端的请求</li>
</ol>
</li>
<li>
<ol>
<li>注意：这个命令窗体绝对不能关,关闭这个窗口就相当于停止了<code>mongodb</code>服务</li>
</ol>
</li>
<li>
<ol>
<li><strong>如果<code>mongoVUE</code>客户端报错 <code>“MongoDB.Bson.BsonObjectId”</code>的类型初始值设定项引发异常</strong></li>
</ol>
<blockquote><p>解决方案如下：在<code>window</code>中打开功能里输入<code>regedit</code>,回车打开注册器。然后进入如下路径中 <code>HKEY_LOCAL_MACHINE\system\CurrentControlSet\Control\Lsa\FipsAlgorithmPolicy</code> 将<code>enable</code>设置为<code>0</code>即可。</p></blockquote>
</li>
</ul>
</li>
</ul></section><section><h3>2.启动客户端连接服务器<a href="#2启动客户端连接服务器"><span>#</span></a></h3><ul>
<li>
<ol>
<li>找到<code>mongodb</code>安装目录,一般是 <code>C:\Program Files\MongoDB 2.6 Standard\bin</code></li>
</ol>
</li>
<li>
<ol>
<li>按下<code>Shift+鼠标右键</code>,选择在此处打开命令窗口
<figure><img alt="Alt MongoDB安装目录" loading="lazy" width="1761" height="1212" src="/_astro/MongoDB%E5%AE%89%E8%A3%85%E7%9B%AE%E5%BD%95.ByMt4d8O_I5UQw.webp" /><figcaption>Alt MongoDB安装目录</figcaption></figure></li>
</ol>
</li>
<li>
<ol>
<li>命令窗体中输入 <code>mongo --host=127.0.0.1</code> 或者 <code>mongo</code> 按回车键</li>
</ol>
</li>
<li>
<ol>
<li>命令窗体中输入 <code>db</code> 按回车键可进入测试
<figure><img alt="Alt MongoDB启动客户端连接服务器" loading="lazy" width="1320" height="512" src="/_astro/MongoDB%E5%90%AF%E5%8A%A8%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%BF%9E%E6%8E%A5%E6%9C%8D%E5%8A%A1%E5%99%A8.W6RYNoa1_1AVLfu.webp" /><figcaption>Alt MongoDB启动客户端连接服务器</figcaption></figure></li>
</ol>
</li>
</ul><blockquote><p>备注：<code>--host</code>后的值表示服务器的<code>ip</code>地址,<code>--host=127.0.0.1</code> 表示的就是本地服务器,每次数据库都会默认连接<code>test</code>数据库</p></blockquote></section></section>
<section><h2><code>MongoDB</code>基本概念<a href="#mongodb基本概念"><span>#</span></a></h2><ul>
<li>数据库 <code>MongoDB</code>的单个实例可以容纳多个独立的数据库，比如一个学生管理系统就可以对应一个数据库实例</li>
<li>集合 数据库是由集合组成的,一个集合用来表示一个实体,如学生集合</li>
<li>文档 集合是由文档组成的，一个文档表示一条记录,比如一位同学张三就是一个文档
<figure><img alt="Alt MongoDB基本概念" loading="lazy" width="1979" height="699" src="/_astro/MongoDB%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5.DQrGwtIA_ZQXKXp.webp" /><figcaption>Alt MongoDB基本概念</figcaption></figure></li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/JS%E5%AF%B9%E9%97%AD%E5%8C%85%E7%9A%84%E7%90%86%E8%A7%A3/</id>
      <title type="text">JS对闭包的理解</title>
      <published>2017-09-10T00:00:00.000Z</published>
      <updated>2017-09-10T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/JS%E5%AF%B9%E9%97%AD%E5%8C%85%E7%9A%84%E7%90%86%E8%A7%A3/"/>
      <summary type="text">JS对闭包的理解</summary>
      <content type="html"><![CDATA[<ul>
<li>当函数执行的时候，会形成一个私有的作用域，保护里面的私有变量不受外界干扰，我们把这种机制叫做“闭包”</li>
</ul>

<section><h2>闭包<a href="#闭包"><span>#</span></a></h2><p>闭包是一种”机制”&lt;函数执行形成私有的作用域&gt;(不管销毁还是不销毁),保护了里面的私有变量不受外界的干扰.</p><p>然而,社会上很多人都认为”闭包”指的是&lt;函数执行形成的那个不销毁的私有作用域才是闭包&gt;.</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>fn</span><span> </span></span><span>=</span><span> (</span><span>function</span><span> () {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>var</span><span><span> </span><span>num</span><span> </span></span><span>=</span><span> </span><span>12</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>return</span><span> </span><span>function</span><span> () {</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>++</span><span><span>num</span><span>);</span></span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>})();</span><span>//-&gt;JS高阶编程技巧之一："惰性思想"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>1、利用可以形成不销毁的私有的作用域的原理，把我们需要保存的内容，存储到这个不销毁的作用域中</p><p>2、避免全局变量之间的冲突，保护里面的变量不受外界的干扰 -&gt;所有框架/类库的源码都是写在一个闭包函数中的,目的就是为了不和别人的代码冲突</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>name</span><span> </span></span><span>=</span><span> </span><span>"china"</span><span>;</span></div></div><div><div><div>2</div></div><div><span>var</span><span><span> </span><span>age</span><span> </span></span><span>=</span><span> </span><span>5000</span><span>;</span></div></div><div><div><div>3</div></div><div><span>(</span><span>function</span><span> () {</span></div></div><div><div><div>4</div></div><div><span>    </span><span>var</span><span><span> </span><span>name</span><span> </span></span><span>=</span><span> </span><span>"中国"</span><span>;</span></div></div><div><div><div>5</div></div><div><span>    </span><span>var</span><span><span> </span><span>age</span><span> </span></span><span>=</span><span> </span><span>100</span><span>;</span></div></div><div><div><div>6</div></div><div><span>})();</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2><code>jQuery</code><a href="#jquery"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>(</span><span>function</span><span><span> (</span><span>global</span><span>, </span><span>factory</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span>    </span><span>//&lt;JS CODE&gt;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>var</span><span> </span><span>jQuery</span><span> </span><span>=</span><span> </span><span>function</span><span> () {</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>};</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>window</span><span>.</span><span>jQuery</span><span> </span><span>=</span><span><span> </span><span>window</span><span>.</span></span><span>$</span><span> </span><span>=</span><span><span> </span><span>jQuery</span><span>;</span></span><span>//-&gt;让私有的变量在全局下依然可以使用,我们可以使用window.xxx=xxx来进行处理</span></div></div><div><div><div>7</div></div><div><span>    </span><span>//-&gt;当前的这个作用域是不销毁的,因为函数里面的jQuery对应的地址被window下的jQuery和$给占用了</span></div></div><div><div><div>8</div></div><div><span>})();</span></div></div><div><div><div>9</div></div><div><span>jQuery</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>使用闭包的注意点<a href="#使用闭包的注意点"><span>#</span></a></h2><p>（1）由于闭包会使得函数中的变量都被保存在内存中，内存消耗很大，所以不能滥用闭包，否则会造成网页的性能问题，在<code>IE</code>中可能导致内存泄露。
解决方法是，在退出函数之前，将不使用的局部变量全部删除。
（2）闭包会在父函数外部，改变父函数内部变量的值。所以，如果你把父函数当作对象（<code>Object</code>）使用，把闭包当作它的公用方法（<code>Public Method</code>），把内部变量当作它的私有属性（<code>private value</code>），这时一定要小心，不要随便改变父函数内部变量的值。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/%E7%A7%92%E6%87%82Vuejs%E3%80%81Angular%E3%80%81React%E5%8E%9F%E7%90%86%E5%92%8C%E5%89%8D%E7%AB%AF%E5%8F%91%E5%B1%95%E5%8E%86%E5%8F%B2(%E8%BD%AC%E8%BD%BD)/</id>
      <title type="text">秒懂Vuejs、Angular、React原理和前端发展历史(转载)</title>
      <published>2017-09-10T00:00:00.000Z</published>
      <updated>2017-09-10T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/%E7%A7%92%E6%87%82Vuejs%E3%80%81Angular%E3%80%81React%E5%8E%9F%E7%90%86%E5%92%8C%E5%89%8D%E7%AB%AF%E5%8F%91%E5%B1%95%E5%8E%86%E5%8F%B2(%E8%BD%AC%E8%BD%BD)/"/>
      <summary type="text">秒懂Vuejs、Angular、React原理和前端发展历史(转载)</summary>
      <content type="html"><![CDATA[<section><h2>前端程序发展的历史<a href="#前端程序发展的历史"><span>#</span></a></h2><p>现在流行的框架：<code>Vue</code>、<code>Angular</code>、<code>React</code>，已经逐渐应用到各个项目和实际应用中，它们都是<code>MVVM</code>数据驱动框架系列的一种。</p><ul>
<li>回顾一下前端发展的历史阶段,引用了 廖雪峰老师网站总结的一段话:</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>在上个世纪的1989年，欧洲核子研究中心的物理学家Tim Berners-Lee发明了超文本标记语言（HyperText Markup Language），简称`HTML`，并在1993年成为互联网草案。从此，互联网开始迅速商业化，诞生了一大批商业网站。</span></div></div><div><div><div>2</div></div><div><span>最早的HTML页面是完全静态的网页，它们是预先编写好的存放在Web服务器上的html文件。</span></div></div><div><div><div>3</div></div><div><span>浏览器请求某个URL时，Web服务器把对应的html文件扔给浏览器，就可以显示html文件的内容了。</span></div></div><div><div><div>4</div></div><div><span>如果要针对不同的用户显示不同的页面，显然不可能给成千上万的用户准备好成千上万的不同的html文件，所以，服务器就需要针对不同的用户，动态生成不同的html文件。一个最直接的想法就是利用C、C++这些编程语言，直接向浏览器输出拼接后的字符串。这种技术被称为CGI：Common Gateway Interface。</span></div></div><div><div><div>5</div></div><div><span>很显然，像新浪首页这样的复杂的HTML是不可能通过拼字符串得到的。于是，人们又发现，其实拼字符串的时候，大多数字符串都是HTML片段，是不变的，变化的只有少数和用户相关的数据，所以，又出现了新的创建动态HTML的方式：ASP、JSP和PHP等——分别由微软、SUN和开源社区开发。</span></div></div><div><div><div>6</div></div><div><span>在以前：</span></div></div><div><div><div>7</div></div><div><span>在ASP中，一个asp文件就是一个HTML，但是，需要替换的变量用特殊的</span><span>&lt;</span><span>%=var%&gt;标记出来了，再配合循环、条件判断，创建动态HTML就比CGI要容易得多。</span></div></div><div><div><div>8</div></div><div><span>但是，一旦浏览器显示了一个HTML页面，要更新页面内容，唯一的方法就是重新向服务器获取一份新的HTML内容。如果浏览器想要自己修改HTML页面的内容，怎么办？那就需要等到1995年年底，Java被引入到浏览器。</span></div></div><div><div><div>9</div></div><div><span>有了Java后，浏览器就可以运行Java，然后，对页面进行一些修改。Java还可以通过修改HTML的DOM结构和CSS来实现一些动画效果，而这些功能没法通过服务器完成，必须在浏览器实现。</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>揭开MVVM原理<a href="#揭开mvvm原理"><span>#</span></a></h2><ul>
<li><code>Java</code>操作<code>HTML</code></li>
<li>至于 <code>JS</code> 如何在浏览器执行，这又是另外一个资深课题了（前端真的是只是庞杂），这里我们不做研究，有兴趣的可以自己去搜资料。我们只需要知道浏览器就是也 <code>JS</code> 执行容器，执行完之后，通过页面显示结果就行了，就像<code>java</code>需要编译器一样原理。</li>
<li>用<code>Java</code>在浏览器中操作<code>HTML</code>，也经历了若干发展阶段： 我们利用【小北最帅】这个案例来展示</li>
</ul></section>
<section><h2>【第一阶段】<a href="#第一阶段"><span>#</span></a></h2><ul>
<li>是JS原生通过浏览器解析机制，它的原理是使用浏览器提供的原生API 结合JS语法，可以直接操作DOM，如：</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>  </span><span>//HTML:</span></div></div><div><div><div>2</div></div><div><span>  </span><span>&lt;</span><span>divid</span><span>=</span><span>"name"</span><span>style</span><span>=</span><span>"color:#fff"</span><span>&gt;</span><span>前端你别闹</span><span>&lt;</span><span>/div&gt;&lt;divid="age"&gt;3&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span>  </span><span>//Java:</span></div></div><div><div><div>4</div></div><div><span>  </span><span>var</span><span><span> </span><span>dom1</span><span> </span></span><span>=</span><span><span> </span><span>document</span><span>.</span></span><span>getElementById</span><span>(</span><span>'name'</span><span>);</span></div></div><div><div><div>5</div></div><div><span>  </span><span>var</span><span><span> </span><span>dom2</span><span> </span></span><span>=</span><span><span> </span><span>document</span><span>.</span></span><span>getElementById</span><span>(</span><span>'age'</span><span>);</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>dom1</span><span>.</span><span>innerHTML</span><span> </span><span>=</span><span> </span><span>'小北'</span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>dom2</span><span>.</span><span>innerHTML</span><span> </span><span>=</span><span> </span><span>'666'</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>dom1</span><span>.</span><span>style</span><span>.</span><span>color</span><span> </span><span>=</span><span> </span><span>'#000000'</span><span>; </span><span>// css样式也可以操作</span></div></div><div><div><div>9</div></div><div><span>  </span><span>//结果变成：</span></div></div><div><div><div>10</div></div><div><span>  </span><span>&lt;</span><span>divid</span><span>=</span><span>"name"</span><span>style</span><span>=</span><span>"color:#fff"</span><span>&gt;</span><span>小北</span><span>&lt;</span><span>/div&gt;&lt;divid="age"&gt;'666&lt;/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>【第二阶段】<a href="#第二阶段"><span>#</span></a></h2><ul>
<li>
<p>我用一个字总结 就是懒，就是我们上一篇说的<code>jQuery</code>时代，由于原生API晦涩难懂，语法很长不好用，最重要的是要考虑各种浏览器兼容性，因为他们的解析标准都不一样，造成了，写一段效果代码要写很多的兼容语法，令人沮丧，所以<code>jQuery</code>的出现，迅速占领了世界。</p>
</li>
<li>
<p>上边的例子用 jQuery 是这样的</p>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>//HTML:</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>divid</span><span>=</span><span>"name"</span><span>style</span><span>=</span><span>"color:#fff"</span><span>&gt;</span><span>前端你别闹</span><span>&lt;</span><span>/div&gt;&lt;divid="age"&gt;3&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span>//Java: jQuery 一句话就行</span></div></div><div><div><div>4</div></div><div><span>$</span><span>(</span><span>'#name'</span><span>).</span><span>text</span><span>(</span><span>'小北好帅'</span><span>).</span><span>css</span><span>(</span><span>'color'</span><span>, </span><span>'#000000'</span><span>);</span><span>$</span><span>(</span><span>'#age'</span><span>).</span><span>text</span><span>(</span><span>'666'</span><span>).</span><span>css</span><span>(</span><span>'color'</span><span>, </span><span>'#fff'</span><span>);</span></div></div><div><div><div>5</div></div><div><span>//结果变成：</span></div></div><div><div><div>6</div></div><div><span>&lt;</span><span>divid</span><span>=</span><span>"name"</span><span>style</span><span>=</span><span>"color:#fff"</span><span>&gt;</span><span>小北好帅</span><span>&lt;</span><span>/div&gt;&lt;divid="age"&gt;666&lt;/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>【第三阶段】<a href="#第三阶段"><span>#</span></a></h2><section><h3>MVC模式<a href="#mvc模式"><span>#</span></a></h3><ul>
<li>需要服务器端配合，Java可以在前端修改服务器渲染后的数据。</li>
<li>一句话就是所有通信都是单向的： 也就是前期我们最常用的状态，提交一次反馈一次，通信一次相互制约。</li>
<li>比如：提交表单 填写内容 → 点击提交 →业务逻辑处理 →存入数据库 → 刷新页面→服务器取数据库数据→渲染到客户端页面→ 展示上一次你提交的内容</li>
<li>MVC:
<ul>
<li>视图（View）：用户界面。</li>
<li>控制器（Controller）：业务逻辑</li>
<li>模型（Model）：数据保存</li>
<li>各部分之间的通信方式如下
<figure><img alt="Alt MVC模式" loading="lazy" width="601" height="365" src="/_astro/MVC.qDeRD29d_1L8xwl.webp" /><figcaption>Alt MVC模式</figcaption></figure>“MVC”</li>
<li>View 传送指令到 Controller</li>
<li>Controller 完成业务逻辑后，要求 Model 改变状态</li>
<li>Model 将新的数据发送到 View，用户得到反馈</li>
</ul>
</li>
<li>这个模式缺点是什么呢？
<ul>
<li>缺点一：它必须等待服务器端的指示，而且如果是异步模式的话，所有html节点、数据、页面结构都是后端请求过来。
<ul>
<li>浏览器只作为一个解析显示容器，Model 作用几乎是废x，Model 层面做的很少几乎前端无法控制，你前端几乎是切图仔和做轮播图的工作/哭</li>
</ul>
</li>
<li>缺点二：因为你前端渲染的页面结构，几乎是后端服务器包扎一堆数据一起发送过来，前端的你只需要用拼接字符串 或者字符串拼接引擎
<ul>
<li>比如Mustache、Jade、artTemplate、tmpl、kissyTemplate、ejs等来做事，说白了纯苦力和重复工作居多，这也导致了，如果很多人认为前端并不重要，只负责美工 和 动作体验就好了。</li>
</ul>
</li>
<li>缺点三：一发而动全身。数据、显示不分离！为什么这么说，因为如果业务逻辑要变，比如很简单的需求，你用jsp或者php 拼接出来的ajax数据页面，年龄这个字段我不需要了，把性别字段 区分开，男的单独显示，女的单独显示，以前是一起显示到一个表的
<ul>
<li>那么，后端先要sql查询把 男、女数据分开，然后渲染字符串时候把 年龄 这个字段去除，然后把男女分开成2个table，然后再推送给前端接收。</li>
<li>前端收到了，然后从新在渲染一遍，在加工一次页面甚至是展示动作效果。</li>
</ul>
</li>
</ul>
</li>
</ul></section></section>
<section><h2>【第四阶段】<a href="#第四阶段"><span>#</span></a></h2><section><h3>MVVM框架模式<a href="#mvvm框架模式"><span>#</span></a></h3><ul>
<li>
<p>MVVM最早由微软提出来，它借鉴了桌面应用程序的MVC思想，在前端页面中，把Model用纯Java对象表示，View负责显示，两者做到了最大限度的分离。也就是我们常说的，前后分离，真正在这里得以实现
</p><figure><img alt="Alt MVVM模式" loading="lazy" width="556" height="423" src="/_astro/MVVM.BykBpTG6_Z1ynFbS.webp" /><figcaption>Alt MVVM模式</figcaption></figure>“MVVM”<p></p>
</li>
<li>
<p>它采用双向绑定（data-binding）：View的变动，自动反映在 ViewModel，反之亦然,model数据的变动，也自动展示给页面显示</p>
</li>
<li>
<p>把Model和View关联起来的就是ViewModel。ViewModel负责把Model的数据同步到View显示出来，还负责把View的修改同步回Model。</p>
</li>
<li>
<p>可能理论知识枯燥无味，那么我们还是实战派，来看代码不就好了吗？</p>
<ul>
<li>还是刚才的 【小北最帅】案例</li>
<li>由于数据驱动模式的精髓在于【数据】和【视图】分离，所以我们首先并不关心DOM结构，而是关心数据的展现。</li>
<li>最简单的数据存储方式是什么呢？显然不是mysql、数据库而是使用Java对象</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>//HTML: 这次我不关心你了，哼哼</span></div></div><div><div><div>2</div></div><div><span>//Java: JS基础对象/原始数据</span></div></div><div><div><div>3</div></div><div><span><span>varxiaobei</span><span> </span></span><span>=</span><span> { </span><span>name</span><span>:</span><span> </span><span>'前端你别闹'</span><span>, </span><span>age</span><span>:</span><span> </span><span>3</span><span>，</span></div></div><div><div><div>4</div></div><div><span><span>tag</span><span>：</span></span><span>'干货'</span></div></div><div><div><div>5</div></div><div><span>};</span></div></div><div><div><div>6</div></div><div><span>//结果是：</span></div></div><div><div><div>7</div></div><div><span><span>name</span><span>:</span><span>前端你别闹</span></span></div></div><div><div><div>8</div></div><div><span><span>age</span><span>:</span></span><span>3</span></div></div><div><div><div>9</div></div><div><span><span>tag</span><span>:</span><span>干货</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<p>假设：我们把变量xiaobei 看作Model数据，把HTML某些DOM节点看作View，并意淫它们已经通过某种手段被关联起来了。
下面我们把name 从”前端你别闹” 改为 “小北”，把显示的age从 “3” 改为 “666”，tag变成 “最帅!”
按照以前我们肯定操作DOM节点，而现在我们只需要修改Java对象：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>Java</span><span>:</span></span><span>// JS基础对象// 改变的数据</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>varxiaobei</span><span> </span><span>=</span><span> { </span><span>name</span><span>:</span><span> </span><span>'小北'</span><span>, </span><span>age</span><span>:</span><span> </span><span>666</span><span>，</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>tag</span><span>：</span><span>'最帅'</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>};</span></div></div><div><div><div>5</div></div><div><span>//结果是：</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>name</span><span>:</span><span>小北</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>age</span><span>:</span><span>666</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>tag</span><span>:</span><span>最帅</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul><p>通过实验和理论，小伙伴惊呆了，我们只要改变Java对象的内容，就会导致DOM结构作出对应的变化！
这让我们的关注点从如何操作DOM变成了如何改变Java对象的状态，而操作Java对象比获取和操作DOM简单了一个地球的距离！
这也是MVVM的核心思想：关注Model的变化，让MVVM框架利用自己的机制去自动更新DOM，从而把开发者从操作DOM的繁琐中解脱出来！
也就是所谓的 数据 - 视图分离，数据驱动视图， 视图不影响数据，再也不用管繁琐的DOM结构操作了，世界顿时清净，完美！</p><blockquote><p>原文链接:<a href="http://www.sohu.com/a/133415335_355137?qq-pf-to=pcqq.c2c" target="_blank">http://www.sohu.com/a/133415335_355137?qq-pf-to=pcqq.c2c</a></p></blockquote></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/JavaScript%E4%B8%ADtoStirng()%E4%B8%8EObject.prototype.toString.call()%E6%96%B9%E6%B3%95%E6%B5%85%E8%B0%88%E8%BD%AC%E8%BD%BD/</id>
      <title type="text">JavaScript中toStirng()与Object.prototype.toString.call()方法浅谈转载</title>
      <published>2017-09-09T00:00:00.000Z</published>
      <updated>2017-09-09T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/JavaScript%E4%B8%ADtoStirng()%E4%B8%8EObject.prototype.toString.call()%E6%96%B9%E6%B3%95%E6%B5%85%E8%B0%88%E8%BD%AC%E8%BD%BD/"/>
      <summary type="text">JavaScript中toStirng()与Object.prototype.toString.call()方法浅谈转载</summary>
      <content type="html"><![CDATA[<ul>
<li>一、toString()是一个怎样的方法？它是能将某一个值转化为字符串的方法。然而它是如何将一个值从一种类型转化为字符串类型的呢？
通过下面几个例子，我们便能获得答案：</li>
</ul>

<ul>
<li>1.将boolean类型的值转化为string类型</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>true</span><span>.</span></span><span>toString</span><span>());</span><span>//"true"</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>false</span><span>.</span></span><span>toString</span><span>());</span><span>//"false"</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>2.将string类型按其字面量形式输出</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>str</span><span> </span></span><span>=</span><span> </span><span>"test123y"</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>str</span><span>.</span></span><span>toString</span><span>());</span><span>//"test123y"</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>3.将Object类型转化成string类型（JavaScript原生的Array类型、Date类型、RegExp类型以及Number、Boolean、String这些包装类型都是Object的子类型）：
自定义Object类型（没有重新定义toString方法）</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>obj</span><span> </span></span><span>=</span><span> {</span><span>name</span><span>:</span><span>"Tom"</span><span>, </span><span>age</span><span>:</span><span>18</span><span>};</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>obj</span><span>.</span></span><span>toString</span><span>());</span><span>//"[object Object]"此时调用的是从Object继承来的原始的toString()方法</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>接下来的三个例子都是以重写的方式实现了toString()方法；</p>
<ul>
<li>
<p>1.Array类型</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>arr</span><span> </span></span><span>=</span><span> [</span><span>"tom"</span><span>,</span><span>12</span><span>,</span><span>"rose"</span><span>,</span><span>18</span><span>];</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>arr</span><span>.</span></span><span>toString</span><span>());</span><span>//"tom,12,rose,18"</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>2.RegExp类型</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>patten</span><span> </span></span><span>=</span><span> </span><span>new</span><span> </span><span>RegExp</span><span>(</span><span>"</span><span>\\</span><span>[hbc</span><span>\\</span><span>]at"</span><span>, </span><span>"gi"</span><span>);</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>patten</span><span>.</span></span><span>toString</span><span>());</span><span>//"/\[hbc\]at/gi"</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>3.Date类型</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>date</span><span> </span></span><span>=</span><span> </span><span>new</span><span> </span><span>Date</span><span>(</span><span>2014</span><span>,</span><span>02</span><span>,</span><span>26</span><span>);</span><span>//注意这种格式创建的日期，其月份是3月</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>date</span><span>.</span></span><span>toString</span><span>());</span><span>//"Wed Mar 26 2014 00:00:00 GMT+0800"输出格式因浏览器不同而不同，此为firefox的输出格式；</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>4.Number类型也是以重写的方式实现toString()方法的，请看以下例子：</p>
<ul>
<li>
<p>(1)它可以接受一个整数参数，并将调用这个方法的数值转化成相应进制的字符串</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>num</span><span> </span></span><span>=</span><span> </span><span>16</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>num</span><span>.</span></span><span>toString</span><span>(</span><span>2</span><span>));</span><span>//10000 二进制</span></div></div><div><div><div>3</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>num</span><span>.</span></span><span>toString</span><span>(</span><span>8</span><span>));</span><span>//20 八进制</span></div></div><div><div><div>4</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>num</span><span>.</span></span><span>toString</span><span>(</span><span>16</span><span>));</span><span>//10 十六进制</span></div></div><div><div><div>5</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>num</span><span>.</span></span><span>toString</span><span>(</span><span>5</span><span>));</span><span>//31 虽然没有五进制，但是这样传参是可以被toString()方法接受的</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>(2)再看下面的代码</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(1.</span><span>toString</span><span>());</span><span>//这种写法会报错语法错误，但是下面的写法都是合法的；</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>((</span><span>1</span><span>).</span><span>toString</span><span>());</span><span>//"1"</span></div></div><div><div><div>3</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>typeof</span><span> (</span><span>1</span><span>).</span><span>toString</span><span>());</span><span>//string</span></div></div><div><div><div>4</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>1.</span><span>.</span><span>toString</span><span>());</span><span>//"1"</span></div></div><div><div><div>5</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>typeof</span><span> (</span><span>1</span><span>).</span><span>toString</span><span>());</span><span>//string</span></div></div><div><div><div>6</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>1.2</span><span>.</span><span>toString</span><span>());</span><span>//"1"</span></div></div><div><div><div>7</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>typeof</span><span> (</span><span>1</span><span>).</span><span>toString</span><span>());</span><span>//string</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>这是因为javascript引擎在解释代码时对于“1.toString()”认为“.”是浮点符号，但因小数点后面的字符是非法的，所以报语法错误；</li>
<li>而后面的“1..toString()和1.2.toStirng()”写法，javascript引擎认为第一个“.”小数点，的二个为属性访问语法，所以都能正确解释执行；</li>
<li>对于“(1).toStirng()”的写法，用“()”排除了“.”被视为小数点的语法解释，所以这种写法能够被解释执行；</li>
<li>(3)纯小数的小数点后面有连续6或6个以上的“0”时，小数将用e表示法进行输出；</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>num</span><span> </span></span><span>=</span><span> </span><span>0.000006</span><span>;</span><span>//小数点后面有5个“0”</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>num</span><span>.</span></span><span>toString</span><span>());</span><span>//"0.000006"</span></div></div><div><div><div>3</div></div><div><span>var</span><span><span> </span><span>num</span><span> </span></span><span>=</span><span> </span><span>0.0000006</span><span>;</span><span>//小数点后面有6个“0”</span></div></div><div><div><div>4</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>num</span><span>.</span></span><span>toString</span><span>());</span><span>//"6e-7"</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>(4)浮点数整数部分的位数大于21时，输出时采用e表示法；</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>num</span><span> </span></span><span>=</span><span> </span><span>1234567890123456789012</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>num</span><span>.</span></span><span>toString</span><span>());</span><span>//"1.2345678901234568e+21"</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
<li>
<p>看到这里大家难免会有些疑问，这些基本的数据类型的值都是常量，而常量是没有方法的，为什么能够调用方法呢？答案是这样的，五种基本类型除了null、undefined以外都有与之对应的特殊的引用类型——包装类型。当代码被解释执行时，底层会对基本类型做一个类型转换，即将基本类型转换成引用类型，这样就可以调用相应引用类型有权访问到的方法。</p>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p>二、toString()方法定义在何处？</p>
</li>
<li>
<p>运行以下代码</p>
</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>pro</span><span> </span></span><span>=</span><span> </span><span>Object</span><span>.</span><span>prototype</span><span>;</span></div></div><div><div><div>2</div></div><div><span>var</span><span><span> </span><span>pr</span><span> </span></span><span>=</span><span><span> </span><span>pro</span><span>.</span></span><span>__proto__</span><span>;</span><span>//ie11之前版本不支持该属性</span></div></div><div><div><div>3</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>typeof</span><span><span> </span><span>pro</span><span>);</span></span><span>//"object"</span></div></div><div><div><div>4</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>String</span><span><span>(</span><span>pro</span><span>));</span></span><span>//"[object Object]"</span></div></div><div><div><div>5</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>pro</span><span>.</span></span><span>hasOwnProperty</span><span>(</span><span>"toString"</span><span>));</span><span>//true</span></div></div><div><div><div>6</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>typeof</span><span><span> </span><span>pr</span><span>);</span></span><span>//"object"</span></div></div><div><div><div>7</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>String</span><span><span>(</span><span>pr</span><span>));</span></span><span>//"null"</span></div></div><div><div><div>8</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>pr</span><span>.</span></span><span>hasOwnProperty</span><span>(</span><span>"toString"</span><span>));</span><span>//报错</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>由此可知，toString()定义在Object.prototype上；</p>
</li>
<li>
<p>三、使用Object.prototype上的原生toString()方法判断数据类型，使用方法如下：</p>
</li>
</ul>
<p><code>Object.prototype.toString.call(value)</code></p>
<ul>
<li>
<p>1.判断基本类型：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Object</span><span>.</span><span>prototype</span><span>.</span><span>toString</span><span>.</span><span>call</span><span>(</span><span>null</span><span>);</span><span>//”[object Null]”</span></div></div><div><div><div>2</div></div><div><span>Object</span><span>.</span><span>prototype</span><span>.</span><span>toString</span><span>.</span><span>call</span><span>(</span><span>undefined</span><span>);</span><span>//”[object Undefined]”</span></div></div><div><div><div>3</div></div><div><span>Object</span><span>.</span><span>prototype</span><span>.</span><span>toString</span><span>.</span><span>call</span><span><span>(“</span><span>abc</span><span>”);</span></span><span>//”[object String]”</span></div></div><div><div><div>4</div></div><div><span>Object</span><span>.</span><span>prototype</span><span>.</span><span>toString</span><span>.</span><span>call</span><span>(</span><span>123</span><span>);</span><span>//”[object Number]”</span></div></div><div><div><div>5</div></div><div><span>Object</span><span>.</span><span>prototype</span><span>.</span><span>toString</span><span>.</span><span>call</span><span>(</span><span>true</span><span>);</span><span>//”[object Boolean]”</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>2.判断原生引用类型</p>
<ul>
<li>函数类型</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>Function</span><span> </span></span><span>fn</span><span><span>(){</span><span>console</span><span>.</span></span><span>log</span><span><span>(“</span><span>test</span><span>”);}</span></span></div></div><div><div><div>2</div></div><div><span>Object</span><span>.</span><span>prototype</span><span>.</span><span>toString</span><span>.</span><span>call</span><span><span>(</span><span>fn</span><span>);</span></span><span>//”[object Function]”</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>日期类型</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>date</span><span> </span></span><span>=</span><span> </span><span>new</span><span> </span><span>Date</span><span>();</span></div></div><div><div><div>2</div></div><div><span>Object</span><span>.</span><span>prototype</span><span>.</span><span>toString</span><span>.</span><span>call</span><span><span>(</span><span>date</span><span>);</span></span><span>//”[object Date]”</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>数组类型</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>arr</span><span> </span></span><span>=</span><span> [</span><span>1</span><span>,</span><span>2</span><span>,</span><span>3</span><span>];</span></div></div><div><div><div>2</div></div><div><span>Object</span><span>.</span><span>prototype</span><span>.</span><span>toString</span><span>.</span><span>call</span><span><span>(</span><span>arr</span><span>);</span></span><span>//”[object Array]”</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>正则表达式</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>reg</span><span> </span></span><span>=</span><span> /</span><span>[hbc]</span><span>at/</span><span>gi</span><span>;</span></div></div><div><div><div>2</div></div><div><span>Object</span><span>.</span><span>prototype</span><span>.</span><span>toString</span><span>.</span><span>call</span><span><span>(</span><span>arr</span><span>);</span></span><span>//”[object Array]”</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>自定义类型</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>Person</span><span><span>(</span><span>name</span><span>, </span><span>age</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span>    </span><span>this</span><span>.</span><span>name</span><span> </span><span>=</span><span><span> </span><span>name</span><span>;</span></span></div></div><div><div><div>3</div></div><div><span>    </span><span>this</span><span>.</span><span>age</span><span> </span><span>=</span><span><span> </span><span>age</span><span>;</span></span></div></div><div><div><div>4</div></div><div><span>}</span></div></div><div><div><div>5</div></div><div><span>var</span><span><span> </span><span>person</span><span> </span></span><span>=</span><span> </span><span>new</span><span> </span><span>Person</span><span>(</span><span>"Rose"</span><span>, </span><span>18</span><span>);</span></div></div><div><div><div>6</div></div><div><span>Object</span><span>.</span><span>prototype</span><span>.</span><span>toString</span><span>.</span><span>call</span><span><span>(</span><span>arr</span><span>); </span></span><span>//”[object Object]”</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>很明显这种方法不能准确判断person是Person类的实例，而只能用instanceof 操作符来进行判断，如下所示：</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>person</span><span> </span></span><span>instanceof</span><span> </span><span>Person</span><span>);</span><span>//输出结果为true</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>3.判断原生JSON对象：</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>isNativeJSON</span><span> </span></span><span>=</span><span><span> </span><span>window</span><span>.</span></span><span>JSON</span><span> </span><span>&amp;&amp;</span><span> </span><span>Object</span><span>.</span><span>prototype</span><span>.</span><span>toString</span><span>.</span><span>call</span><span>(</span><span>JSON</span><span>);</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>isNativeJSON</span><span>);</span></span><span>//输出结果为”[object JSON]”说明JSON是原生的，否则不是；</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>注意：<code>Object.prototype.toString()</code>本身是允许被修改的，而我们目前所讨论的关于<code>Object.prototype.toString()</code>这个方法的应用都是假设<code>toString()</code>方法未被修改为前提的。</p>
</li>
<li>
<p>本文所讨论内容多参考于《JavaScrip高级编程》第三版，另因个人水平有限，如有描述不当之处还请高手指正。</p>
</li>
</ul>
<blockquote><p>原文链接<a href="http://www.jianshu.com/p/5c6503279685" target="_blank">http://www.jianshu.com/p/5c6503279685</a></p></blockquote>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/React.createClass%20%E5%92%8C%20extends%20Component%20%E7%9A%84%E5%8C%BA%E5%88%AB(%E8%BD%AC%E8%BD%BD)/</id>
      <title type="text">React.createClass 和 extends Component 的区别(转载)</title>
      <published>2017-09-09T00:00:00.000Z</published>
      <updated>2017-09-09T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/React.createClass%20%E5%92%8C%20extends%20Component%20%E7%9A%84%E5%8C%BA%E5%88%AB(%E8%BD%AC%E8%BD%BD)/"/>
      <summary type="text">React.createClass 和 extends Component 的区别(转载)</summary>
      <content type="html"><![CDATA[<blockquote><p><code>createClass</code>本质上是一个工厂函数，<code>extends</code>的方式更加接近最新的ES6规范的<code>class</code>写法。两种方式在语法上的差别主要体现在方法的定义和静态属性的声明上。<code>createClass</code>方式的方法定义使用逗号<code>,</code>隔开，因为<code>creatClass</code>本质上是一个函数，传递给它的是一个<code>Object</code>；而<code>class</code>的方式定义方法时务必谨记不要使用逗号隔开，这是<code>ES6 class</code>的语法规范。</p></blockquote>

<section><h3><code>React.createClass</code>和<code>extends Component</code>的区别主要在于：<a href="#reactcreateclass和extends-component的区别主要在于"><span>#</span></a></h3><ul>
<li>语法区别</li>
<li>propType 和 getDefaultProps</li>
<li>状态的区别</li>
<li>this区别</li>
<li>Mixins</li>
</ul></section>
<section><h2>1.语法区别<a href="#1语法区别"><span>#</span></a></h2><ul>
<li>React.createClass</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>import</span><span> </span><span>React</span><span> </span><span>from</span><span> </span><span>'react'</span><span>;</span></div></div><div><div><div>2</div></div><div><span>const</span><span> </span><span>Contacts</span><span> </span><span>=</span><span><span> </span><span>React</span><span>.</span></span><span>createClass</span><span>({</span></div></div><div><div><div>3</div></div><div><span>  </span><span>render</span><span>() {</span></div></div><div><div><div>4</div></div><div><span>    </span><span>return</span><span> (</span></div></div><div><div><div>5</div></div><div><span><span>      </span></span><span>&lt;</span><span>div</span><span>&gt;&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>);</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>8</div></div><div><span>});</span></div></div><div><div><div>9</div></div><div><span>export</span><span> </span><span>default</span><span> </span><span>Contacts</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>React.Component</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>import</span><span> </span><span>React</span><span> </span><span>from</span><span> </span><span>'react'</span><span>;</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>class</span><span> </span><span>Contacts</span><span> </span><span>extends</span><span> </span><span>React</span><span>.</span><span>Component</span><span> {</span></div></div><div><div><div>4</div></div><div><span>  </span><span>constructor</span><span><span>(</span><span>props</span><span>) {</span></span></div></div><div><div><div>5</div></div><div><span>    </span><span>super</span><span><span>(</span><span>props</span><span>);</span></span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>  </span><span>render</span><span>() {</span></div></div><div><div><div>8</div></div><div><span>    </span><span>return</span><span> (</span></div></div><div><div><div>9</div></div><div><span><span>      </span></span><span>&lt;</span><span>div</span><span>&gt;&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>);</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>export</span><span> </span><span>default</span><span> </span><span>Contacts</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>后一种方法使用ES6的语法，用constructor构造器来构造默认的属性和状态。</li>
</ul></section>
<section><h2>2.<code>propType</code>和<code>getDefaultProps</code><a href="#2proptype和getdefaultprops"><span>#</span></a></h2><ul>
<li><code>React.createClass</code>: 通过<code>proTypes</code>对象和<code>getDefaultProps()</code>方法来设置和获取<code>props</code></li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>import</span><span> </span><span>React</span><span> </span><span>from</span><span> </span><span>'react'</span><span>;</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>const</span><span> </span><span>Contacts</span><span> </span><span>=</span><span><span> </span><span>React</span><span>.</span></span><span>createClass</span><span>({</span></div></div><div><div><div>4</div></div><div><span>  </span><span>propTypes</span><span>:</span><span> {</span></div></div><div><div><div>5</div></div><div><span>    </span><span>name</span><span>:</span><span><span> </span><span>React</span><span>.</span></span><span>PropTypes</span><span>.</span><span>string</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>7</div></div><div><span>  </span><span>getDefaultProps</span><span>() {</span></div></div><div><div><div>8</div></div><div><span>    </span><span>return</span><span> {</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>};</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>12</div></div><div><span>  </span><span>render</span><span>() {</span></div></div><div><div><div>13</div></div><div><span>    </span><span>return</span><span> (</span></div></div><div><div><div>14</div></div><div><span><span>      </span></span><span>&lt;</span><span>div</span><span>&gt;&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>);</span></div></div><div><div><div>16</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>});</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>export</span><span> </span><span>default</span><span> </span><span>Contacts</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><ul>
<li><code>React.Component</code>：通过设置两个属性<code>propTypes</code>和<code>defaultProps</code></li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>import</span><span> </span><span>React</span><span> </span><span>form</span><span> </span><span>'react'</span><span>;</span></div></div><div><div><div>2</div></div><div><span>class</span><span> </span><span>TodoItem</span><span> </span><span>extends</span><span> </span><span>React</span><span>.</span><span>Component</span><span>{</span></div></div><div><div><div>3</div></div><div><span>    </span><span>static</span><span> </span><span>propTypes</span><span> = { </span><span>// as static property</span></div></div><div><div><div>4</div></div><div><span>        </span><span>name</span><span>: </span><span>React</span><span>.</span><span>PropTypes</span><span>.</span><span>string</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>};</span></div></div><div><div><div>6</div></div><div><span>    </span><span>static</span><span> </span><span>defaultProps</span><span> = { </span><span>// as static property</span></div></div><div><div><div>7</div></div><div><span>        </span><span>name</span><span>: </span><span>''</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>};</span></div></div><div><div><div>9</div></div><div><span>    </span><span>constructor</span><span>(</span><span>props</span><span>){</span></div></div><div><div><div>10</div></div><div><span>        </span><span>super</span><span>(</span><span>props</span><span>)</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span>    </span><span>render</span><span>(){</span></div></div><div><div><div>13</div></div><div><span>        </span><span>return</span><span> &lt;</span><span>div</span><span>&gt;&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>3.状态的区别<a href="#3状态的区别"><span>#</span></a></h2><ul>
<li><code>React.createClass</code>：通过<code>getInitialState()</code>方法返回一个包含初始值的对象</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>import</span><span> </span><span>React</span><span> </span><span>from</span><span> </span><span>'react'</span><span>;</span></div></div><div><div><div>2</div></div><div><span>   </span><span>let</span><span><span> </span><span>TodoItem</span><span> </span></span><span>=</span><span><span> </span><span>React</span><span>.</span></span><span>createClass</span><span>({</span></div></div><div><div><div>3</div></div><div><span>       </span><span>// return an object</span></div></div><div><div><div>4</div></div><div><span>       </span><span>getInitialState</span><span>(){</span></div></div><div><div><div>5</div></div><div><span>           </span><span>return</span><span> {</span></div></div><div><div><div>6</div></div><div><span>               </span><span>isEditing</span><span>:</span><span> </span><span>false</span></div></div><div><div><div>7</div></div><div><span><span>           </span></span><span>}</span></div></div><div><div><div>8</div></div><div><span><span>       </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span>       </span><span>render</span><span>(){</span></div></div><div><div><div>10</div></div><div><span>           </span><span>return</span><span> &lt;</span><span>div</span><span>&gt;&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span><span>       </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span><span>   </span></span><span>})</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li><code>React.Component</code>：通过<code>constructor</code>设置初始状态</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>import</span><span> </span><span>React</span><span> </span><span>from</span><span> </span><span>'react'</span><span>;</span></div></div><div><div><div>2</div></div><div><span>  </span><span>class</span><span> </span><span>TodoItem</span><span> </span><span>extends</span><span> </span><span>React</span><span>.</span><span>Component</span><span>{</span></div></div><div><div><div>3</div></div><div><span>      </span><span>constructor</span><span><span>(</span><span>props</span><span>){</span></span></div></div><div><div><div>4</div></div><div><span>          </span><span>super</span><span><span>(</span><span>props</span><span>);</span></span></div></div><div><div><div>5</div></div><div><span>          </span><span>this</span><span>.</span><span>state</span><span> </span><span>=</span><span> { </span><span>// define this.state in constructor</span></div></div><div><div><div>6</div></div><div><span>              </span><span>isEditing</span><span>:</span><span> </span><span>false</span></div></div><div><div><div>7</div></div><div><span><span>          </span></span><span>}</span></div></div><div><div><div>8</div></div><div><span><span>      </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span>      </span><span>render</span><span>(){</span></div></div><div><div><div>10</div></div><div><span>          </span><span>return</span><span> &lt;</span><span>div</span><span>&gt;&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span><span>      </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span><span>  </span></span><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>4.this区别<a href="#4this区别"><span>#</span></a></h2><ul>
<li><code>React.createClass</code>：会正确绑定<code>this</code></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>import</span><span> </span><span>React</span><span> </span><span>from</span><span> </span><span>'react'</span><span>;</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>const</span><span> </span><span>Contacts</span><span> </span><span>=</span><span><span> </span><span>React</span><span>.</span></span><span>createClass</span><span>({</span></div></div><div><div><div>4</div></div><div><span>  </span><span>handleClick</span><span>() {</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>this</span><span>); </span><span>// React Component instance</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>7</div></div><div><span>  </span><span>render</span><span>() {</span></div></div><div><div><div>8</div></div><div><span>    </span><span>return</span><span> (</span></div></div><div><div><div>9</div></div><div><span><span>      </span></span><span>&lt;</span><span>div</span><span> </span><span>onClick</span><span><span>=</span><span>{</span></span><span>this</span><span>.</span><span>handleClick</span><span><span>}</span><span>&gt;&lt;/</span></span><span>div</span><span>&gt;</span><span>//会切换到正确的this上下文</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>);</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span>});</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>export</span><span> </span><span>default</span><span> </span><span>Contacts</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li><code>React.Component</code>：由于使用了 <code>ES6</code>，这里会有些微不同，属性并不会自动绑定到 <code>React</code> 类的实例上。</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>import</span><span> </span><span>React</span><span> </span><span>from</span><span> </span><span>'react'</span><span>;</span></div></div><div><div><div>2</div></div><div><span>class</span><span> </span><span>TodoItem</span><span> </span><span>extends</span><span> </span><span>React</span><span>.</span><span>Component</span><span>{</span></div></div><div><div><div>3</div></div><div><span>  </span><span>constructor</span><span><span>(</span><span>props</span><span>){</span></span></div></div><div><div><div>4</div></div><div><span>    </span><span>super</span><span><span>(</span><span>props</span><span>);</span></span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>  </span><span>handleClick</span><span>(){</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>this</span><span>); </span><span>// null</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span>  </span><span>handleFocus</span><span>(){  </span><span>// manually bind this</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>this</span><span>); </span><span>// React Component Instance</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span>  </span><span>handleBlur</span><span>:</span><span> ()</span><span>=&gt;</span><span>{  </span><span>// use arrow function</span></div></div><div><div><div>13</div></div><div><span>    </span><span>console</span><span>.</span><span>log</span><span>(</span><span>this</span><span>); </span><span>// React Component Instance</span></div></div><div><div><div>14</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span>  </span><span>render</span><span>(){</span></div></div><div><div><div>16</div></div><div><span>    </span><span>return</span><span> &lt;</span><span>input</span><span> </span><span>onClick</span><span><span>=</span><span>{</span></span><span>this</span><span>.</span><span>handleClick</span><span>}</span></div></div><div><div><div>17</div></div><div><span>      </span><span>onFocus</span><span><span>=</span><span>{</span></span><span>this</span><span>.</span><span>handleFocus</span><span>.</span><span>bind</span><span>(</span><span>this</span><span><span>)</span><span>}</span></span></div></div><div><div><div>18</div></div><div><span>      </span><span>onBlur</span><span><span>=</span><span>{</span></span><span>this</span><span>.</span><span>handleBlur</span><span><span>}</span><span>/&gt;</span></span></div></div><div><div><div>19</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><ul>
<li>我们还可以在 <code>constructor</code> 中来改变 <code>this.handleClick</code> 执行的上下文，这应该是相对上面一种来说更好的办法，万一我们需要改变语法结构，这种方式完全不需要去改动 <code>JSX</code> 的部分：</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>import</span><span> </span><span>React</span><span> </span><span>from</span><span> </span><span>'react'</span><span>;</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>class</span><span> </span><span>Contacts</span><span> </span><span>extends</span><span> </span><span>React</span><span>.</span><span>Component</span><span> {</span></div></div><div><div><div>4</div></div><div><span>  </span><span>constructor</span><span><span>(</span><span>props</span><span>) {</span></span></div></div><div><div><div>5</div></div><div><span>    </span><span>super</span><span><span>(</span><span>props</span><span>);</span></span></div></div><div><div><div>6</div></div><div><span>    </span><span>this</span><span>.</span><span>handleClick</span><span> </span><span>=</span><span> </span><span>this</span><span>.</span><span>handleClick</span><span>.</span><span>bind</span><span>(</span><span>this</span><span>);</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>8</div></div><div><span>  </span><span>handleClick</span><span>() {</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>this</span><span>); </span><span>// React Component instance</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>11</div></div><div><span>  </span><span>render</span><span>() {</span></div></div><div><div><div>12</div></div><div><span>    </span><span>return</span><span> (</span></div></div><div><div><div>13</div></div><div><span><span>      </span></span><span>&lt;</span><span>div</span><span> </span><span>onClick</span><span><span>=</span><span>{</span></span><span>this</span><span>.</span><span>handleClick</span><span><span>}</span><span>&gt;&lt;/</span></span><span>div</span><span>&gt;</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>);</span></div></div><div><div><div>15</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>export</span><span> </span><span>default</span><span> </span><span>Contacts</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>5.<code>Mixins</code><a href="#5mixins"><span>#</span></a></h2><ul>
<li>如果我们使用 <code>ES6</code> 的方式来创建组件，那么 <code>React mixins</code> 的特性将不能被使用了。</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>React</span><span>.</span></span><span>createClass</span><span><span>：</span><span>使用</span><span> </span><span>React</span><span>.</span></span><span>createClass</span><span><span> </span><span>的话</span><span>，</span><span>我们可以在创建组件时添加一个叫做</span><span> </span><span>mixins</span><span> </span><span>的属性</span><span>，</span><span>并将可供混合的类的集合以数组的形式赋给</span><span> </span><span>mixins</span><span>。</span></span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>import</span><span> </span><span>React</span><span> </span><span>from</span><span> </span><span>'react'</span><span>;</span></div></div><div><div><div>4</div></div><div><span>let</span><span><span> </span><span>MyMixin</span><span> </span></span><span>=</span><span> {</span></div></div><div><div><div>5</div></div><div><span>    </span><span>doSomething</span><span>(){}</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div><span>let</span><span><span> </span><span>TodoItem</span><span> </span></span><span>=</span><span><span> </span><span>React</span><span>.</span></span><span>createClass</span><span>({</span></div></div><div><div><div>8</div></div><div><span>    </span><span>mixins</span><span>:</span><span><span> [</span><span>MyMixin</span><span>], </span></span><span>// add mixin</span></div></div><div><div><div>9</div></div><div><span>    </span><span>render</span><span>(){</span></div></div><div><div><div>10</div></div><div><span>        </span><span>return</span><span> &lt;</span><span>div</span><span>&gt;&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span>})</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p>原文链接<a href="https://segmentfault.com/a/1190000005863630" target="_blank">https://segmentfault.com/a/1190000005863630</a></p></blockquote></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/%E6%A8%A1%E5%9D%97%E5%8C%96%E4%B8%8E%E7%BB%84%E4%BB%B6%E5%8C%96/</id>
      <title type="text">模块化与组件化</title>
      <published>2017-09-09T00:00:00.000Z</published>
      <updated>2017-09-09T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/%E6%A8%A1%E5%9D%97%E5%8C%96%E4%B8%8E%E7%BB%84%E4%BB%B6%E5%8C%96/"/>
      <summary type="text">模块化与组件化</summary>
      <content type="html"><![CDATA[<ul>
<li>组件化和模块化的中心思想都是分而治之。目的都是将一个庞大的系统拆分成多个组件或者说是模块。</li>
</ul>

<section><h3>模块化的定义<a href="#模块化的定义"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>Modular</span><span> </span><span>programming</span><span> </span><span>is</span><span> </span><span>a</span><span> </span><span>software</span><span> </span><span>design</span><span> </span><span>technique</span><span> </span><span>that</span><span> </span><span>emphasizes</span><span> </span><span>separating</span><span> </span><span>the</span><span> </span><span>functionality</span><span> </span></span><span>of</span><span><span> </span><span>a</span><span> </span><span>program</span><span> </span><span>into</span><span> </span><span>independent</span><span>, </span><span>interchangeable</span><span> </span><span>modules</span><span>, </span><span>such</span><span> </span><span>that</span><span> </span><span>each</span><span> </span><span>contains</span><span> </span><span>everything</span><span> </span><span>necessary</span><span> </span><span>to</span><span> </span><span>execute</span><span> </span><span>only</span><span> </span><span>one</span><span> </span><span>aspect</span><span> </span></span><span>of</span><span><span> </span><span>the</span><span> </span><span>desired</span><span> </span><span>functionality</span><span>.</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>简单来说,模块化就是将一个程序按照其功能做拆分，分成相互独立的模块，以便于每个模块只包含与其功能相关的内容。模块我们相对熟悉,比如登录功能可以是一个模块,搜索功能可以是一个模块,汽车的发送机也可是一个模块.</p></section>
<section><h3>组件化的定义<a href="#组件化的定义"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Component</span><span>-</span><span><span>based</span><span> </span><span>software</span><span> </span></span><span>engineering</span><span> (</span><span>CBSE</span><span><span>), </span><span>also</span><span> </span><span>known</span><span> </span><span>as</span><span> </span></span><span>component</span><span>-</span><span><span>based</span><span> </span></span><span>development</span><span> (</span><span>CBD</span><span><span>), </span><span>is</span><span> </span><span>a</span><span> </span><span>branch</span><span> </span></span><span>of</span><span><span> </span><span>software</span><span> </span><span>engineering</span><span> </span><span>that</span><span> </span><span>emphasizes</span><span> </span><span>the</span><span> </span><span>separation</span><span> </span></span><span>of</span><span><span> </span><span>concerns</span><span> </span></span><span>in</span><span><span> </span><span>respect</span><span> </span></span><span>of</span><span><span> </span><span>the</span><span> </span><span>wide</span></span><span>-</span><span><span>ranging</span><span> </span><span>functionality</span><span> </span><span>available</span><span> </span><span>throughout</span><span> </span><span>a</span><span> </span><span>given</span><span> </span><span>software</span><span> </span><span>system</span><span>. </span></span><span>It</span><span><span> </span><span>is</span><span> </span><span>a</span><span> </span><span>reuse</span></span><span>-</span><span><span>based</span><span> </span><span>approach</span><span> </span><span>to</span><span> </span><span>defining</span><span>, </span><span>implementing</span><span> </span><span>and</span><span> </span><span>composing</span><span> </span><span>loosely</span><span> </span><span>coupled</span><span> </span><span>independent</span><span> </span><span>components</span><span> </span><span>into</span><span> </span><span>systems</span><span>. </span></span><span>This</span><span><span> </span><span>practice</span><span> </span><span>aims</span><span> </span><span>to</span><span> </span><span>bring</span><span> </span><span>about</span><span> </span><span>an</span><span> </span><span>equally</span><span> </span><span>wide</span></span><span>-</span><span><span>ranging</span><span> </span><span>degree</span><span> </span></span><span>of</span><span><span> </span><span>benefits</span><span> </span></span><span>in</span><span><span> </span><span>both</span><span> </span><span>the</span><span> </span><span>short</span></span><span>-</span><span><span>term</span><span> </span><span>and</span><span> </span><span>the</span><span> </span><span>long</span></span><span>-</span><span><span>term</span><span> </span><span>for</span><span> </span><span>the</span><span> </span><span>software</span><span> </span><span>itself</span><span> </span><span>and</span><span> </span><span>for</span><span> </span><span>organizations</span><span> </span><span>that</span><span> </span><span>sponsor</span><span> </span><span>such</span><span> </span><span>software</span><span>.</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>组件化就是基于可重用的目的，将一个大的软件系统按照分离关注点的形式，拆分成多个独立的组件，主要目的就是减少耦合.
<ul>
<li>一个独立的组件可以是一个软件包、web服务、web资源或者是封装了一些函数的模块。比如汽车的发动机是一个模块,也是一个组件,再或者前端中的一个日历控件是一个模块,也一个组件.这样，独立出来的组件可以单独维护和升级而不会影响到其他的组件.</li>
</ul>
</li>
</ul></section>
<section><h3>JS/CSS模块化开发<a href="#jscss模块化开发"><span>#</span></a></h3><ul>
<li>分而治之是软件工程中的重要思想,是复杂系统开发和维护的基石,这点放在前端开发中同样适用.在解决了基本开发运行效率问题之后,前端团队开始思考维护效率,模块化是目前前端最流行的分治手段.</li>
<li>模块化开发的最大价值应该是分治.</li>
<li>不管你将来是否要复用某段代码,你都有充分的理由将其分治为一个模块</li>
</ul></section>
<section><h3>组件化开发<a href="#组件化开发"><span>#</span></a></h3><ul>
<li>分治的确是非常重要的工程优化手段.前端作为一种GUI软件,光有JS/CSS的模块化还不够,对于UI组件的分治也有着同样迫切的需求
<ul>
<li>1.页面上的每个独立的可是/可交互区域都可以视为一个组件</li>
<li>2.每个组件对应一个工程目录,组件所需的各种资源都在这个目录下就近维护</li>
<li>3.由于组件具有独立性,因此组件与组件之间可以自由组合</li>
<li>4.页面只不过是组合的容器,负责组合组件形成功能完整的界面</li>
<li>5.当不需要某个组件,或者想要替换组件时,可以整个目录删除替换</li>
</ul>
</li>
</ul></section>
<section><h3>组件化vs模块化<a href="#组件化vs模块化"><span>#</span></a></h3><ul>
<li>组件和模块是一对容易混淆的名词,也常常被用来相互替换,两者是否有差异往往取决于专业背景、所在领域、以及视角。从设计上来看,组件强调复用,模块强调职责(内聚、分离),或者说组件是达到可复用要求的模块
<ul>
<li>模块化强调的是拆分，无论是从业务角度还是从架构、技术角度，模块化首先意味着将代码、数据等内容按照其职责不同分离，使其变得更加容易维护、迭代，使开发人员可以分而治之。</li>
<li>组件化则着重于可重用性，不管是界面上反复使用的用户头像按钮，还是处理数据的流程中的某个部件，只要可以被反复使用，并且进行了高度封装，只能通过接口访问，就可以称其为“组件”。</li>
</ul>
</li>
</ul><blockquote><p>参考网址:<a href="http://blog.csdn.net/dd864140130/article/details/53645290" target="_blank">http://blog.csdn.net/dd864140130/article/details/53645290</a></p></blockquote></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/getter&amp;setter/</id>
      <title type="text">getter&amp;setter</title>
      <published>2017-09-05T00:00:00.000Z</published>
      <updated>2017-09-05T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/getter&amp;setter/"/>
      <summary type="text">getter&amp;setter</summary>
      <content type="html"><![CDATA[<section><h3>一般在书上看到都解释都是 把成员变量直接暴露在外不符合OOP的封装性原则，不安全，应该使用getter和setter方法来取值和赋值。但是没有解释为什么不符合OOP的封装性原则，为什么不安全，一个成员变量不就是取值和赋值这么两个操作吗，还能干什么，暴露出来又怎么样？<a href="#一般在书上看到都解释都是-把成员变量直接暴露在外不符合oop的封装性原则不安全应该使用getter和setter方法来取值和赋值但是没有解释为什么不符合oop的封装性原则为什么不安全一个成员变量不就是取值和赋值这么两个操作吗还能干什么暴露出来又怎么样"><span>#</span></a></h3><ul>
<li>的确可以暴露，如果
<ul>
<li>
<ol>
<li>所有内外代码都是你自己写；</li>
</ol>
</li>
<li>
<ol>
<li>这个模块再也不改了；</li>
</ol>
</li>
<li>
<ol>
<li>不会继承它，或者继承但不改变语义。</li>
</ol>
</li>
</ul>
</li>
<li>David John Wheeler有一句名言：“All problems in computer science can be solved by another level of indirection(翻译:“计算机科学中的所有问题都可以通过另一种间接方式来解决).”getter、setter就是个很好的中间层。</li>
<li>直接摘录stackoverflow上一个不错的总结：</li>
<li>oop - Why use getters and setters?
<ul>
<li>1.这两个方法可以方便增加额外功能（比如验证）。</li>
<li>2.内部存储和外部表现不同。</li>
<li>3.可以保持外部接口不变的情况下，修改内部存储方式和逻辑。</li>
<li>4.任意管理变量的生命周期和内存存储方式。提供一个debug接口。</li>
<li>5.能够和模拟对象、序列化乃至WPF库等融合。</li>
<li>6.允许继承者改变语义。</li>
<li>7.可以将getter、setter用于lambda表达式。（大概即作为一个函数，参与函数传递和运算）</li>
<li>8.getter和setter可以有不同的访问级别。</li>
</ul>
</li>
<li>lambda表达式</li>
<li>Lambda 表达式”(lambda expression)是一个匿名函数，Lambda表达式基于数学中的λ演算得名，直接对应于其中的lambda抽象(lambda abstraction)，是一个匿名函数，即没有函数名的函数。Lambda表达式可以表示闭包（注意和数学传统意义上的不同）。
<ul>
<li>lambda  <code> ['læmdə]</code>  希腊字母的第11个λ</li>
<li>expression  <code>[ɪkˈspreʃn]</code>  表达</li>
<li>abstraction  <code>[əb'strækʃ(ə)n]</code>  抽象概念</li>
</ul>
</li>
</ul></section>
<section><h3>以下为转载<a href="#以下为转载"><span>#</span></a></h3><blockquote><p>Compiling the list up here at the top of what seemed winners to me, from the viewpoint of a Java web dev:(从Java web开发人员的角度来看，在我看来是赢家的列表上面列出了这个列表:)</p></blockquote><ul>
<li>1.When you realize you need to do more than just set and get the value, you don’t have to change every file in the codebase.当您意识到您需要做的不仅仅是设置和获取值时，您不必更改代码库中的每个文件。</li>
<li>2.You can perform validation here.您可以在这里执行验证。</li>
<li>3.You can change the value being set.您可以更改设置的值。</li>
<li>4.You can hide the internal representation. getAddress() could actually be getting several fields for you.您可以隐藏内部表示。getAddress()实际上可以为您获取多个字段。</li>
<li>5.You’ve insulated your public interface from changes under the sheets.您已经将您的公共接口与表单下的更改隔离了。</li>
<li>6.Some libraries expect this. Reflection, serialization, mock objects.一些图书馆预计。反射,序列化,模拟对象。</li>
<li>7.Inheriting this class, you can override default functionality.继承这个类，您可以覆盖默认的功能。</li>
<li>8.You can have different access levels for getter and setter.对于getter和setter，您可以有不同的访问级别。</li>
<li>9.Lazy loading.延迟加载；懒装载；懒加载</li>
<li>10.People can easily tell you didn’t use Python.人们可以很容易地告诉您，您没有使用Python。</li>
</ul><section><h4>参考链接<a href="#参考链接"><span>#</span></a></h4><ul>
<li><a href="https://stackoverflow.com/questions/1568091/why-use-getters-and-setters" target="_blank">https://stackoverflow.com/questions/1568091/why-use-getters-and-setters</a></li>
<li><a href="https://www.zhihu.com/question/21401198/answer/18113707" target="_blank">https://www.zhihu.com/question/21401198/answer/18113707</a></li>
</ul></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/JS%E5%87%BD%E6%95%B0%E5%86%85%E9%83%A8%E7%9A%84[[scope]]%E5%B1%9E%E6%80%A7/</id>
      <title type="text">JS函数内部的[[scope]]属性</title>
      <published>2017-09-05T00:00:00.000Z</published>
      <updated>2017-09-05T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/JS%E5%87%BD%E6%95%B0%E5%86%85%E9%83%A8%E7%9A%84[[scope]]%E5%B1%9E%E6%80%A7/"/>
      <summary type="text">JS函数内部的`[[scope]]`属性</summary>
      <content type="html"><![CDATA[<section><h3><code>[[scope]]</code><a href="#scope"><span>#</span></a></h3><p>函数内部的<code>[[scope]]</code>属性是虚拟出来的一个属性，我们实际访问时访问不到这个属性的，这个属性是为了让我们更好的理解函数，虚拟出来的一个属性。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>fun1</span><span>,</span><span>fun2</span><span>;</span></span></div></div><div><div><div>2</div></div><div><span>function</span><span> </span><span>foo</span><span>() {</span></div></div><div><div><div>3</div></div><div><span>    </span><span>var</span><span><span> </span><span>x</span><span> </span></span><span>=</span><span> </span><span>10</span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>fun1</span><span> </span><span>=</span><span> </span><span>function</span><span> () {</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>++</span><span><span>x</span><span>);</span></span><span>//11  x=11</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>};</span></div></div><div><div><div>7</div></div><div><span>    </span><span>fun2</span><span> </span><span>=</span><span> </span><span>function</span><span> () {</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>--</span><span><span>x</span><span>);</span></span><span>//10  x=10</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span>}</span></div></div><div><div><div>11</div></div><div><span>foo</span><span>();   </span><span>// 初始化了fun1,fun2函数</span></div></div><div><div><div>12</div></div><div><span>fun1</span><span>();  </span><span>// 11</span></div></div><div><div><div>13</div></div><div><span>fun2</span><span>();  </span><span>// 10</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>产生这个情况的原因是&lt;在同一父作用域中的闭包共同同一个&gt;<code>[[scope]]</code>属性</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>x</span><span> </span></span><span>=</span><span> </span><span>10</span><span>;</span></div></div><div><div><div>2</div></div><div><span>function</span><span> </span><span>foo</span><span> () {</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>x</span><span>);</span></span></div></div><div><div><div>4</div></div><div><span>}</span></div></div><div><div><div>5</div></div><div><span>foo</span><span>(); </span><span>// 10</span></div></div><div><div><div>6</div></div><div><span>function</span><span> </span><span>fun</span><span> () {</span></div></div><div><div><div>7</div></div><div><span>    </span><span>var</span><span><span> </span><span>x</span><span> </span></span><span>=</span><span> </span><span>20</span><span>;</span></div></div><div><div><div>8</div></div><div><span>    </span><span>var</span><span><span> </span><span>foo1</span><span> </span></span><span>=</span><span><span> </span><span>foo</span><span>;</span></span></div></div><div><div><div>9</div></div><div><span>    </span><span>foo1</span><span>();   </span><span>// 10</span></div></div><div><div><div>10</div></div><div><span>}</span></div></div><div><div><div>11</div></div><div><span>fun</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p>是10的原因就是在复制函数的时候，复制后的函数与复制前的函数引用的是同一个<code>[[scope]]</code>属性，由于<code>foo</code>的<code>[[scope]]</code>属性中的<code>x</code>是保存在函数父作用域链中的，这个也就是指的全局的变量对象（也就是全局变量）中的<code>x</code>，<code>foo1</code>中<code>[[scope]]</code>属性与<code>foo</code>的相同，所以<code>foo1</code>在执行创建的<code>scope</code>，只有<code>foo1</code>内部的<code>[[scope]]</code>属性（也就是<code>foo</code>内部的<code>[[scope]]</code>属性），所以在查找原型链时，<code>foo1</code>作用域链就直接查找到了全局对象中的<code>x</code>属性，所以会返回10。</p>
</li>
<li>
<p><code>[[Scope]]</code>和执行期上下文虽然保存的都是作用域链，但不是同一个东西</p>
</li>
<li>
<p><code>[[Scope]]</code>属性是函数创建时产生的，会一直存在;而执行上下文在函数执行时产生，函数执行结束便会销毁</p>
</li>
<li>
<p>伪代码:<code>foo</code>函数创建产生<code>[[Scope]]</code>对象</p>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>foo</span><span>.[[</span><span>Scope</span><span>]] </span></span><span>=</span><span> {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>GO</span><span>:</span><span> {</span></div></div><div><div><div>3</div></div><div><span>        </span><span>this</span><span>:</span><span><span> </span><span>window</span><span> ,</span></span></div></div><div><div><div>4</div></div><div><span>        </span><span>window</span><span>:...</span><span> ,</span></div></div><div><div><div>5</div></div><div><span>        </span><span>document</span><span>:</span><span> </span><span>...</span><span> ,</span></div></div><div><div><div>6</div></div><div><span>        </span><span>a</span><span>:</span><span> </span><span>undefined</span><span>, </span><span>//预编译阶段还不知道a的值是多少，执行过程中会修改</span></div></div><div><div><div>7</div></div><div><span>        </span><span>foo</span><span>:</span><span> </span><span>function</span><span>(){</span><span>...</span><span>},</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>......</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p>详细了解推荐地址:<a href="http://www.2cto.com/kf/201312/263748.html" target="_blank">http://www.2cto.com/kf/201312/263748.html</a></p></blockquote></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/JS%E6%AD%A3%E5%88%99%E5%9F%BA%E7%A1%80/</id>
      <title type="text">JS正则基础</title>
      <published>2017-09-05T00:00:00.000Z</published>
      <updated>2017-09-05T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/JS%E6%AD%A3%E5%88%99%E5%9F%BA%E7%A1%80/"/>
      <summary type="text">JS正则基础</summary>
      <content type="html"><![CDATA[<section><h2>正则的作用<a href="#正则的作用"><span>#</span></a></h2><p>正则是来处理复杂字符串的</p><section><h3>1.正则的匹配<a href="#1正则的匹配"><span>#</span></a></h3><ul>
<li>test返回值=&gt;true,false</li>
</ul></section><section><h3>2.正则的捕获<a href="#2正则的捕获"><span>#</span></a></h3><ul>
<li>把匹配内容找出来,exec方法</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>reg</span></span><span>=</span><span>/9/</span><span>g</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h2>正则的组成<a href="#正则的组成"><span>#</span></a></h2><ul>
<li>
<p>1.元字符,写在//中间的全是元字符</p>
</li>
<li>
<p>2.修饰符 写在//后面</p>
<ul>
<li>g(全局匹配),i(忽略大小写),m(换行匹配)
<strong>注意&lt;一个元字符只能匹配一个字符&gt;</strong></li>
</ul>
</li>
<li>
<p>1-1.特殊意义的元字符</p>
</li>
<li>
<ol>
<li><code>\</code>转义字符,一般都是把具有特殊意义的字符变成仅仅是本身意思的字符</li>
</ol>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>str</span></span><span>=</span><span>'I</span><span>\'</span><span>m a person'</span><span>;</span></div></div><div><div><div>2</div></div><div><span>    </span><span>var</span><span><span> </span><span>reg</span></span><span>=</span><span>/</span><span>.</span><span>/</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>reg</span><span>.</span><span>test</span><span><span>(</span><span>str</span><span>);</span></span><span>//true</span></div></div><div><div><div>4</div></div><div><span>    </span><span>var</span><span><span> </span><span>reg</span></span><span>=</span><span><span>/</span><span>\.</span><span>/</span></span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>reg</span><span>.</span><span>test</span><span>(</span><span>"1.1"</span><span>);</span><span>//true</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<ol>
<li><code>^</code>以什么什么开始</li>
</ol>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>reg</span></span><span>=</span><span>/</span><span>^</span><span>1/</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>reg</span><span>.</span><span>test</span><span>(</span><span>"123445464"</span><span>);</span><span>//true</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>reg</span><span>.</span><span>test</span><span>(</span><span>"0001"</span><span>);</span><span>//false</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<ol>
<li><code>$</code>以什么什么结尾</li>
</ol>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>reg</span></span><span>=</span><span>/m</span><span>$</span><span>/</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>reg</span><span>.</span></span><span>test</span><span>(</span><span>"mq"</span><span>);</span><span>//false</span></div></div><div><div><div>3</div></div><div><span><span>reg</span><span>.</span></span><span>test</span><span>(</span><span>"qm"</span><span>);</span><span>//true</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>应用</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>reg</span></span><span>=</span><span>/</span><span>^</span><span>6</span><span>$</span><span>/</span><span>;</span><span>//只匹配"6"</span></div></div><div><div><div>2</div></div><div><span>var</span><span><span> </span><span>reg</span></span><span>=</span><span>/</span><span>^</span><span>\d</span><span>$</span><span>/</span><span>;</span><span>//只匹配一个0-9中的任意一位数的字符串</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<ol>
<li><code>\d</code>匹配0-9中任意一个字符</li>
</ol>
</li>
<li>
<ol>
<li><code>\D</code>  除了\d以外任意一个字符</li>
</ol>
</li>
<li>
<ol>
<li><code>\w</code>  匹配0-9,a-z,A-Z,_这63个中的任意一个</li>
</ol>
</li>
<li>
<ol>
<li><code>\W</code> 匹配除了\w以外的任意一个</li>
</ol>
</li>
<li>
<ol>
<li><code>\n</code> 匹配一个换行符</li>
</ol>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>str</span></span><span>=</span><span>"abc</span><span>\n</span><span>efd"</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>str</span><span>);</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<ol>
<li><code>\s</code> 匹配一个空白符(空格 制表符 换页符)</li>
</ol>
</li>
<li>
<ol>
<li><code>\S</code>匹配除了\s以外的任意一个字符</li>
</ol>
</li>
<li>
<ol>
<li><code>\b</code>匹配一个边界</li>
</ol>
</li>
<li>
<ol>
<li><code>\B</code>匹配一个非边界</li>
</ol>
</li>
<li>
<ol>
<li><code>.</code> 除了\n以外的任意一个字符</li>
</ol>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>reg</span></span><span>=</span><span>/</span><span>\d\w</span><span>/</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>reg</span><span>.</span></span><span>test</span><span>(</span><span>"1.2"</span><span>);</span><span>//false</span></div></div><div><div><div>3</div></div><div><span><span>reg</span><span>.</span></span><span>test</span><span>(</span><span>"1-2"</span><span>);</span><span>//false</span></div></div><div><div><div>4</div></div><div><span><span>reg</span><span>.</span></span><span>test</span><span>(</span><span>"1"</span><span>);</span><span>//false</span></div></div><div><div><div>5</div></div><div><span><span>reg</span><span>.</span></span><span>test</span><span>(</span><span>"1w"</span><span>);</span><span>//true</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>reg</span></span><span>=</span><span>/</span><span>^</span><span>\s\w\s</span><span>$</span><span>/</span><span>;</span><span>//字符串length是三</span></div></div><div><div><div>2</div></div><div><span><span>reg</span><span>.</span></span><span>test</span><span>(</span><span>" w "</span><span>);</span></div></div><div><div><div>3</div></div><div><span>var</span><span><span> </span><span>reg</span></span><span>=</span><span>/</span><span>^</span><span>\s\s\s</span><span>$</span><span>/</span><span>;</span><span>// "   "</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>reg</span></span><span>=</span><span>/</span><span>\b</span><span>aa</span><span>\B</span><span>/</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>reg</span><span>.</span></span><span>test</span><span>(</span><span>"a aa a aaa"</span><span>);</span><span>//true</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>1-2. 量词元字符(量词元字符一定要写在元字符的后面)</li>
<li>
<ol>
<li><code>*</code>前面的元字符出现0到多次</li>
</ol>
</li>
<li>
<ol>
<li><code>+</code>前面的元字符出现1到多次</li>
</ol>
</li>
<li>
<ol>
<li><code>?</code>前面的元字符出现0次或者1次</li>
</ol>
</li>
<li>
<ol>
<li><code>{number}</code>   前面的元字符出现number次</li>
</ol>
</li>
<li>
<ol>
<li><code>{number,}</code>  前面的元字符出现number到多次</li>
</ol>
</li>
<li>
<ol>
<li><code>{number,m}</code>  前面的元字符出现number到m次</li>
</ol>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>reg</span></span><span>=</span><span>/</span><span>\d</span><span><span>*</span><span>/</span></span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>reg</span><span>.</span></span><span>test</span><span>(</span><span>""</span><span>);</span><span>//true</span></div></div><div><div><div>3</div></div><div><span><span>reg</span><span>.</span></span><span>test</span><span>(</span><span>"1"</span><span>);</span><span>//true</span></div></div><div><div><div>4</div></div><div><span><span>reg</span><span>.</span></span><span>test</span><span>(</span><span>"111"</span><span>);</span><span>//true</span></div></div><div><div><div>5</div></div><div><span><span>reg</span><span>.</span></span><span>test</span><span>(</span><span>"wwww..."</span><span>);</span><span>//true</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>var</span><span><span> </span><span>reg</span></span><span>=</span><span>/</span><span>^</span><span>\w</span><span><span>{4}</span><span>1</span><span>+</span></span><span>$</span><span>/</span><span>;</span><span>//length&gt;=5</span></div></div><div><div><div>8</div></div><div><span><span>reg</span><span>.</span></span><span>test</span><span>(</span><span>"111111"</span><span>);</span><span>//true</span></div></div><div><div><div>9</div></div><div><span><span>reg</span><span>.</span></span><span>test</span><span>(</span><span>"abcd2"</span><span>);</span><span>//false</span></div></div><div><div><div>10</div></div><div><span><span>reg</span><span>.</span></span><span>test</span><span>(</span><span>"121221"</span><span>);</span><span>//false</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>var</span><span><span> </span><span>reg</span></span><span>=</span><span>/</span><span>^</span><span>1</span><span>\d</span><span>{10}</span><span>$</span><span>/</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>1-3.中括号<code>[]</code></li>
<li>
<ol>
<li><code>x|y</code> x或y中的一个</li>
</ol>
</li>
<li>
<ol>
<li><code>[xyz]</code> xyz中的一个</li>
</ol>
</li>
<li>
<ol>
<li><code>[^xyz]</code> 不是xyz中的任意一个</li>
</ol>
</li>
<li>
<ol>
<li><code>[a-z]</code> a-z中的任意一个</li>
</ol>
</li>
</ul><p>在中括号中除了上面说的具有特殊意义的字符都只是代表本身的意思,但是转义字符\仍然是转义</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>reg</span></span><span>=</span><span>/</span><span>^</span><span><span>[</span><span>\d.</span><span>]</span></span><span>$</span><span>/</span><span>;</span><span>//字符串的length=1</span></div></div><div><div><div>2</div></div><div><span><span>reg</span><span>.</span></span><span>test</span><span>(</span><span>"q"</span><span>);</span><span>//false</span></div></div><div><div><div>3</div></div><div><span><span>reg</span><span>.</span></span><span>test</span><span>(</span><span>"1."</span><span>);</span><span>//false</span></div></div><div><div><div>4</div></div><div><span><span>reg</span><span>.</span></span><span>test</span><span>(</span><span>"."</span><span>);</span><span>//true</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>在没有小括号的情况下,|最后运算</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span>  </span><span>reg</span></span><span>=</span><span>/</span><span>^</span><span><span>10</span><span>|</span><span>20</span></span><span>$</span><span>/</span><span>;</span><span>//以10开头 或者 以20结尾</span></div></div><div><div><div>2</div></div><div><span><span>reg</span><span>.</span></span><span>test</span><span>(</span><span>"1000D"</span><span>);</span><span>//true</span></div></div><div><div><div>3</div></div><div><span><span>reg</span><span>.</span></span><span>test</span><span>(</span><span>"00020"</span><span>);</span><span>//true</span></div></div><div><div><div>4</div></div><div><span><span>reg</span><span>.</span></span><span>test</span><span>(</span><span>"10201020"</span><span>);</span><span>//true</span></div></div><div><div><div>5</div></div><div><span>var</span><span><span> </span><span>reg</span></span><span>=</span><span>/</span><span>^</span><span><span>(10</span><span>|</span><span>20)</span></span><span>$</span><span>/</span><span>;</span><span>//"10" "20"   以10开头结尾  或者  以20开头结尾</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>var</span><span><span> </span><span>reg</span></span><span>=</span><span>/</span><span>^</span><span>[1020]</span><span>$</span><span>/</span><span>;</span><span>//"1" "0" "2"</span></div></div><div><div><div>8</div></div><div><span>var</span><span><span> </span><span>reg</span></span><span>=</span><span>/</span><span>^</span><span>[10-20]</span><span>$</span><span>/</span><span>;</span><span>//"1" "0-2" "0"</span></div></div><div><div><div>9</div></div><div><span>var</span><span><span> </span><span>reg</span></span><span>=</span><span>/</span><span>^</span><span>[16-20]</span><span>$</span><span>/</span><span>;</span><span>//不对的</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p>举例</p>
</li>
<li>
<p>1.<code>21-26</code>的正则</p>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>reg</span></span><span>=</span><span>/</span><span>^</span><span>2</span><span>[1-6]</span><span>$</span><span>/</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>2.<code>18-75</code>的正则</li>
<li>可以将18-75差分为&lt;18-19&gt;,20-69 70-75</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>reg</span></span><span>=</span><span>/</span><span>^</span><span>(1</span><span>[8-9]</span><span>|</span><span><span>[2-6]</span><span>\d</span></span><span><span>|</span><span>7</span></span><span>[0-5]</span><span>)</span><span>$</span><span>/</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>3.在正则中小括号表示分组</li>
<li>作用:
<ul>
<li>1)改变优先级 先计算括号里面的</li>
<li>2)表示一个小分组 例如:\number ，表示第number个分组匹配的内容</li>
</ul>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>reg</span></span><span>=</span><span>/</span><span>^</span><span>(</span><span>\w</span><span>)(</span><span>\w</span><span><span>{2}</span><span>)</span></span><span>\2\1$</span><span>/</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>reg</span><span>.</span></span><span>test</span><span>(</span><span>"_dcdc_"</span><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/ios%E5%92%8Candroid%20%E6%B5%8F%E8%A7%88%E5%99%A8%E9%80%82%E9%85%8D%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93/</id>
      <title type="text">ios和android 浏览器适配问题总结</title>
      <published>2017-09-03T00:00:00.000Z</published>
      <updated>2017-09-03T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/ios%E5%92%8Candroid%20%E6%B5%8F%E8%A7%88%E5%99%A8%E9%80%82%E9%85%8D%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93/"/>
      <summary type="text">ios和android 浏览器适配问题总结</summary>
      <content type="html"><![CDATA[<section><h2>1.防止手机中网页放大和缩小<a href="#1防止手机中网页放大和缩小"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>meta</span><span> </span><span>name</span><span>=</span><span>"viewport"</span><span> </span><span>content</span><span>=</span><span>"width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0"</span><span> /&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>2.安卓浏览器看背景图片,有些设备会模糊?<a href="#2安卓浏览器看背景图片有些设备会模糊"><span>#</span></a></h2><ul>
<li>用同等比例的图片在PC机上很清楚，但是手机上很模糊，原因是什么呢？
<ul>
<li>
<p>经过研究,发现是devicePixelRatio作怪，因为手机分辨率太小，如果按照分辨率来显示网页，这样字会非常小，所以苹果当初就把iPhone 4的960<em>640分辨率，在网页里只显示了480</em>320，这样devicePixelRatio＝2。现在android比较乱，有1.5的，有2的也有3的。 想让图片在手机里显示更为清晰，必须使用2x的背景图来代替img标签（一般情况都是用2倍）。</p>
</li>
<li>
<p>例如一个div的宽高是100，背景图必须得宽高是200，然后<code>background-size:contain;</code>这样显示出来的图片就比较清晰了。</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>background:url(.</span><span>./images</span><span>/</span><span>icon</span><span>/</span><span>all</span><span>.png</span><span>) </span><span>no-repeat</span><span> </span><span>center</span><span> center;</span></div></div><div><div><div>2</div></div><div><span>-webkit-background-size:50px 50px;</span></div></div><div><div><div>3</div></div><div><span>background-size</span><span>: 50px 50px;</span></div></div><div><div><div>4</div></div><div><span>display:</span><span>inline-block</span><span>;</span></div></div><div><div><div>5</div></div><div><span>width:100%;</span></div></div><div><div><div>6</div></div><div><span>height:50px;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
</ul></section>
<section><h2>3.一些情况下对非可点击元素(如label/span)监听click事件，ios下不会触发<a href="#3一些情况下对非可点击元素如labelspan监听click事件ios下不会触发"><span>#</span></a></h2><ul>
<li>解决方案:css增加cursor;</li>
</ul></section>
<section><h2>4.在ios和andriod中,audio元素和video元素无法自动播放<a href="#4在ios和andriod中audio元素和video元素无法自动播放"><span>#</span></a></h2><ul>
<li>这个不是 BUG，由于自动播放网页中的音频或视频，会给用户带来一些困扰或者不必要的流量消耗，所以苹果系统和安卓系统通常都会禁止自动播放和使用 JS 的触发播放，必须由用户来触发才可以播放。</li>
<li>解决方法思路&lt;先通过用户&gt; touchstart 触碰,触发播放并暂停(音频开始加载,后面用 JS 再操作就没问题了)。</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>document</span><span>.</span></span><span>addEventListener</span><span>(</span><span>'touchstart'</span><span>,</span><span>function</span><span>() {</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>document</span><span>.</span><span>getElementsByTagName</span><span>(</span><span>'audio'</span><span>)[</span><span>0</span><span>].</span><span>play</span><span>();</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>document</span><span>.</span><span>getElementsByTagName</span><span>(</span><span>'audio'</span><span>)[</span><span>0</span><span>].</span><span>pause</span><span>();</span></div></div><div><div><div>4</div></div><div><span>});</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>5.fixed定位缺陷<a href="#5fixed定位缺陷"><span>#</span></a></h2><ul>
<li>ios下fixed元素容易定位出错，软键盘弹出时，影响fixed元素定位, android下fixed表现要比iOS更好，软键盘弹出时，不会影响fixed元素定位 , ios4下不支持position;</li>
<li>解决方案&lt;可用iscroll插件解决这个问题&gt;</li>
</ul></section>
<section><h2>6.Input的placeholder会出现文本位置偏上的情况<a href="#6input的placeholder会出现文本位置偏上的情况"><span>#</span></a></h2><ul>
<li>PC端设置line-height等于height能够对齐，而移动端仍然是偏上</li>
<li>解决方案:设置line-height;</li>
</ul></section>
<section><h2>7.圆角bug<a href="#7圆角bug"><span>#</span></a></h2><ul>
<li>某些Android手机圆角失效</li>
<li>解决方案</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>background-clip</span><span>:</span><span>padding-box</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>8.IOS中input键盘事件keyup、keydown、keypress支持不是很好<a href="#8ios中input键盘事件keyupkeydownkeypress支持不是很好"><span>#</span></a></h2><ul>
<li>问题是这样的，用input search做模糊搜索的时候，在键盘里面输入关键词，会通过ajax后台查询，然后返回数据，然后再对返回的数据进行关键词标红。用input监听键盘keyup事件，在安卓手机浏览器中是可以的，但是在ios手机浏览器中变红很慢，用输入法输入之后，并未立刻响应keyup事件，只有在通过删除之后才能相应！</li>
<li>解决办法&lt;可以用html5的oninput事件去代替keyup&gt;,然后就达到类似keyup的效果！</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>input</span><span> </span><span>type</span><span>=</span><span>"text"</span><span> </span><span>id</span><span>=</span><span>"testInput"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>script</span><span> </span><span>type</span><span>=</span><span>"text/javascript"</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>document</span><span>.</span></span><span>getElementById</span><span>(</span><span>'testInput'</span><span>).</span><span>addEventListener</span><span>(</span><span>'input'</span><span>,</span><span>function</span><span><span>(</span><span>e</span><span>){</span></span></div></div><div><div><div>4</div></div><div><span>    </span><span>var</span><span><span> </span><span>value</span><span> </span></span><span>=</span><span><span> </span><span>e</span><span>.</span></span><span>target</span><span>.</span><span>value</span><span>;</span></div></div><div><div><div>5</div></div><div><span>});</span></div></div><div><div><div>6</div></div><div><span>&lt;/</span><span>script</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>9.部分机型存在type为search的input,自带close按钮样式修改方法;<a href="#9部分机型存在type为search的input自带close按钮样式修改方法"><span>#</span></a></h2><ul>
<li>有些机型的搜索input控件会自带close按钮(一个伪元素)，而通常为了兼容所有浏览器，我们会自己实现一个，此时去掉原生close按钮的方法为:</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>#Search</span><span>::-webkit-search-cancel-button</span><span>{</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>display:</span><span>none</span><span>;</span></div></div><div><div><div>3</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>如果想使用原生close按钮，又想使其符合设计风格，可以对这个伪元素的样式进行修改。</li>
</ul></section>
<section><h2>10.手机浏览器独有的四个事件<a href="#10手机浏览器独有的四个事件"><span>#</span></a></h2><ul>
<li>onTouchmove,ontouchend,ontouchstart,ontouchcancel</li>
</ul></section>
<section><h2>11.为什么要用Zepto?<a href="#11为什么要用zepto"><span>#</span></a></h2><ul>
<li>jquery适用于PC端桌面环境，桌面环境更加复杂，jquery需要考虑的因素非常多，尤其表现在兼容性上面，相对于PC端，移动端的发展都远不及PC端,手机上的带宽永远比不上pc端。pc端下载jquery到本地只需要1~3秒（90+K），但是移动端就慢了很多，2G网络下你会看到一大片空白网页在加载，相信用户第二次就没打开的欲望了。zepto解决了这个问题，只有不到10K的大小，2G网络环境下也毫无压力，表现不逊色于jquery。</li>
</ul></section>
<section><h2>IOS移动端click事件300ms的延迟响应<a href="#ios移动端click事件300ms的延迟响应"><span>#</span></a></h2><ul>
<li>详解地址<code>https://gaodaxiu0406.github.io/2017/07/28/%E7%A7%BB%E5%8A%A8%E7%AB%AFclick300-380ms%E5%BB%B6%E8%BF%9F%E9%97%AE%E9%A2%98/</code>,这是之前做的关于这个问题的详细讲解地址</li>
</ul></section>
<section><h2>点击穿透问题,input、select、a等元素可以被点击和focus<a href="#点击穿透问题inputselecta等元素可以被点击和focus"><span>#</span></a></h2><ul>
<li>这个在特定需求下才会有，因此如果没有类似问题的可以不看。首先需求是浮层操作，在手机上被遮罩的元素依然可以获取focus、click、change)，有两种解决方案：
<ul>
<li>1.是通过层显示以后加入对应的class名控制，截断显示层下方可获取焦点元素的事件获取</li>
<li>2.是通过将可获取焦点元素加入的disabled属性，也可以利用属性加dom锁定的方式（disabled的一种变换方式）</li>
</ul>
</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/css%E5%9F%BA%E7%A1%80,vertical-align/</id>
      <title type="text">vertical-align</title>
      <published>2017-09-01T00:00:00.000Z</published>
      <updated>2017-09-01T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/css%E5%9F%BA%E7%A1%80,vertical-align/"/>
      <summary type="text">css基础,vertical-align</summary>
      <content type="html"><![CDATA[<section><h2>vertical-align<a href="#vertical-align"><span>#</span></a></h2><ul>
<li>改变基线对齐方式
<ul>
<li>vertical-align: top; 顶部对齐</li>
<li>vertical-align: bottom; 底部对齐</li>
<li>vertical-align: middle; 中部对齐</li>
</ul>
</li>
</ul>

<table><thead><tr><th>值</th><th>描述</th></tr></thead><tbody><tr><td>长度</td><td>通过距离升高（正值）或降低（负值）元素。‘0cm’等同于’baseline’</td></tr><tr><td>百分值 – %</td><td>通过距离（相对于1line-height1值的百分大小）升高（正值）或降低（负值）元素。‘0%‘等同于’baseline’</td></tr><tr><td>baseline</td><td>默认。当前元素的基线与父元素的基线对齐。</td></tr><tr><td>sub</td><td>降低元素的基线到父元素合适的下标位置。</td></tr><tr><td>super</td><td>升高元素的基线到父元素合适的上标位置。</td></tr><tr><td>top</td><td>所有平级元素,去找最高(高度最高)元素的顶部进行对齐</td></tr><tr><td>text-top</td><td>把元素的顶端与父元素内容区域的顶端对齐。</td></tr><tr><td>middle</td><td>所有平级元素,去找最高(高度最高)元素的中部进行对齐</td></tr><tr><td>bottom</td><td>所有平级元素,去找最高(高度最高)元素的底部进行对齐</td></tr><tr><td>text-bottom</td><td>把元素的底端与父元素内容区域的底端对齐。</td></tr><tr><td>inherit</td><td>采用父元素相关属性的相同的指定值</td></tr></tbody></table></section>
<section><h2>浏览器支持<a href="#浏览器支持"><span>#</span></a></h2><ul>
<li>所有浏览器都支持 vertical-align 属性。</li>
<li><strong>注释：任何的版本的 Internet Explorer （包括 IE8）都不支持属性值 “inherit”。</strong></li>
</ul><blockquote><p>深入理解line-height与vertical-align推荐地址:<a href="http://www.cnblogs.com/xiaohuochai/p/5271217.html" target="_blank">http://www.cnblogs.com/xiaohuochai/p/5271217.html</a></p></blockquote></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/CSS%E7%9B%92%E5%AD%90%E6%A8%A1%E5%9E%8B(border%E7%94%BB%E4%B8%89%E8%A7%92%E5%BD%A2)%E5%8F%8A%E5%B8%B8%E8%A7%81%E5%85%BC%E5%AE%B9%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/</id>
      <title type="text">CSS盒子模型(border画三角形)及常见兼容问题解决方案</title>
      <published>2017-08-21T00:00:00.000Z</published>
      <updated>2017-08-21T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/CSS%E7%9B%92%E5%AD%90%E6%A8%A1%E5%9E%8B(border%E7%94%BB%E4%B8%89%E8%A7%92%E5%BD%A2)%E5%8F%8A%E5%B8%B8%E8%A7%81%E5%85%BC%E5%AE%B9%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/"/>
      <summary type="text">CSS盒子模型(border画三角形)及常见兼容问题解决方案</summary>
      <content type="html"><![CDATA[<ul>
<li>
<p>每一个元素在html中都是一个盒子,用来装其他盒子或者是内容</p>
</li>
<li>
<p>可以将html页面看做是一个仓库,仓库中从上到下摆了很多箱子,易碎品(盒子和盒子之间要有间距 内容和盒子之间要有填充 盒子本身要有厚度)</p>
</li>
</ul>

<section><h2>宽高属性<a href="#宽高属性"><span>#</span></a></h2><ul>
<li>1.<code>height: 100%;</code>
<ul>
<li>指的是继承父级元素<em>内容</em>的高度</li>
</ul>
</li>
<li>2.<code>width: 100%;</code>
<ul>
<li>指的是继承父级元素<em>内容</em>的宽度</li>
</ul>
</li>
</ul></section>
<section><h2>特性<a href="#特性"><span>#</span></a></h2><ul>
<li>
<p>1.父子关系的时候,在设置margin值的时候,一般只设置上和左,不会设置下和右</p>
</li>
<li>
<p>2.盒子自身的宽度是由左侧边框的宽度+左侧内边距+内容的宽度+右侧内边距+右侧边框的宽度:</p>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>ALLwidth=(</span><span>border-left-width</span><span>)+(</span><span>padding-left</span><span>)+</span><span>width</span><span>+</span><span>(</span><span>padding-right</span><span>)+(</span><span>border-right-width</span><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>padding和margin<a href="#padding和margin"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>padding:1px 2px 3px 4px;</span><span>//</span><span>上 右 下 左</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>//</span><span>top right bottom left</span></div></div><div><div><div>3</div></div><div><span>padding:1px 2px 3px;</span><span>//</span><span>上 左右 下</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>//</span><span>top left</span><span>/</span><span>right bottom</span></div></div><div><div><div>5</div></div><div><span>padding:1px 2px;</span><span>//</span><span>上下 左右</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>//</span><span>top</span><span>/</span><span>bottom left</span><span>/</span><span>right</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>border<a href="#border"><span>#</span></a></h2><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>border-top-width</span><span>: 1px;</span><span> //</span><span>上边框的宽度</span></div></div><div><div><div>2</div></div><div><span>border-top-style</span><span>: solid;</span><span> //</span><span>上边框的样式</span></div></div><div><div><div>3</div></div><div><span>border-top-color</span><span>: red;</span><span> //</span><span>上边框的颜色</span></div></div><div><div><div>4</div></div><div><span>border-color</span><span>:red green yellow pink;</span><span>//</span><span>上 右 下 左</span></div></div><div><div><div>5</div></div><div><span>//</span><span>上边框红色 右边框绿色 下边框黄色 左边框粉色</span></div></div><div><div><div>6</div></div><div><span>border-color</span><span>:red green yellow;</span><span>//</span><span>上 左右 下</span></div></div><div><div><div>7</div></div><div><span>//</span><span>上边框红色 左右边框绿色 下边框黄色</span></div></div><div><div><div>8</div></div><div><span>border-color</span><span>:red green;</span><span>//</span><span>上下 左右</span></div></div><div><div><div>9</div></div><div><span>//</span><span>上下边框红色 左右边框绿色</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>//</span><span>合并缩写设置:</span></div></div><div><div><div>12</div></div><div><span>border-top</span><span>:1px solid pink;</span><span>//</span><span>上边框1px 实线 粉色</span></div></div><div><div><div>13</div></div><div><span>border-bottom</span><span>:1px solid pink;</span></div></div><div><div><div>14</div></div><div><span>border-right</span><span>:1px solid pink;</span></div></div><div><div><div>15</div></div><div><span>border-left</span><span>:1px solid pink;</span></div></div><div><div><div>16</div></div><div><span>border:1px solid pink;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><section><h3>利用border画三角形<a href="#利用border画三角形"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>    </span><span>div</span><span>{</span></div></div><div><div><div>3</div></div><div><span><span>        </span></span><span>border:</span><span><span>100</span><span>px</span></span><span><span> </span><span>solid</span></span><span>/* red*/</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>/*border-color: yellow red blue pink;*/</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>border-color: </span><span>black</span><span><span> </span><span>transparent</span><span> </span><span>transparent</span><span>;</span></span></div></div><div><div><div>6</div></div><div><span>        </span><span>/*transparent透明的*/</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>width: </span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p></p><figure><img alt="Alt 伪元素选择器" loading="lazy" width="1308" height="416" src="/_astro/%E4%B8%89%E8%A7%92%E5%BD%A2.-nbn9zIh_Z248iyp.webp" /><figcaption>Alt 伪元素选择器</figcaption></figure>“利用border画三角形”<p></p></section></section>
<section><h2>常见问题解决方案<a href="#常见问题解决方案"><span>#</span></a></h2><section><h3>1.margin支持负值<a href="#1margin支持负值"><span>#</span></a></h3><ul>
<li>margin-left和margin-top为负值的时候 跑出浏览器的部分会被吃掉,不会撑开整个页面.</li>
</ul></section><section><h3>2.margin-top的传递问题<a href="#2margin-top的传递问题"><span>#</span></a></h3><ul>
<li>如果父级没有padding-top或border-top值得时候,子元素设置margin-top值,会将这个值传递给父元素</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>    </span><span>html</span><span>,</span><span>body</span><span>,</span><span>div</span><span>{</span></div></div><div><div><div>3</div></div><div><span><span>        </span></span><span>padding: </span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>margin: </span><span>0</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>background: </span><span>blue</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>    </span><span>.box3</span><span>{</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>width: </span><span><span>300</span><span>px</span></span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>height: </span><span><span>300</span><span>px</span></span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>background-color: </span><span>green</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span>    </span><span>.parent</span><span>{</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>width: </span><span><span>200</span><span>px</span></span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>height: </span><span><span>200</span><span>px</span></span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>background-color: </span><span>red</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>    </span><span>.son</span><span>{</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>width: </span><span><span>100</span><span>px</span></span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>height: </span><span><span>100</span><span>px</span></span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>background-color: </span><span>yellow</span><span>;</span></div></div><div><div><div>21</div></div><div><span>        </span><span>/*margin-top: 20px;*/</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div><div><div><div>24</div></div><div><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"box3"</span><span>&gt;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"parent"</span><span>&gt;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"son"</span><span>&gt;&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>28</div></div><div><span>&lt;/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><ul>
<li>此时&lt;在ie5&gt;~11,以及谷歌浏览器中的显示都是一致的,如下图(图片以IE浏览器截图为主)
<figure><img alt="Alt margin-top传递问题" loading="lazy" width="1401" height="1204" src="/_astro/margin-top%E4%BC%A0%E9%80%92%E9%97%AE%E9%A2%981.y8s8yU9h_Z2bEYIG.webp" /><figcaption>Alt margin-top传递问题</figcaption></figure></li>
</ul><p></p><figure><img alt="Alt margin-top传递问题" loading="lazy" width="1417" height="1106" src="/_astro/margin-top%E4%BC%A0%E9%80%92%E9%97%AE%E9%A2%982._IsEA6v0_ZeLkyj.webp" /><figcaption>Alt margin-top传递问题</figcaption></figure><p></p><ul>
<li>
<p>当给子元素.son设置margin-top&lt;20px&gt;;值后</p>
<ul>
<li>
<p>IE5~7中并没有出现margin值的传递问题(IE7同IE5,这里就没有截图了)
</p><figure><img alt="Alt margin-top传递问题" loading="lazy" width="1387" height="1214" src="/_astro/margin-top%E4%BC%A0%E9%80%92%E9%97%AE%E9%A2%983.CR6TF2Oe_Z1NSEuj.webp" /><figcaption>Alt margin-top传递问题</figcaption></figure><p></p>
</li>
<li>
<p>IE8~11以及谷歌中均出现margin-top值传递问题
</p><figure><img alt="Alt margin-top传递问题" loading="lazy" width="1342" height="1216" src="/_astro/margin-top%E4%BC%A0%E9%80%92%E9%97%AE%E9%A2%984.BcO7b3kR_1QrE4e.webp" /><figcaption>Alt margin-top传递问题</figcaption></figure><p></p>
</li>
</ul>
</li>
</ul><section><h4>解决方法<a href="#解决方法"><span>#</span></a></h4><section><h5>方法一) 给父级元素一个属性,<code>overflow:hidden;</code><a href="#方法一-给父级元素一个属性overflowhidden"><span>#</span></a></h5><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>- 弊端:</span></div></div><div><div><div>2</div></div><div><span>- `overflow:hidden;`有溢出隐藏的含义,若给父级元素添加这个属性,子级元素超出父级盒子部分将不能显示,例如子级元素的阴影</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h5>方法二) 将子级元素的<code>margin-top</code>值去掉,改成父级元素的<code>padding-top</code>值(建议使用这个方法)<a href="#方法二-将子级元素的margin-top值去掉改成父级元素的padding-top值建议使用这个方法"><span>#</span></a></h5><ul>
<li>但是此方法也有弊端:
<ul>
<li>IE5中父级盒子的高度并没有改变
<figure><img alt="Alt margin-top传递问题" loading="lazy" width="1318" height="1230" src="/_astro/margin-top%E4%BC%A0%E9%80%92%E9%97%AE%E9%A2%985.CZTfMicu_1ejuXC.webp" /><figcaption>Alt margin-top传递问题</figcaption></figure></li>
<li>IE7~11及谷歌浏览器中,父级盒子的高度都增加了20px;
<figure><img alt="Alt margin-top传递问题" loading="lazy" width="1001" height="884" src="/_astro/margin-top%E4%BC%A0%E9%80%92%E9%97%AE%E9%A2%986.DNx6dFR5_Z11wIrd.webp" /><figcaption>Alt margin-top传递问题</figcaption></figure></li>
</ul>
</li>
</ul></section><section><h5>方法三) 给父级元素上添加一个透明的<code>border</code>处理<a href="#方法三-给父级元素上添加一个透明的border处理"><span>#</span></a></h5><ul>
<li>弊端:
<ul>
<li>在IE5~7中确实解决了问题
<figure><img alt="Alt margin-top传递问题" loading="lazy" width="1384" height="1213" src="/_astro/margin-top%E4%BC%A0%E9%80%92%E9%97%AE%E9%A2%987.CbjSWK2I_1mo9B6.webp" /><figcaption>Alt margin-top传递问题</figcaption></figure></li>
<li>但是在IE8~11及谷歌浏览器中仍然存在margin-top的传递问题
<figure><img alt="Alt margin-top传递问题" loading="lazy" width="1410" height="1235" src="/_astro/margin-top%E4%BC%A0%E9%80%92%E9%97%AE%E9%A2%988.DfqgronS_Z2qFWUw.webp" /><figcaption>Alt margin-top传递问题</figcaption></figure></li>
</ul>
</li>
</ul></section></section></section><section><h3>3.<code>margin-left</code>/<code>margin-right</code> 在ie6中会双倍<a href="#3margin-leftmargin-right-在ie6中会双倍"><span>#</span></a></h3><ul>
<li>当元素浮动的时候,有左右的外边距,有时候ie6会出现双倍边距的问题</li>
</ul><section><h4>解决方案&lt;解决双边距这个方法叫css&gt; hack<a href="#解决方案-hack"><span>#</span></a></h4><section><h5>方案一). 给这个元素添加<code>overflow:hidden;</code><a href="#方案一-给这个元素添加overflowhidden"><span>#</span></a></h5></section><section><h5>方案二). 写ie6的兼容方式,例如:<a href="#方案二-写ie6的兼容方式例如"><span>#</span></a></h5><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>div</span><span>{</span></div></div><div><div><div>2</div></div><div><span><span>float:</span><span>left</span><span>;</span></span></div></div><div><div><div>3</div></div><div><span>margin-left:</span><span><span>10</span><span>px</span></span><span> </span><span>!important</span><span>;</span></div></div><div><div><div>4</div></div><div><span>_margin-left:</span><span><span>5</span><span>px</span></span><span>;</span></div></div><div><div><div>5</div></div><div><span>&lt;!-- 当浏览器是ie6的时候 读取_margin-left:</span><span><span>5</span><span>px</span></span><span>;这句话 --&gt;</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>注意:<strong>!important</strong>出现在css里面的时候,这个属性会覆盖掉所有之前设置的样式<strong>权重最大,比id选择器还大</strong></li>
</ul></section></section></section></section>
<section><h2>overflow盒子内容多余部分的处理方式<a href="#overflow盒子内容多余部分的处理方式"><span>#</span></a></h2><ul>
<li><code>overflow:hidden;</code> 直接将多余隐藏</li>
<li><code>overflow:auto;</code> 如果有多余部分出现滚动条,如果没有就不出现</li>
<li><code>overflow:scroll;</code> 不论是否有多余部分,都会出现滚动条</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/%E4%B8%BAHEXO%E5%8D%9A%E5%AE%A2%E4%B8%AD%E6%AF%8F%E7%AF%87%E6%96%87%E7%AB%A0%E7%9A%84%E6%B5%8F%E8%A7%88%E9%87%8F%E7%BB%9F%E8%AE%A1/</id>
      <title type="text">为HEXO博客中每篇文章的浏览量统计</title>
      <published>2017-08-21T00:00:00.000Z</published>
      <updated>2017-08-21T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/%E4%B8%BAHEXO%E5%8D%9A%E5%AE%A2%E4%B8%AD%E6%AF%8F%E7%AF%87%E6%96%87%E7%AB%A0%E7%9A%84%E6%B5%8F%E8%A7%88%E9%87%8F%E7%BB%9F%E8%AE%A1/"/>
      <summary type="text">为HEXO博客中每篇文章的浏览量统计</summary>
      <content type="html"><![CDATA[<ul>
<li>
<p>静态网站建站现在有很多快速的技术和平台，但静态是优点也有缺点，由于是静态的，一些动态的内容如评论、计数等等模块就需要借助外来平台，评论有”多说”，计数有”不蒜”！（多说即将关闭，不蒜子还活着涅，这是程序员对程序员的承诺。）</p>
</li>
<li>
<p>“不蒜子”与百度统计谷歌分析等有区别：“不蒜子”可直接将访问次数显示在您在网页上（也可不显示）；对于已经上线一段时间的网站，“不蒜子”允许您初始化首次数据。。</p>
</li>
<li>
<p>普通用户只需两步走：一行脚本+一行标签，搞定一切。追求极致的用户可以进行任意DIY。</p>
</li>
</ul>

<section><h2>一、安装脚本（必选）<a href="#一安装脚本必选"><span>#</span></a></h2><p>要使用不蒜子必须在页面中引入busuanzi.js，目前最新版如下。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>script</span><span> </span><span>async</span><span> </span><span>src</span><span>=</span><span>"//dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;/</span><span>script</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><code>不蒜子</code>可以给任何类型的个人站点使用，如果你是用的hexo，打开themes/你的主题/layout/_partial/footer.ejs添加上述脚本即可，当然你也可以添加到 header 中。</p></section>
<section><h2>二、安装标签（可选）<a href="#二安装标签可选"><span>#</span></a></h2><ul>
<li>只需要复制相应的html标签到你的网站要显示访问量的位置即可。您可以随意更改不蒜子标签为自己喜欢的显示效果，内容参考第三部分扩展开发。根据你要显示内容的不同，这分几种情况。</li>
</ul><section><h3>1、显示站点总访问量<a href="#1显示站点总访问量"><span>#</span></a></h3><blockquote><p>要显示站点总访问量，复制以下代码添加到你需要显示的位置。有两种算法可选：</p></blockquote><ul>
<li>算法a：pv的方式，单个用户连续点击n篇文章，记录n次访问量。</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>span</span><span> </span><span>id</span><span>=</span><span>"busuanzi_container_site_pv"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>本站总访问量&lt;</span><span>span</span><span> </span><span>id</span><span>=</span><span>"busuanzi_value_site_pv"</span><span>&gt;&lt;/</span><span>span</span><span>&gt;次</span></div></div><div><div><div>3</div></div><div><span>&lt;/</span><span>span</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>算法b：uv的方式，单个用户连续点击n篇文章，只记录1次访客数。</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>span</span><span> </span><span>id</span><span>=</span><span>"busuanzi_container_site_uv"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>本站访客数&lt;</span><span>span</span><span> </span><span>id</span><span>=</span><span>"busuanzi_value_site_uv"</span><span>&gt;&lt;/</span><span>span</span><span>&gt;人次</span></div></div><div><div><div>3</div></div><div><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span>如果你是用的hexo，打开themes/你的主题/layout/_partial/footer.ejs添加即可。</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2、显示单页面访问量<a href="#2显示单页面访问量"><span>#</span></a></h3><ul>
<li>
<p>要显示每篇文章的访问量，复制以下代码添加到你需要显示的位置。</p>
</li>
<li>
<p>算法：pv的方式，单个用户点击1篇文章，本篇文章记录1次阅读量。</p>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>span</span><span> </span><span>id</span><span>=</span><span>"busuanzi_container_page_pv"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>本文总阅读量&lt;</span><span>span</span><span> </span><span>id</span><span>=</span><span>"busuanzi_value_page_pv"</span><span>&gt;&lt;/</span><span>span</span><span>&gt;次</span></div></div><div><div><div>3</div></div><div><span>&lt;/</span><span>span</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>代码中文字是可以修改的，只要保留id正确即可。</p><p><strong>注意</strong>：<code>不蒜子</code>为保持极简，暂不支持在站点文章摘要列表中（如首页）逐个显示每篇文章的阅读次数，如果您非常需要这一功能，可以留言。根据需要程度再考虑开发相应的功能。</p></section><section><h3>3、显示站点总访问量和单页面访问量<a href="#3显示站点总访问量和单页面访问量"><span>#</span></a></h3><p>你懂的吧，上面两种标签代码都安装。</p></section><section><h3>4、只计数不显示<a href="#4只计数不显示"><span>#</span></a></h3><ul>
<li>只安装脚本代码，不安装标签代码。</li>
</ul><blockquote><p>至此，<code>不蒜子</code>已经可以正常运行，如果你还要自定义一些内容或有疑问，请继续阅读。</p></blockquote></section></section>
<section><h2>附录：扩展开发（自定义）<a href="#附录扩展开发自定义"><span>#</span></a></h2><ul>
<li>
<p><code>不蒜子</code>之所以称为极客的算子，正是因为<code>不蒜子</code>自身只提供标签+数字，至于显示的style和css动画效果，任你发挥。</p>
</li>
<li>
<p><code>busuanzi_value_site_pv</code>的作用是异步回填访问数，这个id一定要正确。</p>
</li>
<li>
<p><code>busuanzi_container_site_pv</code>的作用是为防止计数服务访问出错或超时（3秒）的情况下，使整个标签自动隐藏显示，带来更好的体验。这个id可以省略。</p>
</li>
</ul><section><h3>极简模式<a href="#极简模式"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>本站总访问量&lt;</span><span>span</span><span> </span><span>id</span><span>=</span><span>"busuanzi_value_site_pv"</span><span>&gt;&lt;/</span><span>span</span><span>&gt;次</span></div></div><div><div><div>2</div></div><div><span>本站访客数&lt;</span><span>span</span><span> </span><span>id</span><span>=</span><span>"busuanzi_value_site_uv"</span><span>&gt;&lt;/</span><span>span</span><span>&gt;人次</span></div></div><div><div><div>3</div></div><div><span>本文总阅读量&lt;</span><span>span</span><span> </span><span>id</span><span>=</span><span>"busuanzi_value_page_pv"</span><span>&gt;&lt;/</span><span>span</span><span>&gt;次</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>个性化一下<a href="#个性化一下"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Total &lt;</span><span>span</span><span> </span><span>id</span><span>=</span><span>"busuanzi_value_site_pv"</span><span>&gt;&lt;/</span><span>span</span><span>&gt; views.</span></div></div><div><div><div>2</div></div><div><span>您是xxx的第&lt;</span><span>span</span><span> </span><span>id</span><span>=</span><span>"busuanzi_value_site_uv"</span><span>&gt;&lt;/</span><span>span</span><span>&gt;个小伙伴</span></div></div><div><div><div>3</div></div><div><span>&lt;</span><span>span</span><span> </span><span>id</span><span>=</span><span>"busuanzi_value_page_pv"</span><span>&gt;&lt;/</span><span>span</span><span>&gt; Hits</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h2>问题及解答<a href="#问题及解答"><span>#</span></a></h2><ul>
<li>
<p>1、我只要统计不显示？</p>
<ul>
<li>只引入busuanzi.js，不引入显示标签即可。</li>
</ul>
</li>
<li>
<p>2、你的标签太丑了，我想美化一下可以么？</p>
<ul>
<li>可以的，您可以用自己站点的css进行控制，只要内层span的id正确以便回填访问次数即可，甚至标签都可以不是span。</li>
</ul>
</li>
<li>
<p>3、中文字体太丑了，我的主题不适合？</p>
<ul>
<li>您可以将本站总访问量xxx次改成view xxx times等英文以获得更和谐的显示效果。</li>
</ul>
</li>
<li>
<p>4、在访问量数据未取回来之前，我不想让页面显示为诸如“本站总访问量 次”，显得太low，怎么办？</p>
<ul>
<li>只需要如下css，不蒜子执行完毕会自动将标签显示出来，其他以此类推：</li>
</ul>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>span</span><span> </span><span>id</span><span>=</span><span>"busuanzi_container_site_pv"</span><span> </span><span>style</span><span>=</span><span>'</span><span>display:none</span><span>'</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>本站总访问量&lt;</span><span>span</span><span> </span><span>id</span><span>=</span><span>"busuanzi_value_site_pv"</span><span>&gt;&lt;/</span><span>span</span><span>&gt;次</span></div></div><div><div><div>3</div></div><div><span>&lt;/</span><span>span</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p>原文地址:<a href="http://ibruce.info/2015/04/04/busuanzi/" target="_blank">http://ibruce.info/2015/04/04/busuanzi/</a>
参考链接:<a href="https://www.zhihu.com/question/33919028" target="_blank">https://www.zhihu.com/question/33919028</a></p></blockquote></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/box-shadow%E5%92%8Ctext-shadow/</id>
      <title type="text">box-shadow和text-shadow</title>
      <published>2017-08-20T00:00:00.000Z</published>
      <updated>2017-08-20T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/box-shadow%E5%92%8Ctext-shadow/"/>
      <summary type="text">box-shadow和text-shadow</summary>
      <content type="html"><![CDATA[<section><h2><code>box-shadow</code> 属性向框添加一个或多个阴影<a href="#box-shadow-属性向框添加一个或多个阴影"><span>#</span></a></h2><ul>
<li>相关小项目地址:<a href="https://github.com/gaodaxiu0406/HEXOcase(CSS/%E5%B0%8F%E9%A1%B9%E7%9B%AE%E7%BB%83%E4%B9%A0)" target="_blank">https://github.com/gaodaxiu0406/HEXOcase(CSS/小项目练习)</a></li>
</ul><section><h3>语法<a href="#语法"><span>#</span></a></h3><section><h4>CSS语法<a href="#css语法"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>box-shadow</span><span>: </span><span>h-shadow</span><span> </span><span>v-shadow</span><span> blur spread color inset;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h5>注释<a href="#注释"><span>#</span></a></h5><ul>
<li><code>box-shadow</code> 向框添加一个或多个阴影。该属性是由逗号分隔的阴影列表，每个阴影由 2-4 个长度值、可选的颜色值以及可选的 <code>inset</code> 关键词来规定。省略长度的值是 0。</li>
</ul>

<table><thead><tr><th>值</th><th>描述</th></tr></thead><tbody><tr><td>h-shadow</td><td>必需。水平阴影的位置。允许负值。</td></tr><tr><td>v-shadow</td><td>必需。垂直阴影的位置。允许负值。</td></tr><tr><td>blur</td><td>可选。模糊距离。</td></tr><tr><td>spread</td><td>可选。阴影的尺寸。</td></tr><tr><td>color</td><td>可选。阴影的颜色。请参阅 CSS 颜色值。</td></tr><tr><td>inset</td><td>可选。将外部阴影 (outset) 改为内部阴影。</td></tr></tbody></table><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>box-shadow</span><span>: 10px 20px 30px 40px </span><span>#000</span><span> inset;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h4>JavaScript语法<a href="#javascript语法"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>object</span><span>.</span></span><span>style</span><span>.</span><span>boxShadow</span><span>=</span><span>"10px 10px 5px #888888"</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section></section>
<section><h2><code>text-shadow</code><a href="#text-shadow"><span>#</span></a></h2><section><h3>语法<a href="#语法-1"><span>#</span></a></h3><section><h4>CSS语法<a href="#css语法-1"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>text-shadow</span><span>: </span><span>h-shadow</span><span> </span><span>v-shadow</span><span> blur color;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h5>注释<a href="#注释-1"><span>#</span></a></h5><ul>
<li><code>text-shadow</code> 属性向文本添加一个或多个阴影。该属性是逗号分隔的阴影列表，每个阴影有两个或三个长度值和一个可选的颜色值进行规定。省略的长度是 0。</li>
</ul>

<table><thead><tr><th>值</th><th>描述</th></tr></thead><tbody><tr><td>h-shadow</td><td>必需。水平阴影的位置。允许负值。</td></tr><tr><td>v-shadow</td><td>必需。垂直阴影的位置。允许负值。</td></tr><tr><td>blur</td><td>可选。模糊的距离。</td></tr><tr><td>color</td><td>可选。阴影的颜色。参阅 CSS 颜色值。</td></tr></tbody></table><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>text-shadow</span><span>: 10px 20px 30px </span><span>#000</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/CSS%E4%B8%AD%E7%9A%84display/</id>
      <title type="text">CSS中的display</title>
      <published>2017-08-20T00:00:00.000Z</published>
      <updated>2017-08-20T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/CSS%E4%B8%AD%E7%9A%84display/"/>
      <summary type="text">CSS中的display</summary>
      <content type="html"><![CDATA[<ul>
<li>根据这个属性可以将元素分成不同的类型,也会显示出不同的状态,例如属性值为block的时候,这个元素会独占一行,如果属性值为inline的时候,所有这个属性值得元素都会在一行显示,属性值为none,元素会在页面上消失.</li>
<li>所有元素都有天生自带的display属性和属性值,叫做内置属性</li>
</ul>

<section><h2>display; 块级元素(块状元素)<a href="#display-块级元素块状元素"><span>#</span></a></h2><blockquote><p>　特点:</p></blockquote><ul>
<li>独占一行,在所在父元素内依次向下排列,从左上角开始</li>
<li>宽度在不设置的情况下,宽度继承父级元素内容的宽,高度由本身内容决定</li>
<li>可以直接设置盒子模型的所有属性(width,height,padding,border,margin)</li>
<li>可以嵌套其他元素(p,dt,h1-h6不能嵌套块级)
<ul>
<li>dt/p 不能嵌套其他块级元素,可以嵌套行内元素等</li>
</ul>
</li>
<li>永远会在父级盒子的左上角开始排布,从上到下排.</li>
</ul><blockquote><p>人为设置的样式要比自带的样式权重高
块级元素这些特点,我们将其称作<strong>BFC(Block Fomatting Context</strong>—&gt;块级盒子在上下文中的渲染模式)</p></blockquote></section>
<section><h2>display; 行内元素<a href="#display-行内元素"><span>#</span></a></h2><blockquote><p>　特点:</p></blockquote><ul>
<li>在一行显示</li>
<li>不能设置宽度 高度</li>
<li>padding margin的上下值设置不生效,左右值生效</li>
<li>默认宽度高度是本身内容的宽高</li>
<li>几个行内元素默认的垂直方向的对齐方式是基线对齐</li>
<li>在编辑代码时,如果行内元素之间有<strong>回车或者空格</strong>,那么在页面显示的时候,就会默认有间隙()</li>
<li><strong>将父级的font-size设置为0,可以解决这个问题</strong>.</li>
<li><strong>行内元素不能嵌套块级元素</strong></li>
</ul></section>
<section><h2>display; 行内块级元素<a href="#display-行内块级元素"><span>#</span></a></h2><blockquote><p>特点:</p></blockquote><ul>
<li>在一行显示</li>
<li>可以直接设置宽度高度padding、margin值</li>
<li>默认宽度高度是本身内容的宽高</li>
<li>几个行内元素默认的垂直方向对齐方式是基线对齐</li>
<li>在编辑代码时,如果行内元素之间有回车或者空格,那么在页面显示的时候,就会默认有间隙</li>
<li>将父级的font-size设置为0,可以解决这个问题.</li>
<li>行内元素不能嵌套块级元素</li>
</ul></section>
<section><h2>vertical-align改变行内元素和行内块级元素的基线对其方式<a href="#vertical-align改变行内元素和行内块级元素的基线对其方式"><span>#</span></a></h2>

<table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td>top</td><td>所有平级元素,去找最高(高度最高)元素的顶部进行对齐</td></tr><tr><td>bottom</td><td>所有平级元素,去找最高(高度最高)元素的底部进行对齐</td></tr><tr><td>middle</td><td>所有平级元素,去找最高(高度最高)元素的中部进行对齐</td></tr><tr><td>length(数值)</td><td>px 或 %</td></tr></tbody></table><blockquote><p>　改变对齐方式的时候,所有元素都要添加vertical-align这个属性</p></blockquote></section>
<section><h2>display; 将这个元素在页面上隐藏起来<a href="#display-将这个元素在页面上隐藏起来"><span>#</span></a></h2><blockquote><p>如何再让设置display;的元素显示出来?</p></blockquote><ul>
<li>将none用其他的属性替换
<ul>
<li>例如&lt;重新设置display属性为&gt;==&gt;display;</li>
</ul>
</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/%E5%85%B3%E4%BA%8Epng24%E6%A0%BC%E5%BC%8F%E7%9A%84%E5%9B%BE%E7%89%87%E8%83%8C%E6%99%AF%E5%9C%A8IE6%E4%B8%8B%E6%98%BE%E7%A4%BA%E4%B8%8D%E9%80%8F%E6%98%8E%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/</id>
      <title type="text">关于png24格式的图片背景在IE6下显示不透明的解决方法</title>
      <published>2017-08-01T00:00:00.000Z</published>
      <updated>2017-08-01T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/%E5%85%B3%E4%BA%8Epng24%E6%A0%BC%E5%BC%8F%E7%9A%84%E5%9B%BE%E7%89%87%E8%83%8C%E6%99%AF%E5%9C%A8IE6%E4%B8%8B%E6%98%BE%E7%A4%BA%E4%B8%8D%E9%80%8F%E6%98%8E%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/"/>
      <summary type="text">关于png24格式的图片背景在IE6下显示不透明的解决方法,ie兼容性相关</summary>
      <content type="html"><![CDATA[<blockquote><p>图片透明，锯齿问题是重构人员很头疼的问题:<code>png8</code>格式的透明背景图片，会让浏览器在先显示的过程中图片边缘会有一些锯齿情况，<code>png24</code>可以解决这些锯齿问题，但是<code>ie6</code>不支持<code>png24</code>透明</p></blockquote>

<section><h2>利用ie6的<code>hack</code>问题有两种解决的办法<a href="#利用ie6的hack问题有两种解决的办法"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"pwdTipsBg"</span><span>&gt;&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"pwdTips"</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>&lt;</span><span>span</span><span> </span><span>class</span><span>=</span><span>"closeBtn"</span><span>&gt;&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>&lt;</span><span>i</span><span> </span><span>class</span><span>=</span><span>"pwdTipsIcon"</span><span>&gt;&lt;/</span><span>i</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>验证码错误，请填写最新获取的验证码！</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>&lt;/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>1.利用ie6的<code>hack</code>问题，用两种格式的图片来表示；一种其他浏览器用<code>png24</code>格式的图片显示，<code>ie6</code>用<code>png8</code>格式的显示<a href="#1利用ie6的hack问题用两种格式的图片来表示一种其他浏览器用png24格式的图片显示ie6用png8格式的显示"><span>#</span></a></h3><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>.pwdTipsBg</span><span>{</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>height:</span><span><span>100</span><span>%</span></span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>background:</span><span>#</span><span>000</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>opacity:</span><span>0.5</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>position: </span><span>absolute</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>left:</span><span>0</span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>top:</span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>z-index:</span><span>1001</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>filter:  </span><span>alpha</span><span>(opacity=</span><span>50</span><span>);</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>width:</span><span><span>100</span><span>%</span></span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>zoom:</span><span>1</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span>.pwdTips</span><span>{</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>position:</span><span>absolute</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>left:</span><span><span>40</span><span>%</span></span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>top:</span><span><span>40</span><span>%</span></span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>z-index:</span><span>1009</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>width:</span><span><span>285</span><span>px</span></span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>background:</span><span>#</span><span>ececec</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>height:</span><span><span>55</span><span>px</span></span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>padding:</span><span><span>45</span><span>px</span></span><span> </span><span><span>20</span><span>px</span></span><span> </span><span><span>10</span><span>px</span></span><span> </span><span><span>80</span><span>px</span></span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>.pwdTips</span><span> </span><span>i</span><span>{</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>position:</span><span>absolute</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>left:</span><span><span>40</span><span>px</span></span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>top:</span><span><span>40</span><span>px</span></span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>background-position:</span><span><span>-152</span><span>px</span></span><span> </span><span><span>-68</span><span>px</span></span><span>; width:</span><span><span>26</span><span>px</span></span><span>;       height:</span><span><span>26</span><span>px</span></span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>.pwdTips</span><span> </span><span>span</span><span>{</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>position:</span><span>absolute</span><span>;</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>top:</span><span><span>-10</span><span>px</span></span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>right:</span><span><span>-15</span><span>px</span></span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>width:</span><span><span>33</span><span>px</span></span><span>;</span></div></div><div><div><div>35</div></div><div><span><span>    </span></span><span>height:</span><span><span>33</span><span>px</span></span><span>;</span></div></div><div><div><div>36</div></div><div><span><span>    </span></span><span>background:</span><span>url</span><span><span>(</span><span>closebtn.png</span><span>) </span><span>no-repeat</span><span> </span></span><span>0</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>37</div></div><div><span><span>    </span></span><span>_background:</span><span>url</span><span><span>(</span><span>scsprites.png</span><span>) </span><span>no-repeat</span><span> </span></span><span><span>-119</span><span>px</span></span><span> </span><span><span>-63</span><span>px</span></span><span>;</span></div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>cursor:</span><span>pointer</span><span>;</span></div></div><div><div><div>39</div></div><div><span><span>    </span></span><span>display:</span><span>block</span><span>;</span></div></div><div><div><div>40</div></div><div><span><span>    </span></span><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>2.利用<code>filter</code>滤镜解决图片问题<a href="#2利用filter滤镜解决图片问题"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>.pwdTips</span><span> </span><span>span</span><span>{</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>position:</span><span>absolute</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>top:</span><span><span>-10</span><span>px</span></span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>right:</span><span><span>-15</span><span>px</span></span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>width:</span><span><span>33</span><span>px</span></span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>height:</span><span><span>33</span><span>px</span></span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>background:</span><span>url</span><span><span>(</span><span>closebtn.png</span><span>) </span><span>no-repeat</span><span> </span></span><span>0</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>_background:</span><span>none</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=</span><span>"css/safecenter/closebtn.png"</span><span>);</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>cursor:</span><span>pointer</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>display:</span><span>block</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p>1、书写正常的CSS代码，通过background导入图片，这样所有的浏览器均使用了此PNG图片；</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>background:url(closebtn</span><span>.png</span><span>) </span><span>no-repeat</span><span> 0 0;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>2、通过滤镜对引入图片，滤镜引入图片的时候是相对于HTML文件，而不是相对于<code>CSS</code>文件，语法如下：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>filter</span><span>:progid:DXImageTransform</span><span>.Microsoft</span><span>.AlphaImageLoader(src="css</span><span>/</span><span>safecenter</span><span>/</span><span>closebtn.png"</span><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul><p>代码写到这里，我们放到<code>IE6</code>下测试后发现<code>IE6</code>还是没有透明，因为我们虽然设置了滤镜引入图片，但是<code>background</code>也同样加载了此图片，又因为<code>background</code>的图层比滤镜设置的高，所以才没有显示出来。所以最终的代码设置为：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>pwdTips </span><span>span</span><span>{</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>position:</span><span>absolute</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>top:</span><span><span>-10</span><span>px</span></span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>right:</span><span><span>-15</span><span>px</span></span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>width:</span><span><span>33</span><span>px</span></span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>height:</span><span><span>33</span><span>px</span></span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>background:</span><span>url</span><span><span>(</span><span>closebtn.png</span><span>) </span><span>no-repeat</span><span> </span></span><span>0</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>_background:</span><span>none</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=</span><span>"css/safecenter/closebtn.png"</span><span>);</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>cursor:</span><span>pointer</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>display:</span><span>block</span><span>;</span></div></div><div><div><div>12</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h4>优点<a href="#优点"><span>#</span></a></h4><ul>
<li>1、绿色无插件；</li>
<li>2、效率高，速度快；</li>
<li>3、网速慢的时候，不会出现先灰底再透明的情况，支持远程图片；</li>
<li>4、支持Hover等伪类，但是得使用两张图片，网速慢的情况下，会导致第二张图片暂时无法显示，因为还没有完全载入；</li>
</ul></section><section><h4>缺点<a href="#缺点"><span>#</span></a></h4><ul>
<li>1、不支持平铺，虽然filter有sizingMethod=“scale”, 拉伸缩放模式，但是图片会变形，如果单纯的颜色或简单的渐变色还能横向平铺；</li>
<li>2、不支持Img标签；</li>
<li>3、不支持CSS Sprite；</li>
</ul><blockquote><p>看到很多人的<code>logo</code>有在<code>ie6</code>下面显示显示不透明，有一层淡蓝色的底，其它浏览器下都是好，这个是因为用了<code>png24</code>格式的图片。</p></blockquote><p>那我们在制作图标的时候应该注意什么呢？（格式，透明，毛边）</p></section></section></section>
<section><h2>如何把<code>png24</code>透明<code>logo</code>转换<code>png8</code>格式<a href="#如何把png24透明logo转换png8格式"><span>#</span></a></h2><ul>
<li>
<ol>
<li>用<code>photoshop</code>软件打开 你要处理的格式为<code>png24</code>的<code>logo</code></li>
</ol>
</li>
<li>
<ol>
<li><code>photoshop</code>菜单&lt;文件&gt;—存储为<code>web</code>和设备所用格式（或者快捷键 <code>Alt+Shift+Ctrl+S</code>）</li>
</ol>
</li>
<li>
<ol>
<li>在<code>png24</code>那选择<code>png8</code>格式，最重要的一点是“杂色”颜色的选项，如果这边没有设置好就会毛刺边出现，这边应该怎么设置呢？</li>
</ol>
</li>
<li>
<ol>
<li>“杂色”选项的颜色应该选择和<code>logo</code>背景颜色最接近的</li>
</ol>
</li>
<li>
<ol>
<li>保存一下就可以了。</li>
</ol>
</li>
</ul></section>
<section><h2>png8和png24的区别<a href="#png8和png24的区别"><span>#</span></a></h2><ul>
<li>1.<code>PNG-8</code> 与 <code>PNG-24</code> 对<code>IE6</code>的支持程度
<ul>
<li><code>PNG-24</code>是支持<code>alpha</code>通道透明的格式，支持半透明，<code>IE6</code>不支持<code>PNG-24</code>,但是他完全支持<code>PNG-8</code>。</li>
<li>如果是不透明的<code>PNG-24</code>,<code>IE6</code>也是完美支持,之所以说<code>IE6</code>不支持<code>PNG-24</code>是因为<code>PNG-24</code>的半透明会在<code>IE6</code>里显示不正常。</li>
</ul>
</li>
<li>2.<code>PNG-8</code> 与 <code>PNG-24</code> 的透明区别
<ul>
<li><code>PNG-8</code> 和 <code>gif</code> 有一些相似之处，模式都是索引颜色，只支持像素级的纯透明，不支持 <code>alpha</code> 透明。我们通常说的“<code>IE6</code> 不支持 <code>PNG</code> 透明”，是指不支持 <code>PNG-24</code> 的透明（将透明区域显示为灰色）。但是 <code>IE6</code> 支持 <code>PNG-8</code> 的透明，就像支持 <code>gif</code> 的透明一样。</li>
</ul>
</li>
<li>3.<code>PNG-8</code> 的高压缩比
<ul>
<li>切图时，有时选择 <code>PNG-8</code> 可以获得更高的压缩比。注意，是 <code>PNG-8</code>，不是 <code>PNG-24</code>。不过有些情况下还是 <code>gif</code> 或 <code>jpg</code> 会小一些，需要根据实际情况调试以选择最佳方案。</li>
</ul>
</li>
</ul></section>
<section><h2><code>PNG-8</code> 与 <code>GIF</code><a href="#png-8-与-gif"><span>#</span></a></h2><ul>
<li><code>PNG-8</code>跟<code>GIF</code>一样支持单色透明。<code>GIF</code>有的<code>PNG-8</code>都有，<code>GIF</code>没有的<code>PNG-8</code>还有，比如&lt;同样的文件&gt;<code>PNG-8</code>格式的却比<code>GIF</code>要小</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/HEXO%E4%B8%BB%E9%A2%98%E8%AE%BE%E7%BD%AE(huno%E4%B8%BB%E9%A2%98)/</id>
      <title type="text">HEXO主题设置(huno主题)</title>
      <published>2017-07-31T00:00:00.000Z</published>
      <updated>2017-07-31T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/HEXO%E4%B8%BB%E9%A2%98%E8%AE%BE%E7%BD%AE(huno%E4%B8%BB%E9%A2%98)/"/>
      <summary type="text">HEXO主题设置(huno主题)</summary>
      <content type="html"><![CDATA[<ul>
<li>目前使用的主题是：next</li>
<li>当前文章所述主题为：huno</li>
<li>在博客的根目录下（即上一篇文章基于GitHub创建自己的博客<code>https://gaodaxiu0406.github.io/2017/04/25/%E5%9F%BA%E4%BA%8EGitHub%E5%88%9B%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E5%8D%9A%E5%AE%A2/</code>中提到的 HEXO 文件夹下） 克隆主题</li>
</ul>

<section><h2>克隆主题<a href="#克隆主题"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>git</span><span> </span><span>clone</span><span> </span><span>git</span><span>:</span></span><span>//github.com/someus/huno.git themes/huno</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>提示:huno的github地址:<a href="https://github.com/gaodaxiu0406/huno" target="_blank">https://github.com/gaodaxiu0406/huno</a></li>
</ul><section><h3>执行<a href="#执行"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>vim</span><span> </span><span>_config</span><span>.</span></span><span>yml</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>执行此命令后可以对此文档进行编辑 输入o进入编辑状态</li>
</ul></section><section><h3>将 theme 对应的值进行修改<a href="#将-theme-对应的值进行修改"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>theme</span><span>: </span><span>huno</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>修改完成 按esc键退出编辑状态 再输入</li>
</ul></section></section>
<section><h2>自动部署<a href="#自动部署"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>npm</span><span> </span><span>install</span><span> </span><span>hexo</span></span><span>-</span><span>deployer</span><span>-</span><span><span>git</span><span> </span></span><span>--</span><span>save</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>发布<a href="#发布"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>hexo</span><span> </span><span>clean</span><span> </span></span><span>&amp;&amp;</span><span><span> </span><span>hexo</span><span> </span><span>g</span><span> </span></span><span>&amp;&amp;</span><span><span> </span><span>hexo</span><span> </span><span>d</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>稍等片刻看一下自己的博客主页，你想要的效果就出现了。也可以在github或百度中搜索更多主题，挑选自己喜欢的主题进行修改，只要你快乐就好</li>
</ul></section>
<section><h2>主题配置<a href="#主题配置"><span>#</span></a></h2><ul>
<li>现在主题是更改过来了，但还有许多细节需要处理，比如说你需要修改头像等等。</li>
<li>每个人的设置风格不同,但基本的设置在你下载的主题中的README文件中都有介绍,你可以按照文件中的介绍配置属于自己的博客。动气手来，让你的博客亮起来</li>
</ul><blockquote><p>返回上篇:<a href="https://gaodaxiu-blog.netlify.app/posts/%E5%9F%BA%E4%BA%8Egithub%E5%88%9B%E5%BB%BA%E8%87%AA%E5%B7%B1hexo%E7%9A%84%E5%8D%9A%E5%AE%A2">基于GitHub创建自己的博客</a></p></blockquote></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/react%E8%BD%AE%E6%92%AD%E5%9B%BE%E9%A1%B9%E7%9B%AE%E5%BC%80%E5%86%99/</id>
      <title type="text">React轮播图（下）</title>
      <published>2017-07-31T00:00:00.000Z</published>
      <updated>2017-07-31T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/react%E8%BD%AE%E6%92%AD%E5%9B%BE%E9%A1%B9%E7%9B%AE%E5%BC%80%E5%86%99/"/>
      <summary type="text">react轮播图项目开写</summary>
      <content type="html"><![CDATA[<blockquote><p>关于react轮播图的源码,无缝版已上传至<a href="github,https://github.com/gaodaxiu0406/React-Slider">github,https://github.com/gaodaxiu0406/React-Slider</a></p></blockquote>

<section><h2>用<code>react</code>+<code>webpack</code>写一个的轮播图项目(项目配置请看上篇[React轮播图（上）])<a href="#用reactwebpack写一个的轮播图项目项目配置请看上篇react轮播图上"><span>#</span></a></h2><p>先将整个文件写在一个文件中</p></section>
<section><h2>1.画结构<a href="#1画结构"><span>#</span></a></h2><ul>
<li>新建一个components文件夹</li>
<li>components文件夹下新建Slider.js文件和Slider.less文件(Slider.less文件是用来给Slider.js写样式的)</li>
</ul></section>
<section><h2>2.在indix.js中引入组件 渲染到页面中<a href="#2在indixjs中引入组件-渲染到页面中"><span>#</span></a></h2><ul>
<li>打开src文件夹中的index.html文件</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>div</span><span> </span><span>id</span><span>=</span><span>"root"</span><span>&gt;&lt;/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>2-1) 在这个id为<code>root</code>的标签中渲染元素</li>
<li>2-2) 回到<code>index.js</code>中,写一个轮播图组件，渲染到<code>index.html</code>中</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>import</span><span> </span><span>React</span><span> </span><span>from</span><span> </span><span>'react'</span><span>;</span></div></div><div><div><div>2</div></div><div><span>import</span><span> </span><span>ReactDOM</span><span> </span><span>from</span><span> </span><span>'react-dom'</span><span>;</span></div></div><div><div><div>3</div></div><div><span>import</span><span> </span><span>Slider</span><span> </span><span>from</span><span> </span><span>'./components/Slider'</span><span>;</span></div></div><div><div><div>4</div></div><div><span>let</span><span><span> </span><span>images</span></span><span>=</span><span>[</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>{</span><span>src</span><span>:</span><span>require</span><span>(</span><span>'./images/1.jpg'</span><span>)},</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>{</span><span>src</span><span>:</span><span>require</span><span>(</span><span>'./images/2.jpg'</span><span>)},</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>{</span><span>src</span><span>:</span><span>require</span><span>(</span><span>'./images/3.jpg'</span><span>)},</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>{</span><span>src</span><span>:</span><span>require</span><span>(</span><span>'./images/4.jpg'</span><span>)}</span></div></div><div><div><div>9</div></div><div><span>];</span></div></div><div><div><div>10</div></div><div><span><span>ReactDOM</span><span>.</span></span><span>render</span><span>(&lt;</span><span>Slider</span><span> </span><span>images</span><span><span>=</span><span>{</span><span>images</span><span>}</span><span>/&gt;,</span><span>document</span><span>.</span></span><span>querySelector</span><span>(</span><span>'#root'</span><span>));</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>解释1) 引入<code>React</code>，引入<code>ReactDOM</code>，引入<code>Slider</code>组件 然后通过<code>ReactDOM.render</code>将<code>Slider</code>组件渲染到<code>index.html</code>的<code>id</code>为<code>root</code>的<code>div</code>标签中</li>
<li>解释2) <code>Slider</code>组件需要图片参数
<ul>
<li><code>src</code>文件夹下新建一个<code>images</code>文件夹，存入轮播的图片</li>
<li>将图片路径通过<code>require</code>存入<code>images</code>数组中</li>
<li>通过组件<code>Slider</code>标签将所需的<code>images</code>参数传入组件<code>Slider</code>(让<code>images</code>参数变量等于<code>images</code>数组)</li>
</ul>
</li>
</ul></section>
<section><h2>3.开始写Slider.js中的代码<a href="#3开始写sliderjs中的代码"><span>#</span></a></h2><ul>
<li>需要默认导出一个组件Slider供外面文件(<code>index.js</code>)调用;还需要接收一个<code>images</code>属性进行轮播</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>import</span><span> </span><span>React</span><span> </span><span>from</span><span> </span><span>'react'</span><span>;</span></div></div><div><div><div>2</div></div><div><span>import</span><span> </span><span>ReactDOM</span><span> </span><span>from</span><span> </span><span>'react-dom'</span><span>;</span></div></div><div><div><div>3</div></div><div><span>require</span><span>(</span><span>'./Slider.less'</span><span>);</span></div></div><div><div><div>4</div></div><div><span>export</span><span> </span><span>default</span><span> </span><span>class</span><span> </span><span>Slider</span><span> </span><span>extends</span><span> </span><span>React</span><span>.</span><span>Component</span><span>{</span></div></div><div><div><div>5</div></div><div><span>    </span><span>render</span><span>(){</span></div></div><div><div><div>6</div></div><div><span>        </span><span>let</span><span> </span><span>images</span><span>=</span><span>this</span><span>.</span><span>props</span><span>.</span><span>images</span><span>;</span></div></div><div><div><div>7</div></div><div><span>        </span><span>return</span><span>(</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>&lt;</span><span>div</span><span> </span><span>className</span><span>=</span><span>"slider-wrapper"</span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>&lt;</span><span>ul</span><span> </span><span>className</span><span>=</span><span>"sliders"</span><span>&gt;</span></div></div><div><div><div>10</div></div><div><span><span>                    </span></span><span>{</span><span>images</span><span>.</span><span>map</span><span><span>((</span><span>image</span><span>,</span><span>index</span><span>)</span></span><span>=&gt;</span><span>(</span></div></div><div><div><div>11</div></div><div><span><span>                        </span></span><span>&lt;</span><span>li</span><span> </span><span>className</span><span>=</span><span>"slider"</span><span>&gt;</span></div></div><div><div><div>12</div></div><div><span><span>                        </span></span><span>&lt;</span><span>img</span><span> </span><span>src</span><span><span>=</span><span>{</span><span>image</span><span>.</span></span><span>src</span><span><span>}</span><span>/&gt;</span></span></div></div><div><div><div>13</div></div><div><span><span>                    </span></span><span>&lt;/</span><span>li</span><span>&gt;))</span></div></div><div><div><div>14</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>                </span></span><span>&lt;/</span><span>ul</span><span>&gt;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>)</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><ul>
<li>
<ol>
<li><code>require('./Slider.less');</code> —&gt; 这里引入<code>Slider.less</code>用<code>import</code>和<code>require</code>都是一样的效果，都是加载一个模块的意思,模块可能是图片，可能是<code>less</code>/<code>css</code>/<code>js</code>/<code>json</code>文件,都可以 —&gt; 在<code>webpack</code>中一切皆模块,不管是什么资源，都可以作为模块来加载。</li>
</ol>
</li>
<li>
<ol>
<li><code>li</code>的数量取决于<code>images</code>数据,<code>images</code>中有几张图片，就有几个<code>li</code>。</li>
</ol>
<ul>
<li>在<code>render</code>中<code>let</code>一个变量<code>images</code>来接收<code>index.js</code>传入的<code>images</code>,然后用<code>map</code>方法遍历整个数组。</li>
</ul>
</li>
</ul></section>
<section><h2>4.在<code>Slider.less</code>中写好轮播图的样式<a href="#4在sliderless中写好轮播图的样式"><span>#</span></a></h2><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>*</span><span>{</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>padding: </span><span>0</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>margin: </span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>}</span></div></div><div><div><div>5</div></div><div><span>ul</span><span>,</span><span>li</span><span>{</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>list-style: </span><span>none</span><span>;</span></div></div><div><div><div>7</div></div><div><span>}</span></div></div><div><div><div>8</div></div><div><span>.wrapper</span><span>{</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>width: </span><span><span>400</span><span>px</span></span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>height: </span><span><span>400</span><span>px</span></span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>position: </span><span>relative</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>  </span></span><span>margin: </span><span><span>30</span><span>px</span></span><span><span> </span><span>auto</span><span>;</span></span></div></div><div><div><div>13</div></div><div><span><span>  </span></span><span>.sliders{</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>height: </span><span><span>400</span><span>px</span></span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>position: </span><span>absolute</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>left:</span><span>0</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>.slider{</span></div></div><div><div><div>18</div></div><div><span><span>      </span></span><span>float: </span><span>left</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>      </span></span><span>width: </span><span><span>400</span><span>px</span></span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>      </span></span><span>height: </span><span><span>400</span><span>px</span></span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>      </span></span><span>img{</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>width: </span><span><span>100</span><span>%</span></span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>height: </span><span><span>100</span><span>%</span></span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>      </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>宽高为400px的轮播图。</p></section>
<section><h2>5.写配置文件<a href="#5写配置文件"><span>#</span></a></h2><ul>
<li>在<code>webpack.config.js</code>中加<code>loaders</code></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>module:</span><span>{</span></div></div><div><div><div>2</div></div><div><span><span>        </span></span><span>loaders:[</span></div></div><div><div><div>3</div></div><div><span><span>            </span></span><span>{test:/</span><span>\.</span><span>js$/,loader:</span><span>'babel-loader'</span><span><span>,</span><span>exclude</span><span>:/node_modules/},</span></span></div></div><div><div><div>4</div></div><div><span><span>            </span></span><span>{test:/</span><span>\.</span><span>less$/,loader:</span><span>'style-loader!css-loader!less-loader'</span><span>},</span></div></div><div><div><div>5</div></div><div><span><span>            </span></span><span>{test:/</span><span>\.</span><span>(jpg|png|gif)$/,loader:</span><span>'url-loader'</span><span>}</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>]</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li><code>babel</code>默认情况下什么都不做，需要一个配置文件<code>.babelrc</code>文件
<ul>
<li>
<p>新建一个<code>.babelrc</code>配置文件</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>{</span></div></div><div><div><div>2</div></div><div><span>"presets": [</span><span>"es2015"</span><span>,</span><span>"stage-0"</span><span>,</span><span>"react"</span><span>]</span></div></div><div><div><div>3</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li><code>presets</code>预设,“es2015”将<code>es6</code>编译成<code>es5</code>,“stage-0”将<code>es7</code>编译成<code>es5</code>,“react”将<code>react</code>编译成<code>es5</code>。
<ul>
<li>原理1:<code>{test:/\.js$/,loader:'babel-loader',exclude:/node_modules/}</code>—&gt;处理(编译)js文件&lt;如果发现文件是js&gt;,用<code>babel-loader</code>加载,加载的时候需要读配置文件<code>.babelrc</code>,代码<code>es6</code>/<code>es7</code>/<code>react</code>都要通过<code>babel</code>转成<code>es5</code>;同时通过<code>exclude</code>将<code>node_modules</code>文件夹下的所有<code>js</code>文件排除掉。</li>
<li>原理2:<code>{test:/\.less$/,loader:'style-loader!css-loader!less-loader'}</code>—&gt;如果发现文件以<code>.less</code>结尾的,第一步通过<code>less-loader</code>将<code>less</code>编译成<code>css</code>,然后通过<code>css-loader</code>进行加载,然后通过<code>style-loader</code>将他通过<code>style</code>标签的形式插入到页面中去，变成一个行内样式。</li>
<li>原理3:<code>{test:/\.(jpg|png|gif)$/,loader:'url-loader'}</code>—&gt;凡是资源文件都可以用<code>url-loader</code>来加载,不论是图片、图标、字体、视频、音频;后面可以通过问号传参,有个参数<code>limit</code>(例如:<code>{test:/\.(jpg|png|gif)$/,loader:'url-loader?limit=8192'}</code>—&gt;小于8K的资源文件将直接以<code>base64</code>的形式内联在代码中，可以减少一次<code>http</code>请求)。</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul><section><h3>此时执行<code>npm run build</code>,将代码打包到出口文件中,打开<code>build</code>文件夹下的<code>index.html</code>文件就可以直接预览效果了<a href="#此时执行npm-run-build将代码打包到出口文件中打开build文件夹下的indexhtml文件就可以直接预览效果了"><span>#</span></a></h3><ul>
<li>此时会发现控制台有个报错</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>Warning</span><span>: </span><span>Each</span><span> </span><span>child</span><span> </span></span><span>in</span><span><span> </span><span>an</span><span> </span><span>array</span><span> </span><span>or</span><span> </span><span>iterator</span><span> </span><span>should</span><span> </span><span>have</span><span> </span><span>a</span><span> </span><span>unique</span><span> </span></span><span>"key"</span><span><span> </span><span>prop</span><span>. </span></span><span>Check</span><span><span> </span><span>the</span><span> </span><span>render</span><span> </span><span>method</span><span> </span></span><span>of</span><span> </span><span>`Slider`</span><span>. </span><span>See</span><span><span> </span><span>https</span><span>:</span></span><span>//fb.me/react-warning-keys for more information.</span></div></div><div><div><div>2</div></div><div><span>    </span><span>in</span><span> </span><span>li</span><span><span> (</span><span>created</span><span> </span><span>by</span><span> </span><span>Slider</span><span>)</span></span></div></div><div><div><div>3</div></div><div><span>    </span><span>in</span><span><span> </span><span>Slider</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>需要唯一的key属性,在<code>Slider.js</code>文件中的<code>li</code>需要唯一的<code>key</code>属性，给<code>li</code>标签加上<code>key</code>属性即可</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>li</span><span> </span><span>className</span><span>=</span><span>"slider"</span><span> </span><span>key</span><span>=</span><span>{index}</span><span>&gt;                  &lt;</span><span>img</span><span> </span><span>src</span><span>=</span><span>{image.src}</span><span>/&gt;        &lt;/</span><span>li</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>关掉浏览器,重新执行<code>npm run build</code>，再打开<code>build</code>文件夹下的<code>index.html</code>文件预览,控制台就没有报错了</p></section></section>
<section><h2>6.写功能<a href="#6写功能"><span>#</span></a></h2><ul>
<li>让图片动起来,需要给<code>Slider.js</code>加个状态,需要有个定时器让他动起来 写在周期函数<code>componentDidMount</code>中</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>constructor</span><span>(){</span></div></div><div><div><div>2</div></div><div><span>        </span><span>super</span><span>();</span></div></div><div><div><div>3</div></div><div><span>        </span><span>this</span><span>.</span><span>state</span><span>=</span><span>{</span><span>pos</span><span>:</span><span>0</span><span>};</span><span>//默认索引</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>5</div></div><div><span>    </span><span>componentDidMount</span><span>(){</span></div></div><div><div><div>6</div></div><div><span>        </span><span>this</span><span>.</span><span>$timer</span><span>=</span><span>setInterval</span><span>(()</span><span>=&gt;</span><span>{</span></div></div><div><div><div>7</div></div><div><span>            </span><span>let</span><span><span> </span><span>pos</span></span><span>=</span><span>this</span><span>.</span><span>state</span><span>.</span><span>pos</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>pos</span><span>++</span><span>;</span><span>//每隔2s让pos加1，pos值影响ul的左偏移量left的值 所以ul应该有个style属性 left值应该变化</span></div></div><div><div><div>9</div></div><div><span>            </span><span>this</span><span>.</span><span>setState</span><span>({</span><span>pos</span><span>:</span><span><span>pos</span><span>})</span></span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>},</span><span>this</span><span>.</span><span>props</span><span>.</span><span>interval</span><span>*</span><span>1000</span><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p><code>pos++;</code> —&gt; 每隔2s让<code>pos</code>加1，<code>pos</code>值影响<code>ul</code>的左偏移量<code>left</code>的值,所以<code>ul</code>应该有个<code>style</code>属性,<code>left</code>值应该变化</p>
<ul>
<li>
<p>ul应该有个style属性</p>
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>render</span><span>(){</span></div></div><div><div><div>2</div></div><div><span>    </span><span>let</span><span><span> </span><span>images</span></span><span>=</span><span>this</span><span>.</span><span>props</span><span>.</span><span>images</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>let</span><span><span> </span><span>style</span></span><span>=</span><span>{</span></div></div><div><div><div>4</div></div><div><span>        </span><span>width</span><span>:</span><span>400</span><span>*</span><span><span>images</span><span>.</span></span><span>length</span><span>,</span></div></div><div><div><div>5</div></div><div><span>        </span><span>left</span><span>:</span><span>this</span><span>.</span><span>state</span><span>.</span><span>pos</span><span>*-</span><span>400</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>};</span></div></div><div><div><div>7</div></div><div><span>    </span><span>return</span><span>(</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>&lt;</span><span>div</span><span> </span><span>className</span><span>=</span><span>"slider-wrapper"</span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>&lt;</span><span>ul</span><span> </span><span>style</span><span><span>=</span><span>{</span><span>style</span><span>}</span><span> </span></span><span>className</span><span>=</span><span>"sliders"</span><span>&gt;</span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>{</span></div></div><div><div><div>11</div></div><div><span><span>                    </span></span><span>images</span><span>.</span><span>map</span><span><span>((</span><span>image</span><span>,</span><span>index</span><span>)</span></span><span>=&gt;</span><span>(</span></div></div><div><div><div>12</div></div><div><span><span>                        </span></span><span>&lt;</span><span>li</span><span> </span><span>className</span><span>=</span><span>"slider"</span><span> </span><span>key</span><span><span>=</span><span>{</span><span>index</span><span>}</span><span>&gt;</span></span></div></div><div><div><div>13</div></div><div><span><span>                            </span></span><span>&lt;</span><span>img</span><span> </span><span>src</span><span><span>=</span><span>{</span><span>image</span><span>.</span></span><span>src</span><span><span>}</span><span>/&gt;</span></span></div></div><div><div><div>14</div></div><div><span><span>                        </span></span><span>&lt;/</span><span>li</span><span>&gt;</span></div></div><div><div><div>15</div></div><div><span><span>                    </span></span><span>))</span></div></div><div><div><div>16</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>&lt;/</span><span>ul</span><span>&gt;</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>)</span></div></div><div><div><div>21</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>
</li>
</ul>
</li>
<li>
<p><code>this.props.interval*1000</code>—&gt;每隔2s轮播一次,需要有变量传进来—&gt;在index.js中新增一个interval变量(间隔时间让外面可以控制)</p>
<ul>
<li>
<ol>
<li>这里通过this.props获取index.js中传递进来的的interval变量<code>this.props.interval*1000</code></li>
</ol>
</li>
<li>
<ol>
<li>
<p><code>index.js</code>中新增一个<code>interval</code>变量</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>ReactDOM</span><span>.</span></span><span>render</span><span>(</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>&lt;</span><span>Slider</span></div></div><div><div><div>3</div></div><div><span>        </span><span>images</span><span><span>=</span><span>{</span><span>images</span><span>}</span></span></div></div><div><div><div>4</div></div><div><span>        </span><span>interval</span><span><span>=</span><span>{</span></span><span>2</span><span>}</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>/&gt;,</span><span>document</span><span>.</span><span>querySelector</span><span>(</span><span>'#root'</span><span>));</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ol>
</li>
</ul>
</li>
</ul><section><h3>写功能步骤总结<a href="#写功能步骤总结"><span>#</span></a></h3><ul>
<li>第一步&lt;定义一个默认索引&gt;<code>pos</code>,默认值是<code>0</code></li>
<li>第二步&lt;在组件加载完成之后创建定时器&gt;<code>setInterval</code>赋给<code>this.$timer</code></li>
<li>第三步&lt;每隔2s让图片向左偏移一个宽度的距离&gt;(<code>interval</code>是外界传进来的,是图片轮播的间隔时间),在<code>index</code>中要给组件<code>Slider</code>传进来一个<code>2</code>,<code>2*1000</code>意味着2s变一次</li>
<li><code>this.$timer</code>中先取出老的<code>pos</code>值，第一次轮播<code>pos</code>就是<code>0</code>，然后<code>pos++</code>，<code>pos</code>变成1，然后<code>setState</code>重新设置<code>pos</code>值,让<code>pos</code>值往上</li>
<li><code>pos</code>会影响<code>ul</code>的<code>left</code>值，一张图片的宽度是400px，向左偏移400，就是*-400</li>
<li><code>ul</code>的宽度应该是宽度400乘以图片的数量<code>images.length</code>,4张图就是1600px</li>
</ul></section><section><h3>执行<code>npm run dev</code><a href="#执行npm-run-dev"><span>#</span></a></h3><ul>
<li>注意,执行<code>npm run dev</code>可自动将文件编译更新打包到出口文件<code>index.html</code>中，并且只要更改文件，页面就会自动刷新,但是如果更改配置文件,需要重新启动<code>npm run dev</code>服务</li>
<li>此时执行<code>npm run dev</code>命令,轮播图就动起来了，但是越界了,因为此时还没有做边界处理</li>
</ul></section></section>
<section><h2>7.完善功能<a href="#7完善功能"><span>#</span></a></h2><p>将<code>Slider</code>需要的属性(可外界控制的)，在<code>index.js</code>的<code>Slider</code>组件标签中传入</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>ReactDOM</span><span>.</span></span><span>render</span><span>(</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>&lt;</span><span>Slider</span></div></div><div><div><div>3</div></div><div><span>        </span><span>images</span><span><span>=</span><span>{</span><span>images</span><span>}</span></span><span>//图片</span></div></div><div><div><div>4</div></div><div><span>        </span><span>interval</span><span><span>=</span><span>{</span></span><span>2</span><span>}</span><span>//多长时间轮播一次</span></div></div><div><div><div>5</div></div><div><span>        </span><span>speed</span><span><span>=</span><span>{</span></span><span>1</span><span>}</span><span>//每次轮播的速度</span></div></div><div><div><div>6</div></div><div><span>        </span><span>pause</span><span><span>=</span><span>{</span></span><span>true</span><span>}</span><span>//当鼠标移动上去之后自动暂停</span></div></div><div><div><div>7</div></div><div><span>        </span><span>autoplay</span><span><span>=</span><span>{</span></span><span>true</span><span>}</span><span>//是否启用自动轮播，false不自动轮播</span></div></div><div><div><div>8</div></div><div><span>                                  </span><span>-</span><span> </span><span>在Slider.js中</span></div></div><div><div><div>9</div></div><div><span>        </span><span>dots</span><span><span>=</span><span>{</span></span><span>true</span><span>}</span><span>//是否有点状导航</span></div></div><div><div><div>10</div></div><div><span>        </span><span>arrows</span><span><span>=</span><span>{</span></span><span>true</span><span>}</span><span>//是否有箭头导航</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>/&gt;,</span><span>document</span><span>.</span><span>querySelector</span><span>(</span><span>'#root'</span><span>));</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>添加<code>transitionDuration</code>—&gt;规定完成过渡效果需要花费的时间 <code>speed</code>默认值是1 这里就是1s</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>let</span><span><span> </span><span>style</span></span><span>=</span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>width</span><span>:</span><span>400</span><span>*</span><span><span>images</span><span>.</span></span><span>length</span><span>,</span></div></div><div><div><div>3</div></div><div><span>    </span><span>left</span><span>:</span><span>this</span><span>.</span><span>state</span><span>.</span><span>pos</span><span>*-</span><span>400</span><span>,</span></div></div><div><div><div>4</div></div><div><span>    </span><span>transitionDuration</span><span>:</span><span>this</span><span>.</span><span>props</span><span>.</span><span>speed</span><span>+</span><span>'s'</span></div></div><div><div><div>5</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>在<code>Slider.js</code>的周期函数中添加一个判断</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>    </span><span>componentDidMount</span><span>(){</span></div></div><div><div><div>2</div></div><div><span>        </span><span>if</span><span>(</span><span>this</span><span>.</span><span>props</span><span>.</span><span>autoPlay</span><span>){</span></div></div><div><div><div>3</div></div><div><span>            </span><span>this</span><span>.</span><span>$timer</span><span>=</span><span>setInterval</span><span>(()</span><span>=&gt;</span><span>{</span></div></div><div><div><div>4</div></div><div><span>                </span><span>let</span><span><span> </span><span>pos</span></span><span>=</span><span>this</span><span>.</span><span>state</span><span>.</span><span>pos</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>                </span></span><span>pos</span><span>++</span><span>;</span></div></div><div><div><div>6</div></div><div><span>                </span><span>this</span><span>.</span><span>setState</span><span>({</span><span>pos</span><span>:</span><span><span>pos</span><span>})</span></span></div></div><div><div><div>7</div></div><div><span><span>            </span></span><span>},</span><span>this</span><span>.</span><span>props</span><span>.</span><span>interval</span><span>*</span><span>1000</span><span>)</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li><code>this.props.autoPlay</code> 是否自动轮播,如果外界传入<code>true</code>就是自动轮播，传入<code>false</code>就是不自动轮播</li>
</ul></section>
<section><h2>8.将轮播切换单独拎出来写成一个方法<code>turn</code><a href="#8将轮播切换单独拎出来写成一个方法turn"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>    </span><span>turn</span><span><span>(</span><span>n</span><span>){</span></span></div></div><div><div><div>2</div></div><div><span>        </span><span>let</span><span><span> </span><span>pos</span></span><span>=</span><span>this</span><span>.</span><span>state</span><span>.</span><span>pos</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>        </span></span><span>pos</span><span>+=</span><span><span>n</span><span>;</span></span></div></div><div><div><div>4</div></div><div><span>        </span><span>this</span><span>.</span><span>setState</span><span>({</span><span>pos</span><span>:</span><span><span>pos</span><span>})</span></span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>或者使用<code>es6</code>的箭头函数</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>turn</span><span>=</span><span><span>(</span><span>n</span><span>)</span></span><span>=&gt;</span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>let</span><span><span> </span><span>pos</span></span><span>=</span><span>this</span><span>.</span><span>state</span><span>.</span><span>pos</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>pos</span><span>+=</span><span><span>n</span><span>;</span></span></div></div><div><div><div>4</div></div><div><span>    </span><span>this</span><span>.</span><span>setState</span><span>({</span><span>pos</span><span>:</span><span><span>pos</span><span>})</span></span></div></div><div><div><div>5</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li><code>let pos=this.state.pos;</code>获取旧索引</li>
<li><code>turn</code>表示切换,<code>n</code>表示切换的步长,方便以后操作&lt;例如往左走传1进来即可&gt;，往右走传<code>-1</code>进来即可</li>
<li>那么此时在周期函数中,直接调用这个<code>turn</code>方法即可,默认往右轮播，传入-1</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>componentDidMount</span><span>(){</span></div></div><div><div><div>2</div></div><div><span>    </span><span>if</span><span>(</span><span>this</span><span>.</span><span>props</span><span>.</span><span>autoplay</span><span>){</span></div></div><div><div><div>3</div></div><div><span>        </span><span>this</span><span>.</span><span>timer</span><span>=</span><span>setInterval</span><span>(()</span><span>=&gt;</span><span>{</span></div></div><div><div><div>4</div></div><div><span>            </span><span>this</span><span>.</span><span>turn</span><span>(</span><span>1</span><span>);</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>},</span><span>this</span><span>.</span><span>props</span><span>.</span><span>interval</span><span>*</span><span>1000</span><span>)</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>9.实现鼠标移上去停止轮播<a href="#9实现鼠标移上去停止轮播"><span>#</span></a></h2><ul>
<li>给<code>div</code>加<code>onMouseOver和onMouseOut</code>事件</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>ul</span><span> </span><span>onMouseOver</span><span><span>=</span><span>{</span><span>()</span></span><span>=&gt;</span><span>clearInterval</span><span>(</span><span>this</span><span>.</span><span>timer</span><span><span>)</span><span>}</span><span> </span></span><span>onMouseOut</span><span><span>=</span><span>{</span></span><span>this</span><span>.</span><span>play</span><span><span>}</span><span> </span></span><span>style</span><span><span>=</span><span>{</span><span>style</span><span>}</span><span> </span></span><span>className</span><span>=</span><span>"sliders"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>...</span></div></div><div><div><div>3</div></div><div><span>&lt;/</span><span>ul</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>10.自动轮播部分也封装成一个函数<code>play</code><a href="#10自动轮播部分也封装成一个函数play"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>play</span><span>=</span><span>()</span><span>=&gt;</span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>this</span><span>.</span><span>timer</span><span>=</span><span>setInterval</span><span>(()</span><span>=&gt;</span><span>{</span></div></div><div><div><div>3</div></div><div><span>        </span><span>this</span><span>.</span><span>turn</span><span>(</span><span>1</span><span>);</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>},</span><span>this</span><span>.</span><span>props</span><span>.</span><span>interval</span><span>*</span><span>1000</span><span>)</span></div></div><div><div><div>5</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>play表示开启定时器进行自动轮播</li>
<li>那么此时在周期函数中直接调用<code>this.play()</code>即可</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>componentDidMount</span><span>(){</span></div></div><div><div><div>2</div></div><div><span>    </span><span>if</span><span>(</span><span>this</span><span>.</span><span>props</span><span>.</span><span>autoplay</span><span>){</span></div></div><div><div><div>3</div></div><div><span>        </span><span>this</span><span>.</span><span>play</span><span>();</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>11.边界判断<a href="#11边界判断"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>turn</span><span>=</span><span><span>(</span><span>n</span><span>)</span></span><span>=&gt;</span><span>{</span></div></div><div><div><div>2</div></div><div><span>        </span><span>let</span><span><span> </span><span>pos</span></span><span>=</span><span>this</span><span>.</span><span>state</span><span>.</span><span>pos</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>        </span></span><span>pos</span><span>+=</span><span><span>n</span><span>;</span></span></div></div><div><div><div>4</div></div><div><span>        </span><span>if</span><span><span>(</span><span>pos</span></span><span>&gt;=</span><span>this</span><span>.</span><span>props</span><span>.</span><span>images</span><span>.</span><span>length</span><span>){</span></div></div><div><div><div>5</div></div><div><span><span>            </span></span><span>pos</span><span>=</span><span>0</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>        </span><span>this</span><span>.</span><span>setState</span><span>({</span><span>pos</span><span>:</span><span><span>pos</span><span>})</span></span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>当索引为图片总张数的时候 让索引变为0</li>
</ul></section>
<section><h2>12.写左右箭头<a href="#12写左右箭头"><span>#</span></a></h2><p>在ul下加一个<code>div</code></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>div</span><span> </span><span>className</span><span>=</span><span>"arrows"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>&lt;</span><span>span</span><span> </span><span>className</span><span>=</span><span>"arrow-left"</span><span>&gt;</span><span>&amp;lt;</span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>&lt;</span><span>span</span><span> </span><span>className</span><span>=</span><span>"arrow-right"</span><span>&gt;</span><span>&amp;gt;</span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span>&lt;/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>在<code>Slider.less</code>中写样式</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>  </span><span>.arrows</span><span>{</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>position: </span><span>absolute</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>width: </span><span><span>100</span><span>%</span></span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>height: </span><span><span>20</span><span>px</span></span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>top:</span><span><span>50</span><span>%</span></span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>margin-top:</span><span><span>-10</span><span>px</span></span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>.arrow{</span></div></div><div><div><div>8</div></div><div><span><span>      </span></span><span>width: </span><span><span>20</span><span>px</span></span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>      </span></span><span>height: </span><span><span>20</span><span>px</span></span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>      </span></span><span>line-height: </span><span><span>20</span><span>px</span></span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>      </span></span><span>text-align: </span><span>center</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>      </span></span><span>cursor: </span><span>pointer</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>      </span></span><span>font-size: </span><span><span>30</span><span>px</span></span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>      </span></span><span>background-color: </span><span>#</span><span>eee</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>      </span></span><span>&amp;:hover{</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>background-color: </span><span>#</span><span>999</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>      </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>    </span><span>.arrow-left</span><span>{</span></div></div><div><div><div>20</div></div><div><span><span>      </span></span><span>margin-left: </span><span><span>5</span><span>px</span></span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>      </span></span><span>float: </span><span>left</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>    </span><span>.arrow-right</span><span>{</span></div></div><div><div><div>24</div></div><div><span><span>      </span></span><span>margin-right: </span><span><span>5</span><span>px</span></span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>      </span></span><span>float: </span><span>right</span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span><span>  </span></span><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>给左右<code>arrow</code>绑定事件</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>div</span><span> </span><span>className</span><span>=</span><span>"arrows"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>&lt;</span><span>span</span><span> </span><span>onClick</span><span>=</span><span>{()</span><span>=</span><span>&gt;this.turn(-1)} className="arrow arrow-left"&gt;</span><span>&amp;lt;</span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>&lt;</span><span>span</span><span> </span><span>onClick</span><span>=</span><span>{()</span><span>=</span><span>&gt;this.turn(1)} className="arrow arrow-right"&gt;</span><span>&amp;gt;</span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span>&lt;/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>13.处理左边界<a href="#13处理左边界"><span>#</span></a></h2><ul>
<li>在<code>turn</code>中做个判断</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>turn</span><span>=</span><span><span>(</span><span>n</span><span>)</span></span><span>=&gt;</span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>let</span><span><span> </span><span>pos</span></span><span>=</span><span>this</span><span>.</span><span>state</span><span>.</span><span>pos</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>pos</span><span>+=</span><span><span>n</span><span>;</span></span></div></div><div><div><div>4</div></div><div><span>    </span><span>if</span><span><span>(</span><span>pos</span></span><span>&gt;=</span><span>this</span><span>.</span><span>props</span><span>.</span><span>images</span><span>.</span><span>length</span><span>){</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>pos</span><span>=</span><span>0</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>    </span><span>if</span><span><span>(</span><span>pos</span></span><span>&lt;</span><span>0</span><span>){</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>pos</span><span>=</span><span>this</span><span>.</span><span>props</span><span>.</span><span>images</span><span>.</span><span>length</span><span>-</span><span>1</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span>    </span><span>this</span><span>.</span><span>setState</span><span>({</span><span>pos</span><span>:</span><span><span>pos</span><span>})</span></span></div></div><div><div><div>11</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>当索引小于0的时候,让索引等于images的长度-1</p></section>
<section><h2>14.根据传进来的arrows值判断是否有左右箭头切换效果<a href="#14根据传进来的arrows值判断是否有左右箭头切换效果"><span>#</span></a></h2><ul>
<li>第一种方法(看着比较乱)</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>this</span><span>.</span><span>props</span><span>.</span><span>arrows</span><span>?</span><span>&lt;</span><span>div</span><span> </span><span>className</span><span>=</span><span>"arrows"</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>        </span></span><span>&lt;</span><span>span</span><span> </span><span>onClick</span><span><span>=</span><span>{</span><span>()</span></span><span>=&gt;</span><span>this</span><span>.</span><span>turn</span><span><span>(</span><span>-</span></span><span>1</span><span><span>)</span><span>}</span><span> </span></span><span>className</span><span>=</span><span>"arrow arrow-left"</span><span>&gt;</span><span>&amp;lt;</span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>&lt;</span><span>span</span><span> </span><span>onClick</span><span><span>=</span><span>{</span><span>()</span></span><span>=&gt;</span><span>this</span><span>.</span><span>turn</span><span>(</span><span>1</span><span><span>)</span><span>}</span><span> </span></span><span>className</span><span>=</span><span>"arrow arrow-right"</span><span>&gt;</span><span>&amp;gt;</span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>&lt;/</span><span>div</span><span>&gt;</span><span>:</span><span>null</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>第二种,在<code>render</code>中</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>let</span><span><span> </span><span>arrows</span></span><span>=</span><span>null</span><span>;</span></div></div><div><div><div>2</div></div><div><span>if</span><span>(</span><span>this</span><span>.</span><span>props</span><span>.</span><span>arrows</span><span>){</span></div></div><div><div><div>3</div></div><div><span>    </span><span>arrows</span><span>=</span><span>(</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>&lt;</span><span>div</span><span> </span><span>className</span><span>=</span><span>"arrows"</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>            </span></span><span>&lt;</span><span>span</span><span> </span><span>onClick</span><span><span>=</span><span>{</span><span>()</span></span><span>=&gt;</span><span>this</span><span>.</span><span>turn</span><span><span>(</span><span>-</span></span><span>1</span><span><span>)</span><span>}</span><span> </span></span><span>className</span><span>=</span><span>"arrow arrow-left"</span><span>&gt;</span><span>&amp;lt;</span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>&lt;</span><span>span</span><span> </span><span>onClick</span><span><span>=</span><span>{</span><span>()</span></span><span>=&gt;</span><span>this</span><span>.</span><span>turn</span><span>(</span><span>1</span><span><span>)</span><span>}</span><span> </span></span><span>className</span><span>=</span><span>"arrow arrow-right"</span><span>&gt;</span><span>&amp;gt;</span><span>&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>)</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>那么<code>ul</code>下面就可以直接用{<code>arrows</code>}代替了(看着很清晰明了)</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>div</span><span> </span><span>className</span><span>=</span><span>"slider-wrapper"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>&lt;</span><span>ul</span><span> </span><span>onMouseOver</span><span>=</span><span>{()</span><span>=</span><span>&gt;clearInterval(this.timer)} onMouseOut={this.play} style={style} className="sliders"&gt;</span></div></div><div><div><div>3</div></div><div><span><span>        </span></span><span>{</span></div></div><div><div><div>4</div></div><div><span><span>            </span></span><span>images.map((image,index)=&gt;(</span></div></div><div><div><div>5</div></div><div><span><span>                </span></span><span>&lt;</span><span>li</span><span> </span><span>className</span><span>=</span><span>"slider"</span><span> </span><span>key</span><span>=</span><span>{index}</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>                    </span></span><span>&lt;</span><span>img</span><span> </span><span>src</span><span>=</span><span>{image.src}</span><span>/&gt;</span></div></div><div><div><div>7</div></div><div><span><span>                </span></span><span>&lt;/</span><span>li</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>))</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>&lt;/</span><span>ul</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span>{arrows}</span></div></div><div><div><div>12</div></div><div><span>&lt;/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>15.根据传进来的dots值判断是否有点状导航<a href="#15根据传进来的dots值判断是否有点状导航"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>let</span><span><span> </span><span>dots</span></span><span>=</span><span>null</span><span>;</span></div></div><div><div><div>2</div></div><div><span>    </span><span>if</span><span>(</span><span>this</span><span>.</span><span>props</span><span>.</span><span>dots</span><span>){</span></div></div><div><div><div>3</div></div><div><span>        </span><span>dots</span><span>=</span><span>(</span></div></div><div><div><div>4</div></div><div><span><span>            </span></span><span>&lt;</span><span>div</span><span> </span><span>className</span><span>=</span><span>"dots"</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>                </span></span><span>{</span></div></div><div><div><div>6</div></div><div><span><span>                    </span></span><span>images</span><span>.</span><span>map</span><span><span>((</span><span>image</span><span>,</span><span>index</span><span>)</span></span><span>=&gt;</span><span>(</span></div></div><div><div><div>7</div></div><div><span><span>                        </span></span><span>&lt;</span><span>span</span><span> </span><span>className</span><span>=</span><span>"dot"</span><span> </span><span>key</span><span><span>=</span><span>{</span><span>index</span><span>}</span><span>&gt;&lt;/</span></span><span>span</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>                    </span></span><span>))</span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>)</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li><code>dots</code>直接放到最下面即可</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>...</span></div></div><div><div><div>2</div></div><div><span><span>{</span><span>arrows</span><span>}</span></span></div></div><div><div><div>3</div></div><div><span><span>{</span><span>dots</span><span>}</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>15-1.在<code>Slider.less</code>中写<code>dots</code>的样式<a href="#15-1在sliderless中写dots的样式"><span>#</span></a></h3><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>  </span><span>.dots</span><span>{</span></div></div><div><div><div>2</div></div><div><span><span>        </span></span><span>width: </span><span><span>100</span><span>%</span></span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>        </span></span><span>height: </span><span><span>20</span><span>px</span></span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>position: </span><span>absolute</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>bottom: </span><span><span>10</span><span>px</span></span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>text-align: </span><span>center</span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>.dot{</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>display: </span><span>inline-block</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>width: </span><span><span>20</span><span>px</span></span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>height: </span><span><span>20</span><span>px</span></span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>border-radius: </span><span><span>50</span><span>%</span></span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>margin-left: </span><span><span>5</span><span>px</span></span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>background-color: </span><span>#</span><span>abcdef</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>cursor: </span><span>pointer</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>&amp;:hover{</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>background-color: </span><span>#</span><span>999999</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>  </span></span><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section>
<section><h2>16.点状导航的点击跟随事件<a href="#16点状导航的点击跟随事件"><span>#</span></a></h2><p>给span加onClick事件</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>···</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>span</span><span> </span><span>className</span><span>=</span><span>"dot"</span><span> </span><span>key</span><span>=</span><span>{index}</span><span> </span><span>onClick</span><span>=</span><span>{()</span><span>=</span><span>&gt;this.turn(index-this.props.pos)}&gt;&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span>···</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>16-1.轮播点状导航自动跟随事件<a href="#16-1轮播点状导航自动跟随事件"><span>#</span></a></h3><p>在<code>Slider.less</code>中加一个<code>active</code>样式</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>.active</span><span>{</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>background-color: </span><span>#</span><span>999999</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>给span标签添加active属性</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>span</span><span> </span><span>className</span><span>=</span><span>{</span><span>"dot</span><span> </span><span>"+(index==this.state.pos?'active':'')}</span><span> </span><span>key</span><span>=</span><span>{index}</span><span> </span><span>onClick</span><span>=</span><span>{()</span><span>=</span><span>&gt;this.turn(index-this.state.pos)}&gt;&lt;/</span><span>span</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/React%E8%BD%AE%E6%92%AD%E5%9B%BE%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE%E5%8F%8A%E5%8E%9F%E7%90%86%E6%A6%82%E8%A6%81/</id>
      <title type="text">React轮播图（上）</title>
      <published>2017-07-31T00:00:00.000Z</published>
      <updated>2017-07-31T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/React%E8%BD%AE%E6%92%AD%E5%9B%BE%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE%E5%8F%8A%E5%8E%9F%E7%90%86%E6%A6%82%E8%A6%81/"/>
      <summary type="text">React轮播图项目配置及原理概要</summary>
      <content type="html"><![CDATA[<section><h2>项目配置及原理概要<a href="#项目配置及原理概要"><span>#</span></a></h2></section>
<section><h2>1.初始化项目<a href="#1初始化项目"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>npm</span><span> </span><span>init</span><span> </span></span><span>-</span><span>y</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>生成<code>package.json</code>文件</li>
</ul></section>
<section><h2>2.安装依赖包 开发依赖<a href="#2安装依赖包-开发依赖"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>npm</span><span> </span><span>install</span><span> </span><span>webpack</span><span> </span><span>webpack</span></span><span>-</span><span>dev</span><span>-</span><span><span>server</span><span> </span><span>babel</span></span><span>-</span><span><span>core</span><span> </span><span>babel</span></span><span>-</span><span><span>loader</span><span> </span><span>babel</span></span><span>-</span><span>preset</span><span>-</span><span><span>react</span><span> </span><span>babel</span></span><span>-</span><span>preset</span><span>-</span><span><span>es2015</span><span> </span><span>babel</span></span><span>-</span><span>preset</span><span>-</span><span>stage</span><span>-</span><span>0</span><span><span> </span><span>style</span></span><span>-</span><span><span>loader</span><span> </span><span>css</span></span><span>-</span><span><span>loader</span><span> </span><span>less</span></span><span>-</span><span><span>loader</span><span> </span><span>less</span><span> </span><span>file</span></span><span>-</span><span><span>loader</span><span> </span><span>url</span></span><span>-</span><span><span>loader</span><span> </span><span>html</span></span><span>-</span><span>webpack</span><span>-</span><span><span>plugin</span><span> </span></span><span>-</span><span>D</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li><code>webpack</code> 打包</li>
<li><code>webpack-dev-server</code> 用来启动一个<code>HTTP</code>服务器预览我们的项目</li>
<li><code>babel-core</code>、<code>babel-loader</code> 进行转译 把<code>es6</code>和<code>react</code>代码转译成<code>es5</code></li>
<li><code>babel-preset-react</code> 用来转译<code>react</code></li>
<li><code>babel-preset-es2015</code> 用来转译<code>es6</code></li>
<li><code>babel-preset-stage-0</code> 用来转译<code>es7</code></li>
<li><code>style-loader</code>、<code>css-loader</code> 用来处理<code>css</code></li>
<li><code>less-loader</code>、<code>less</code> 编译<code>less</code></li>
<li><code>file-loader</code>、<code>url-loader</code> 用来处理资源文件</li>
<li><code>html-webpack-plugin</code> 用来自动产出<code>html</code>文件</li>
<li><code>open-browser-webpack-plugin</code> 自动打开浏览器</li>
</ul></section>
<section><h2>3.安装生产依赖<a href="#3安装生产依赖"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>npm</span><span> </span><span>install</span><span> </span><span>react</span><span> </span><span>react</span></span><span>-</span><span><span>dom</span><span> </span></span><span>-</span><span>S</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>4.配置文件的出入口路径<a href="#4配置文件的出入口路径"><span>#</span></a></h2><ul>
<li>新建一个<code>webpack.config.js</code>文件，在文件中配置入口文件和出口路径</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>let</span><span><span> </span><span>path</span></span><span>=</span><span>require</span><span>(</span><span>'path'</span><span>);</span></div></div><div><div><div>2</div></div><div><span>module</span><span>.</span><span>exports</span><span>=</span><span>{</span></div></div><div><div><div>3</div></div><div><span>    </span><span>entry</span><span>:</span><span>'./src/index.js'</span><span>,</span><span>//入口文件</span></div></div><div><div><div>4</div></div><div><span>    </span><span>output</span><span>:</span><span>{</span><span>//出口配置</span></div></div><div><div><div>5</div></div><div><span>        </span><span>path</span><span>:</span><span><span>path</span><span>.</span></span><span>resolve</span><span>(</span><span>'build'</span><span>),</span><span>//出口文件路径</span></div></div><div><div><div>6</div></div><div><span>        </span><span>filename</span><span>:</span><span>'bundle.js'</span><span>//出口文件名称</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>5.启动安装的模块文件夹<code>node_modules</code>—&gt;<code>.bin</code>—&gt;<code>webpack.cmd</code>和<code>webpack-dev-server.cmd</code>文件<a href="#5启动安装的模块文件夹node_modulesbinwebpackcmd和webpack-dev-servercmd文件"><span>#</span></a></h2><ul>
<li>在<code>package.json</code>文件中的<code>scripts</code>标签进行匹配</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>"scripts"</span><span>: {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>"build"</span><span>:</span><span> </span><span>"webpack"</span><span>,</span></div></div><div><div><div>3</div></div><div><span>    </span><span>"dev"</span><span>:</span><span>"webpack-dev-server"</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>},</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>5-1.启动<code>webpack</code>和<code>webpack-dev</code><a href="#5-1启动webpack和webpack-dev"><span>#</span></a></h3><ul>
<li>在<code>cmd</code>中执行命令</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>npm</span><span> </span><span>run</span><span> </span><span>build</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<ol>
<li>在cmd窗口中显示</li>
</ol>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>    </span></span><span>Asset</span><span>     </span><span>Size</span><span>  </span><span>Chunks</span><span>             </span><span>Chunk</span><span> </span><span>Names</span></div></div><div><div><div>2</div></div><div><span><span>bundle</span><span>.</span></span><span>js</span><span>  </span><span>2.52</span><span><span> </span><span>kB</span><span>       </span></span><span>0</span><span><span>  [</span><span>emitted</span><span>]  </span><span>main</span></span></div></div><div><div><div>3</div></div><div><span><span>   </span></span><span>[</span><span>0</span><span>] .</span><span>/</span><span>src</span><span>/</span><span><span>index</span><span>.</span></span><span>js</span><span> </span><span>43</span><span><span> </span><span>bytes</span><span> {</span></span><span>0</span><span><span>} [</span><span>built</span><span>]</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>表示生成<code>bundle.js</code>一个文件</p><ul>
<li>
<ol>
<li>在当前项目文件夹下会自动生成一个<code>build</code>文件夹，同时在<code>build</code>文件夹下会自动生成<code>bundle.js</code>文件，我们的入口文件(<code>src</code>文件夹下的<code>index.js</code>)会自动打包到出口文件<code>bundle.js</code>中</li>
</ol>
</li>
</ul></section></section>
<section><h2>6.自动产出<code>html</code>文件<a href="#6自动产出html文件"><span>#</span></a></h2><section><h3>6-1.现在我们需要在<code>build</code>文件夹中新建一个<code>index.html</code>文件，然后引入<code>bundle.js</code>进行预览;但是现在我们希望这个文件不要手动创建了，希望他可以自动生成，要做到这一点，我们需要引入插件<code>html-webpack-plugin</code>(此插件在最初已经安装过,如果没有安装需安装后才可使用)<a href="#6-1现在我们需要在build文件夹中新建一个indexhtml文件然后引入bundlejs进行预览但是现在我们希望这个文件不要手动创建了希望他可以自动生成要做到这一点我们需要引入插件html-webpack-plugin此插件在最初已经安装过如果没有安装需安装后才可使用"><span>#</span></a></h3><ul>
<li>
<ol>
<li>在<code>webpack.config.js</code>中引入<code>html-webpack-plugin</code></li>
</ol>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>let</span><span><span> </span><span>HtmlWebPackPlugin</span></span><span>=</span><span>require</span><span>(</span><span>'html-webpack-plugin'</span><span>);</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<ol>
<li>同时给插件再添加个配置项<code>plugins,plugins</code>是个数组</li>
</ol>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>plugins</span><span>:[</span></span></div></div><div><div><div>2</div></div><div><span>    </span><span>new</span><span> </span><span>HtmlWebPackPlugin</span><span>({</span></div></div><div><div><div>3</div></div><div><span>        </span><span>template</span><span>:</span><span>'./src/index.html'</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>})</span></div></div><div><div><div>5</div></div><div><span>]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<ol>
<li><code>template</code> 模板 配置到时候会按照哪个模板来自动产出html文件 并且把它自动放到配置目录下—&gt;一般会在<code>src</code>文件夹下新建一个模板叫<code>index.html</code>。</li>
</ol>
</li>
<li>
<ol>
<li>执行<code>npm run build</code></li>
</ol>
</li>
<li>
<p>4-1) 原理&lt;此时如果再执行&gt;<code>npm run build</code>的话，就会执行上面配置的<code>plugins</code>插件,插件会读取<code>src</code>文件夹下的<code>index.html</code>模板文件，把他自动插入到打包后的<code>bundle.js</code>，并且把<code>bundle.js</code>保存到<code>build</code>目录下(每次执行<code>npm run build</code>命令，都会重新生成<code>bundle.js</code>和<code>index.html</code>两个文件)</p>
</li>
<li>
<p>4-2) 在<code>cmd</code>命令行执行<code>npm run build</code>,命令行显示:</p>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>     </span></span><span>Asset</span><span>       </span><span>Size</span><span>  </span><span>Chunks</span><span>             </span><span>Chunk</span><span> </span><span>Names</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>bundle</span><span>.</span><span>js</span><span>    </span><span>2.52</span><span><span> </span><span>kB</span><span>       </span></span><span>0</span><span><span>  [</span><span>emitted</span><span>]  </span><span>main</span></span></div></div><div><div><div>3</div></div><div><span><span>index</span><span>.</span></span><span>html</span><span>  </span><span>188</span><span><span> </span><span>bytes</span><span>          [</span><span>emitted</span><span>]</span></span></div></div><div><div><div>4</div></div><div><span><span>   </span></span><span>[</span><span>0</span><span>] .</span><span>/</span><span>src</span><span>/</span><span><span>index</span><span>.</span></span><span>js</span><span> </span><span>43</span><span><span> </span><span>bytes</span><span> {</span></span><span>0</span><span><span>} [</span><span>built</span><span>]</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>表示生成<code>bundle.js</code>和<code>index.html</code>两个文件,与之前执行<code>npm run build</code>相比多了一个<code>html</code>文件。</p><ul>
<li>4-3) 打开我们的项目文件夹下的<code>build</code>文件会发现，已经自动生成了一个出口<code>index.html</code>出口文件,打开这个<code>index.html</code>出口文件会发现,<code>index.html</code>中已经自动引入了<code>bundle.js</code>文件</li>
</ul><blockquote><p>关于react轮播图的源码,无缝版已上传至<a href="github,https://github.com/gaodaxiu0406/React-Slider">github,https://github.com/gaodaxiu0406/React-Slider</a></p></blockquote></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2%E6%9C%8D%E5%8A%A1%E5%99%A8/</id>
      <title type="text">如何安装部署服务器</title>
      <published>2017-07-31T00:00:00.000Z</published>
      <updated>2017-07-31T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
      <summary type="text">如何安装部署服务器</summary>
      <content type="html"><![CDATA[<section><h2>购买机器<a href="https://www.aliyun.com/" target="_blank">https://www.aliyun.com/</a><a href="#购买机器httpswwwaliyuncom"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>116.62</span><span>.</span><span>9.168</span></div></div><div><div><div>2</div></div><div><span><span>用户名</span><span>:</span><span>root</span></span></div></div><div><div><div>3</div></div><div><span><span>密码</span><span>:</span><span>Zfpx2017</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>连接服务器<a href="#连接服务器"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>ssh</span><span> </span><span>root</span><span>@</span></span><span>116.62</span><span>.</span><span>9.168</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>更新操作系统<a href="#更新操作系统"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>apt</span><span>-</span><span><span>get</span><span> </span><span>update</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>安装 npm<a href="#安装-npm"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>apt</span><span>-</span><span><span>get</span><span> </span><span>install</span><span> </span><span>npm</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>安装node<a href="#安装node"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>apt</span><span>-</span><span><span>get</span><span> </span><span>install</span><span> </span><span>npm</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>安装node版本管理器n n是node的管理器 可以通过他管理node的版本<a href="#安装node版本管理器n-n是node的管理器-可以通过他管理node的版本"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>npm</span><span> </span><span>install</span><span> </span><span>n</span><span> </span></span><span>-</span><span>g</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>安装node7.5版本<a href="#安装node75版本"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>n</span><span> </span></span><span>7.5</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>出现<code>node-v7.5.0</code>就安装成功了</p></section>
<section><h2>安装mongodb<a href="#安装mongodb"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>apt</span><span>-</span><span><span>get</span><span> </span><span>install</span><span> </span><span>mongodb</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>安装git<a href="#安装git"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>apt</span><span>-</span><span><span>get</span><span> </span><span>install</span><span> </span><span>git</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>克隆爬虫的地址<a href="#克隆爬虫的地址"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>git</span><span> </span><span>clone</span><span> </span><span>https</span><span>:</span></span><span>//github.com/zhufengnodejs/201704crawl.git</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>进入目录201704crawl<a href="#进入目录201704crawl"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cd</span><span> 201704</span><span>crawl</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>安装依赖<a href="#安装依赖"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>  </span></span><span>npm</span><span> </span><span>install</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>启动server.js<a href="#启动serverjs"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>node</span><span> </span><span>server</span><span>.</span></span><span>js</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>执行脚本main.js(先进入main.js所在的文件夹)<a href="#执行脚本mainjs先进入mainjs所在的文件夹"><span>#</span></a></h2><ul>
<li>1.进入main.js所在的文件夹执行main.js</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cd</span><span> </span><span>tasks</span></span></div></div><div><div><div>2</div></div><div><span><span>node</span><span> </span><span>main</span><span>.</span></span><span>js</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>2.ctrl+c结束掉之前的任务,再启动server.js</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>node</span><span> </span><span>server</span><span>.</span></span><span>js</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>访问(格式—&gt;ip&lt;端口号&gt;)<a href="#访问格式ip"><span>#</span></a></h2><ul>
<li>在浏览器输入地址<code>116.62.9.168:8080</code>访问
<ul>
<li><code>http://116.62.9.168:8080/</code></li>
</ul>
</li>
<li>此时还是静态网页 别人无法访问</li>
</ul></section>
<section><h2>在电脑上安装程序<code>Xftp 5</code><a href="#在电脑上安装程序xftp-5"><span>#</span></a></h2></section>
<section><h2>安装nginx<a href="#安装nginx"><span>#</span></a></h2><ul>
<li>Nginx是一个高性能的HTTP和反向代理服务器</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>apt</span><span>-</span><span><span>get</span><span> </span><span>install</span><span> </span><span>nginx</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>此时就可以上传自己的项目,访问自己的服务器</li>
<li>但是一旦窗口关掉,就无法访问</li>
</ul><section><h3>nginx命令<a href="#nginx命令"><span>#</span></a></h3><ul>
<li>启动 <code>nginx nginx -c /etc/nginx/nginx.conf</code></li>
<li>关闭 <code>nginx nginx -s stop</code></li>
<li>重读配置文件 <code>nginx -s reload kill -HUP nginx</code></li>
<li>常用命令 <code>service nginx {start|stop|status|restart|reload|configtest|}</code></li>
</ul></section><section><h3>配置nginx反向代理和负载均衡<a href="#配置nginx反向代理和负载均衡"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>upstream</span><span> </span><span>crawl</span><span>{</span></span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>ip_hash</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>server</span><span> </span><span>127.0</span><span>.</span><span>0.1</span><span>:</span><span>3000</span><span><span> </span><span>weight</span></span><span>=</span><span>10</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>server</span><span> </span><span>127.0</span><span>.</span><span>0.1</span><span>:</span><span>4000</span><span><span> </span><span>weight</span></span><span>=</span><span>1</span><span>;</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span><span>server</span><span> {</span></span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>listen</span><span> </span><span>80</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>server_name</span><span> </span><span>www</span><span>.</span><span>gdxiu</span><span>.</span><span>cn</span><span>;</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>location</span><span> </span><span>/</span><span> {</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>proxy_pass</span><span> </span><span>http</span><span>:</span><span>//crawl;</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h2>安装pm2<a href="#安装pm2"><span>#</span></a></h2><ul>
<li>强大的进程管理器 进程异常退出时pm2会尝试重启</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>npm</span><span> </span><span>install</span><span> </span><span>pm2</span><span> </span></span><span>-</span><span>g</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>进入201704crawl文件夹,在根目录下执行以下命令</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cd</span><span> </span></span><span>/</span><span>root</span></div></div><div><div><div>2</div></div><div><span><span>cd</span><span> 201704</span><span>crawl</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>切换到server.js文件所在目录,启动pm2应用</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>pm2</span><span> </span><span>start</span><span> </span><span>server</span><span>.</span></span><span>js</span><span> </span><span>--</span><span><span>name</span><span> </span></span><span>"crawl"</span></div></div><div><div><div>2</div></div><div><span>//即pm2 start server.js --name '自己取名字'</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>如何停止pm2上的项目<a href="#如何停止pm2上的项目"><span>#</span></a></h2><section><h3>1.查看node进程号<a href="#1查看node进程号"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span> </span></span><span>ps</span><span> </span><span>-</span><span><span>ef</span><span> </span></span><span>|</span><span><span> </span><span>grep</span><span> </span><span>node</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.停止<a href="#2停止"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>pm2</span><span> </span><span>stop</span><span> </span><span>crawl</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>3.杀死进程<a href="#3杀死进程"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>kill</span><span> </span></span><span>8796</span><span><span>(</span><span>进程号</span><span>)</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h2>复活&lt;如何重新建立连接&gt;<a href="#复活"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>pm2</span><span> </span><span>start</span><span> </span><span>server</span><span>.</span></span><span>js</span><span> </span><span>--</span><span><span>name</span><span> </span></span><span>"crawl"</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>启动<a href="#启动"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>pm2</span><span> </span><span>start</span><span> </span><span>crawl</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>pm2常用命令<a href="#pm2常用命令"><span>#</span></a></h2><p>用pm2启动node</p>

<table><thead><tr><th>命令</th><th>用途</th></tr></thead><tbody><tr><td>pm2 start app.js —name “crawl”</td><td>启动应用</td></tr><tr><td>pm2 list</td><td>查看所有应用</td></tr><tr><td>pm2 restart crawl</td><td>重启应用</td></tr><tr><td>pm2 stop crawl</td><td>停止应用</td></tr><tr><td>pm2 delete crawl</td><td>删除应用</td></tr></tbody></table><section><h3>关于scp命令<a href="#关于scp命令"><span>#</span></a></h3><ul>
<li>网址<a href="http://www.cnblogs.com/hitwtx/archive/2011/11/16/2251254.html" target="_blank">http://www.cnblogs.com/hitwtx/archive/2011/11/16/2251254.html</a></li>
</ul><p>cat 查看文件内容</p></section></section>
<section><h2>vi命令<a href="#vi命令"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>vi</span><span> </span><span>crawl</span></span></div></div><div><div><div>2</div></div><div><span><span>1000</span><span>dd</span></span><span>//删除1000行  vi的一个命令</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>重启服务<a href="#重启服务"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>nginx</span><span> </span></span><span>-</span><span><span>s</span><span> </span><span>reload</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>推荐视频地址<a href="#推荐视频地址"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>http</span><span>:</span></span><span>//www.ablesky.com/kecheng/detail_926049</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/%E7%A7%BB%E5%8A%A8%E7%AB%AFclick300-380ms%E5%BB%B6%E8%BF%9F%E9%97%AE%E9%A2%98/</id>
      <title type="text">移动端click300-380ms延迟问题</title>
      <published>2017-07-28T00:00:00.000Z</published>
      <updated>2017-07-28T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/%E7%A7%BB%E5%8A%A8%E7%AB%AFclick300-380ms%E5%BB%B6%E8%BF%9F%E9%97%AE%E9%A2%98/"/>
      <summary type="text">移动端click300-380ms延迟问题</summary>
      <content type="html"><![CDATA[<section><h1>移动设备上的web网页是有300ms延迟的，玩玩会造成按钮点击延迟甚至是点击失效。<a href="#移动设备上的web网页是有300ms延迟的玩玩会造成按钮点击延迟甚至是点击失效"><span>#</span></a></h1><section><h2>历史原因<a href="#历史原因"><span>#</span></a></h2><ul>
<li>来源一个公司内一个同事的分享&lt;2007年苹果发布首款iphone上ios系统搭载的safari为了将适用于pc端上大屏幕的网页能比较好的展示在手机端上&gt;，使用了双击缩放(double tap to zoom)的方案，比如你在手机上用浏览器打开一个PC上的网页，你可能在看到页面内容虽然可以撑满整个屏幕，但是字体、图片都很小看不清，此时可以快速双击屏幕上的某一部分，你就能看清该部分放大后的内容，再次双击后能回到原始状态。 双击缩放是指用手指在屏幕上快速点击两次，ios 自带的 Safari 浏览器会将网页缩放至原始比例。 原因就出在浏览器需要如何判断快速点击上，当用户在屏幕上单击某一个元素时候，例如跳转链接，此处浏览器会先捕获该次单击，但浏览器不能决定用户是单纯要点击链接还是要双击该部分区域进行缩放操作，所以，捕获第一次单击后，浏览器会先Hold一段时间t，如果在t时间区间里用户未进行下一次点击，则浏览器会做单击跳转链接的处理，如果t时间里用户进行了第二次单击操作，则浏览器会禁止跳转，转而进行对该部分区域页面的缩放操作。那么这个时间区间t有多少呢？在IOS safari下，大概为300毫秒。这就是延迟的由来。造成的后果用户纯粹单击页面，页面需要过一段时间才响应，给用户慢体验感觉，对于web开发者来说是，页面js捕获click事件的回调函数处理，需要300ms后才生效，也就间接导致影响其他业务逻辑的处理。</li>
</ul></section><section><h2>解决方案<a href="#解决方案"><span>#</span></a></h2><section><h3>1.tap.js解决方案<a href="#1tapjs解决方案"><span>#</span></a></h3><ul>
<li>使用 zepto.js 的 tap 事件，通过 singleTap 和 doubleTap 来区分单击和双击。但是会出现点击穿透，而且对于已经使用 click 的文件，改动成本太大。</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>script</span><span> </span><span>src</span><span>=</span><span>"tap.js"</span><span>&gt;&lt;/</span><span>script</span><span>&gt;</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>&lt;</span><span>div</span><span> </span><span>id</span><span>=</span><span>"container"</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>&lt;</span><span>button</span><span> </span><span>id</span><span>=</span><span>"button-1"</span><span>&gt;Click event&lt;/</span><span>button</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>&lt;</span><span>button</span><span> </span><span>id</span><span>=</span><span>"button-2"</span><span>&gt;Tap event&lt;/</span><span>button</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>&lt;</span><span>div</span><span> </span><span>id</span><span>=</span><span>"output"</span><span>&gt;&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>&lt;</span><span>script</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span>  </span><span>var</span><span><span> </span><span>container</span><span> </span></span><span>=</span><span><span> </span><span>document</span><span>.</span></span><span>getElementById</span><span>(</span><span>'container'</span><span>)</span></div></div><div><div><div>12</div></div><div><span>  </span><span>var</span><span><span> </span><span>button1</span><span> </span></span><span>=</span><span><span> </span><span>document</span><span>.</span></span><span>getElementById</span><span>(</span><span>'button-1'</span><span>);</span></div></div><div><div><div>13</div></div><div><span>  </span><span>var</span><span><span> </span><span>button2</span><span> </span></span><span>=</span><span><span> </span><span>document</span><span>.</span></span><span>getElementById</span><span>(</span><span>'button-2'</span><span>);</span></div></div><div><div><div>14</div></div><div><span>  </span><span>var</span><span><span> </span><span>output</span><span> </span></span><span>=</span><span><span> </span><span>document</span><span>.</span></span><span>getElementById</span><span>(</span><span>'output'</span><span>);</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>  </span><span>var</span><span><span> </span><span>tap</span><span> </span></span><span>=</span><span> </span><span>new</span><span> </span><span>Tap</span><span><span>(</span><span>container</span><span>);</span></span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span><span>  </span></span><span>button1</span><span>.</span><span>addEventListener</span><span>(</span><span>'click'</span><span><span>, </span><span>callback</span><span>, </span></span><span>false</span><span>);</span></div></div><div><div><div>19</div></div><div><span><span>  </span></span><span>button2</span><span>.</span><span>addEventListener</span><span>(</span><span>'tap'</span><span><span>, </span><span>callback</span><span>, </span></span><span>false</span><span>);</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>  </span><span>function</span><span> </span><span>callback</span><span><span> (</span><span>e</span><span>) {</span></span></div></div><div><div><div>22</div></div><div><span><span>      </span></span><span>e</span><span>.</span><span>preventDefault</span><span>();</span></div></div><div><div><div>23</div></div><div><span>      </span><span>var</span><span><span> </span><span>p</span><span> </span></span><span>=</span><span><span> </span><span>document</span><span>.</span></span><span>createElement</span><span>(</span><span>'p'</span><span>);</span></div></div><div><div><div>24</div></div><div><span><span>      </span></span><span>p</span><span>.</span><span>textContent</span><span> </span><span>=</span><span> </span><span>'event: '</span><span> </span><span>+</span><span><span> </span><span>e</span><span>.</span></span><span>type</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>      </span></span><span>output</span><span>.</span><span>insertBefore</span><span><span>(</span><span>p</span><span>, </span><span>output</span><span>.</span></span><span>firstChild</span><span>);</span></div></div><div><div><div>26</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>&lt;/</span><span>script</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>2.对于高版本chrome和firefox，可以通过禁用伸缩，即在 head 上的 meta 标签添加 user-scalable = no。如下：<a href="#2对于高版本chrome和firefox可以通过禁用伸缩即在-head-上的-meta-标签添加-user-scalable--no如下"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>meta</span><span> </span><span>name</span><span>=</span><span>"viewport"</span><span> </span><span>content</span><span>=</span><span>"width=device-width, user-scalable=no"</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>3.chrome32+ 可以将 viewport 的宽度设置成 device-width.<a href="#3chrome32-可以将-viewport-的宽度设置成-device-width"><span>#</span></a></h3></section><section><h3>4.IE10+，可以使用 pointerEvents。可以让特定的元素或者整个文档中的元素移除点击延迟的问题，同时不会影响 pinch-zooming<a href="#4ie10可以使用-pointerevents可以让特定的元素或者整个文档中的元素移除点击延迟的问题同时不会影响-pinch-zooming"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>a</span><span><span>,</span><span> </span></span><span>button</span><span><span>,</span><span> </span></span><span>.myelements</span></div></div><div><div><div>2</div></div><div><span>{</span></div></div><div><div><div>3</div></div><div><span>-ms-touch-action</span><span><span>: </span><span>manipulation</span><span>;    </span></span><span>/* IE10  */</span></div></div><div><div><div>4</div></div><div><span><span>touch-action: </span><span>manipulation</span><span>;        </span></span><span>/* IE11+ */</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>5.通过 touchend 事件代替 click 事件<a href="#5通过-touchend-事件代替-click-事件"><span>#</span></a></h3></section><section><h3>6.fastclick.js解决方法<a href="#6fastclickjs解决方法"><span>#</span></a></h3><ul>
<li>终极大 boss。 fastclick。上面的几种方法都是针对某些浏览器，或者某些浏览器的某些版本，或者会影响到我们平常使用方式的解决方案。使用起来不方便且考虑的细节很多，实践难度比较大。fastclick 作为一个终极的解决方案，使用方便，文件大小压缩后只有 3.3k。对于交互相对复杂的移动端web页面或应用是一个相对不错的解决方案。</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>html</span><span> </span><span>xmlns</span><span>=</span><span>"http://www.w3.org/1999/xhtml"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>head</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>&lt;</span><span>title</span><span>&gt;&lt;/</span><span>title</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span>        </span><span>*</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>{</span></div></div><div><div><div>7</div></div><div><span><span>            </span></span><span>margin: </span><span>0</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span>        </span><span>body</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>{</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span>        </span><span>.button</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>{</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>background-color: </span><span>#</span><span>3d3d3d</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>border: </span><span><span>0</span><span>px</span></span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>height: </span><span><span>80</span><span>px</span></span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>            </span></span><span>width: </span><span><span>80</span><span>%</span></span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>font-size: </span><span><span>50</span><span>px</span></span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>margin: </span><span><span>10</span><span>%</span></span><span> </span><span><span>0</span><span>%</span></span><span> </span><span><span>0</span><span>%</span></span><span> </span><span><span>10</span><span>%</span></span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>color: </span><span>#</span><span>fff</span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>        </span><span>.fu</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>{</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>min-height: </span><span><span>100</span><span>%</span></span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>min-width: </span><span><span>100</span><span>%</span></span><span>;</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>background-color: </span><span>Black</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>background: </span><span>rgba</span><span>(</span><span>0</span><span>,</span><span>0</span><span>,</span><span>0</span><span>,</span><span>0.4</span><span>);</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>position: </span><span>absolute</span><span>;</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>top: </span><span>0</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>text-align: </span><span>center</span><span>;</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>display: </span><span>none</span><span>;</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span>        </span><span>.ts</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>{</span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>margin: </span><span><span>8</span><span>%</span></span><span><span> </span><span>auto</span><span>;</span></span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>width: </span><span><span>400</span><span>px</span></span><span>;</span></div></div><div><div><div>37</div></div><div><span><span>            </span></span><span>height: </span><span><span>400</span><span>px</span></span><span>;</span></div></div><div><div><div>38</div></div><div><span><span>            </span></span><span>top: </span><span><span>59</span><span>%</span></span><span>;</span></div></div><div><div><div>39</div></div><div><span><span>            </span></span><span>background-color: </span><span>#</span><span>fff</span><span>;</span></div></div><div><div><div>40</div></div><div><span><span>            </span></span><span>text-align: </span><span>center</span><span>;</span></div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span><span>    </span></span><span>&lt;/</span><span>style</span><span>&gt;</span></div></div><div><div><div>43</div></div><div><span><span>    </span></span><span>&lt;</span><span>script</span><span> </span><span>src</span><span>=</span><span>"fastclick.js"</span><span> </span><span>type</span><span>=</span><span>"text/javascript"</span><span>&gt;&lt;/</span><span>script</span><span>&gt;</span></div></div><div><div><div>44</div></div><div><span><span>    </span></span><span>&lt;</span><span>script</span><span> </span><span>src</span><span>=</span><span>"jquery-1.7.2.js"</span><span> </span><span>type</span><span>=</span><span>"text/javascript"</span><span>&gt;&lt;/</span><span>script</span><span>&gt;</span></div></div><div><div><div>45</div></div><div><span><span>    </span></span><span>//javascript:</span></div></div><div><div><div>46</div></div><div><span><span>    </span></span><span>&lt;</span><span>script</span><span> </span><span>type</span><span>=</span><span>"application/javascript"</span><span>&gt;</span></div></div><div><div><div>47</div></div><div><span><span>        </span></span><span>window</span><span>.</span><span>addEventListener</span><span>(</span><span>'load'</span><span>, </span><span>function</span><span> () {</span></div></div><div><div><div>48</div></div><div><span><span>            </span></span><span>FastClick</span><span>.</span><span>attach</span><span><span>(</span><span>document</span><span>.</span></span><span>body</span><span>);</span></div></div><div><div><div>49</div></div><div><span><span>        </span></span><span>}, </span><span>false</span><span>);</span></div></div><div><div><div>50</div></div><div><span>        </span><span>function</span><span> </span><span>xian</span><span>() {</span></div></div><div><div><div>51</div></div><div><span>            </span><span>$</span><span>(</span><span>".fu"</span><span>).</span><span>show</span><span>().</span><span>hide</span><span>(</span><span>350</span><span>);</span></div></div><div><div><div>52</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>53</div></div><div><span><span>    </span></span><span>&lt;/</span><span>script</span><span>&gt;</span></div></div><div><div><div>54</div></div><div><span><span>    </span></span><span>//jQuery:</span></div></div><div><div><div>55</div></div><div><span><span>    </span></span><span>&lt;</span><span>script</span><span>&gt;</span></div></div><div><div><div>56</div></div><div><span><span>        </span></span><span>window</span><span>.</span><span>addEventListener</span><span>(</span><span>'load'</span><span>, </span><span>function</span><span> () {</span></div></div><div><div><div>57</div></div><div><span>$</span><span>(</span><span>function</span><span>() {</span></div></div><div><div><div>58</div></div><div><span><span>        </span></span><span>FastClick</span><span>.</span><span>attach</span><span><span>(</span><span>document</span><span>.</span></span><span>body</span><span>);</span></div></div><div><div><div>59</div></div><div><span><span>    </span></span><span>});</span></div></div><div><div><div>60</div></div><div><span>    </span><span>&lt;/</span><span>script</span><span>&gt;</span></div></div><div><div><div>61</div></div><div><span>    </span><span>//CommonJS:</span></div></div><div><div><div>62</div></div><div><span><span>attachFastClick</span><span> </span></span><span>=</span><span> </span><span>require</span><span>(</span><span>'fastclick'</span><span>);</span></div></div><div><div><div>63</div></div><div><span>    </span><span>attachFastClick</span><span><span>(</span><span>document</span><span>.</span></span><span>body</span><span>);</span></div></div><div><div><div>64</div></div><div><span><span>    </span></span><span>AMD</span><span>:</span></div></div><div><div><div>65</div></div><div><span>    </span><span>var</span><span><span> </span><span>FastClick</span><span> </span></span><span>=</span><span> </span><span>require</span><span>(</span><span>'fastclick'</span><span>);</span></div></div><div><div><div>66</div></div><div><span><span>    </span></span><span>FastClick</span><span>.</span><span>attach</span><span><span>(</span><span>document</span><span>.</span></span><span>body</span><span><span>, </span><span>options</span><span>);</span></span></div></div><div><div><div>67</div></div><div><span>&lt;/</span><span>head</span><span>&gt;</span></div></div><div><div><div>68</div></div><div><span>&lt;</span><span>body</span><span>&gt;</span></div></div><div><div><div>69</div></div><div><span><span>    </span></span><span>&lt;</span><span>div</span><span>&gt;</span></div></div><div><div><div>70</div></div><div><span><span>        </span></span><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"but"</span><span>&gt;</span></div></div><div><div><div>71</div></div><div><span><span>            </span></span><span>&lt;</span><span>input</span><span> </span><span>class</span><span>=</span><span>"button"</span><span> </span><span>type</span><span>=</span><span>"button"</span><span> </span><span>value</span><span>=</span><span>"点击我"</span><span> </span><span>onclick</span><span>=</span><span>"xian()"</span><span> /&gt;&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>72</div></div><div><span><span>        </span></span><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"fu"</span><span> &gt;</span></div></div><div><div><div>73</div></div><div><span><span>            </span></span><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"ts"</span><span>&gt;</span></div></div><div><div><div>74</div></div><div><span><span>                </span></span><span>我是浮层</span></div></div><div><div><div>75</div></div><div><span><span>            </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>76</div></div><div><span><span>        </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>77</div></div><div><span><span>    </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>78</div></div><div><span>&lt;/</span><span>body</span><span>&gt;</span></div></div><div><div><div>79</div></div><div><span>&lt;/</span><span>html</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/CSS%E9%80%89%E6%8B%A9%E5%99%A8%E7%A7%8D%E7%B1%BB%E5%92%8C%E5%85%BC%E5%AE%B9%E6%80%A7%E6%80%BB%E7%BB%93%E5%A4%A7%E5%85%A8/</id>
      <title type="text">CSS选择器种类和兼容性总结大全</title>
      <published>2017-07-21T00:00:00.000Z</published>
      <updated>2017-07-21T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/CSS%E9%80%89%E6%8B%A9%E5%99%A8%E7%A7%8D%E7%B1%BB%E5%92%8C%E5%85%BC%E5%AE%B9%E6%80%A7%E6%80%BB%E7%BB%93%E5%A4%A7%E5%85%A8/"/>
      <summary type="text">CSS选择器种类和兼容性总结大全</summary>
      <content type="html"><![CDATA[<section><h2>css5选择器<a href="#css5选择器"><span>#</span></a></h2>

<table><thead><tr><th>名称</th><th>举例</th><th>描述</th><th>详细</th><th>权重</th><th>ie6-7</th><th>ie8</th><th>ie9+</th><th>其他</th></tr></thead><tbody><tr><td>标签选择器</td><td>p{}</td><td>直接使用元素标签进行选择</td><td></td><td>1</td><td>yes</td><td>yes</td><td>yes</td><td></td></tr><tr><td>类选择器</td><td>.sum{}</td><td>类选择器最前方一定要有点</td><td>通过元素的类名，来选择元素，一个元素可以有多个类名，都代表这个元素,类名是元素class属性中的属性值，例如<code>&lt;p class='sum'&gt;&lt;/p&gt;</code></td><td>10</td><td>yes</td><td>yes</td><td>yes</td><td></td></tr><tr><td>id选择器</td><td>#tytle{color;}</td><td>id在html中具有唯一性,这个属性值前面加一个“#”</td><td>一个html元素，id属性值只能用一次</td><td>100</td><td>yes</td><td>yes</td><td>yes</td><td></td></tr><tr><td>通配符选择器</td><td>*{key}</td><td>匹配全部html元素</td><td>一般不使用，因为全部匹配耗性能</td><td>0&lt;通配符选择器&lt;1</td><td>yes</td><td>yes</td><td>yes</td><td>yes</td></tr><tr><td>(标签)属性选择器</td><td>[type]或[type=text]</td><td>[标签属性名]{}或[标签属性名=属性值]{}</td><td>利用标签的属性名和属性值来选择html元素</td><td>10</td><td>yes</td><td>yes</td><td>yes</td><td>属性选择器在使用的时候，如果一个元素有两个类名，那么是不生效的</td></tr><tr><td>分组选择器</td><td>.box,li,.p1{color: red};</td><td>选择器1，选择器2，选择器3{}</td><td>同一份css样式，可以一次性的添加给多个不同的html元素</td><td>分组选择器将不同的html分为一组，权重计算的时候都是独立计算，不会叠加。</td><td>yes</td><td>yes</td><td>yes</td><td></td></tr><tr><td>交集选择器</td><td>h2[title]{}</td><td></td><td>两种选择器同属于一个元素的时候，我们可以使用交集选择器来进行元素的准确选择</td><td>所有组合选择器权重之和</td><td>yes</td><td>yes</td><td>yes</td><td>作用：精确查找元素，增加选择器的权重</td></tr><tr><td>子级选择器</td><td>ul&gt;li{color;}</td><td>父级选择器&gt;子级选择器{}</td><td>存在包含关系的元素选择，通过父级确定选择子级</td><td>所有选择器之和</td><td>yes</td><td>yes</td><td>yes</td><td>子级选择器必须是紧邻的父子关系</td></tr><tr><td>后代选择器(派生选择器)</td><td>.div1 ul span{}</td><td>祖辈选择器 要查找的后代选择器{},中间用空格连接</td><td>后代选择器在写的时候尽量控制在３个左右</td><td></td><td>yes</td><td>yes</td><td>yes</td><td>在一个根元素的范围内，查找到它的后代元素，选择器过多浪费性能，不建议使用</td></tr><tr><td>相邻兄弟选择器</td><td>.list1+li{color: red;}</td><td>哥哥选择器+弟弟选择器{}</td><td>通过各个元素选择弟弟选择器，两个选择器之间用“+”连接</td><td>选择器之和</td><td>yes</td><td>yes</td><td>yes</td><td></td></tr><tr><td>伪类选择器</td><td><code>a:hover{color: red}鼠标经过的状态,或a:link{color: blue}默认状态,或a：active{color: green}鼠标点击的状态,或a:visited{color: blanchedalmond}鼠标点击后的状态</code></td><td></td><td></td><td>10</td><td>yes</td><td>yes</td><td>yes</td><td>.input;input 鼠标聚焦后的状态，input独有的属性</td></tr><tr><td>伪元素</td><td>div；或div</td><td>通过css代码向指定元素<strong>内</strong>添加假的（html中不存在的）元素</td><td>before 会出现在div所有内容之前，after 会出现在div所有内容之后</td><td></td><td>no</td><td>yes</td><td>yes</td><td>使用伪元素的时候要保证两个前提：1.要有display这个属性2.要有content这个属性，这个属性的属性值可以为空，但是引号不能少<code>content:""</code></td></tr><tr><td></td><td>visited</td><td></td><td></td><td></td><td>security issue</td><td>yes</td><td>yes</td><td>security issue</td></tr></tbody></table></section>
<section><h2>css3选择器<a href="#css3选择器"><span>#</span></a></h2>

<table><thead><tr><th>名称</th><th>举例</th><th>描述</th><th>详细</th><th>权重</th><th>ie6-7</th><th>ie8</th><th>ie9+</th><th>其他</th></tr></thead><tbody><tr><td>属性选择器</td><td><code>E[attr~=value]{}</code></td><td></td><td>指定属性名,并且具有属性值,此属性值是一个此列表(类名),并且以空格隔开,其中词列表中包含了一个value词,并且等号前的~不能省略.</td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td><code>E[attr^=value]{}</code></td><td></td><td>^ 表示以谁为开头的,value可以是首字母或者类名</td><td>必须是第一个类名</td><td></td><td></td><td></td><td></td></tr><tr><td></td><td><code>E[attr$=value]{}</code></td><td></td><td>$ 表示以谁为结尾,value可以是末尾字母或者类名</td><td>必须是最后一个类名</td><td></td><td></td><td></td><td></td></tr><tr><td></td><td><code>E[attr\=value]{}</code>(由于编辑呈现问题，此处用斜杠代替竖杠,正确写法是<code>E[attr竖杠=value]{}</code>)</td><td>如果只有一个类名,没有”-“,也可以选中</td><td>value必须后面带”-“，value必须是第一个类名</td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>伪类选择器1.</td><td>.dome p(3){background: red;}选择dome下的第三个p标签为背景色红色</td><td></td><td></td><td></td><td>no</td><td>no</td><td>yes</td><td></td></tr><tr><td>2.</td><td>.dome p{background: yellow;}选择dome下的第一个p标签为背景色黄色</td><td></td><td></td><td></td><td>no</td><td>almost</td><td>yes</td><td></td></tr><tr><td>3.</td><td>.dome p{background: black;}选择dome下的最后一个p标签为背景色黑色</td><td></td><td>伪类选择器是针对列表或者很多同级的标签使用,img下是没有效果的也用不到伪类选择器</td><td></td><td>no</td><td>no</td><td>yes</td><td></td></tr><tr><td>4.</td><td>.dome p(nlength){}；选择dome下所有的p标签</td><td></td><td></td><td></td><td>no</td><td>no</td><td>yes</td><td></td></tr><tr><td>5.</td><td>.dome p(2n){}；选择dome下的所有偶数个的p标签</td><td></td><td></td><td></td><td>no</td><td>no</td><td>yes</td><td></td></tr><tr><td>6.</td><td>.dome p(3n)选择dome下的所有3的倍数的p标签</td><td></td><td></td><td></td><td>no</td><td>no</td><td>yes</td><td></td></tr><tr><td>7.</td><td>.dome p(n+length)</td><td>从第length个开始改变,包括第length个(n是从0开始取值的)</td><td>选择大于length后面的元素</td><td></td><td>no</td><td>no</td><td>yes</td><td></td></tr><tr><td>8.</td><td>.dome p(-n+length)</td><td>包括length，length是从0开始的</td><td>选择小于length前面的元素及length元素</td><td></td><td>no</td><td>no</td><td>yes</td><td></td></tr><tr><td>9.</td><td>p(3)</td><td>选择倒数第三个元素</td><td></td><td></td><td>no</td><td>no</td><td>yes</td><td></td></tr><tr><td>10.</td><td>p(n)</td><td>从大盒子的第一个元素开始</td><td>nth-child选择同级元素</td><td></td><td>no</td><td>no</td><td>yes</td><td></td></tr><tr><td>11.</td><td>p(n)</td><td>从大盒子的第一个p元素开始</td><td>nth-of-type 选择指定的元素</td><td></td><td>no</td><td>no</td><td>yes</td><td></td></tr><tr><td>12.</td><td>p(n)</td><td>倒数第n个</td><td>在同级元素中</td><td></td><td>no</td><td>no</td><td>yes</td><td></td></tr><tr><td>13.</td><td>p</td><td>同类型的第一个</td><td>选择一个上级元素下的同类子元素</td><td></td><td>no</td><td>no</td><td>yes</td><td></td></tr><tr><td>14.</td><td>p</td><td>同类型的最后一个</td><td></td><td></td><td>no</td><td>no</td><td>yes</td><td></td></tr><tr><td>15.</td><td>p</td><td>在父元素中,里面的子元素是唯一的</td><td></td><td></td><td>no</td><td>no</td><td>yes</td><td></td></tr><tr><td>16.</td><td>p</td><td>在父元素中,里面有很多的子元素,但是有一个子元素是唯一的</td><td></td><td></td><td>no</td><td>no</td><td>yes</td><td></td></tr><tr><td>空标签</td><td>p{display;}</td><td>empty 隐藏空标签</td><td></td><td></td><td>no</td><td>no</td><td>yes</td><td></td></tr><tr><td>否定选择器</td><td>not input([type=submit]){}</td><td></td><td></td><td></td><td>no</td><td>yes</td><td>yes</td><td></td></tr><tr><td>根元素</td><td>root </td><td>选择文档的根元素</td><td></td><td></td><td>no</td><td>no</td><td>yes</td><td></td></tr><tr><td>目标元素</td><td></td><td>选择器可用于选取当前活动的目标元素</td><td></td><td></td><td>no</td><td>no</td><td>no</td><td></td></tr></tbody></table></section>
<section><h2>CSS选择器优先级<a href="#css选择器优先级"><span>#</span></a></h2><ul>
<li>当两个规则都作用到了同一个html元素上时，如果定义的属性有冲突，那么应该用谁的值的，CSS有一套优先级的定义</li>
</ul></section>
<section><h2>不同级别<a href="#不同级别"><span>#</span></a></h2><ul>
<li>1.在属性后面使用important会覆盖页面内任何位置定义的元素样式</li>
<li>2.作为style属性写在元素内的样式</li>
<li>3.id选择器</li>
<li>4.类选择器</li>
<li>5.标签选择器</li>
<li>6.通配符选择器</li>
<li>7.浏览器自定义或继承</li>
</ul></section>
<section><h2>总结CSS选择器优先级排序<a href="#总结css选择器优先级排序"><span>#</span></a></h2><blockquote><p>!important&gt;行内样式&gt;ID选择器&gt;类选择器&gt;标签&gt;通配符&gt;继承&gt;浏览器默认属性</p></blockquote></section>
<section><h2>CSS样式应用，有个简单的计算方式(权值实际并不是按照十进制，用数字表示只是说明思想，一万个class可能也不如一个id权值高)<a href="#css样式应用有个简单的计算方式权值实际并不是按照十进制用数字表示只是说明思想一万个class可能也不如一个id权值高"><span>#</span></a></h2><ul>
<li>内联样式表的权值为 1000</li>
<li>ID选择器的权值为 100</li>
<li>Class类选择器的权值为 10</li>
<li>HTML标签选择器的权值为 1</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/IP%E5%88%86%E7%B1%BB/</id>
      <title type="text">IP分类</title>
      <published>2017-07-05T00:00:00.000Z</published>
      <updated>2017-07-05T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/IP%E5%88%86%E7%B1%BB/"/>
      <summary type="text">IP分类</summary>
      <content type="html"><![CDATA[<section><h3>每个IP地址包括两个标识码（ID），即网络ID和主机ID。同一个物理网络上的所有主机都使用同一个网络ID，网络上的一个主机（包括网络上工作站，服务器和路由器等）有一个主机ID与其对应。<a href="#每个ip地址包括两个标识码id即网络id和主机id同一个物理网络上的所有主机都使用同一个网络id网络上的一个主机包括网络上工作站服务器和路由器等有一个主机id与其对应"><span>#</span></a></h3></section>
<section><h3>IP地址根据网络ID的不同分为5种类型，A类地址、B类地址、C类地址、D类地址和E类地址<a href="#ip地址根据网络id的不同分为5种类型a类地址b类地址c类地址d类地址和e类地址"><span>#</span></a></h3></section>
<section><h2>A类ip地址<a href="#a类ip地址"><span>#</span></a></h2><ul>
<li>A&lt;0-127&gt; <strong>A类ip地址的第一组数字为1～126。</strong></li>
<li>其中0代表任何地址，127为回环测试地址
<ul>
<li><strong>注意，数字0和 127不作为A类地址，数字127保留给内部回送函数，而数字0则表示该地址是本地宿主机，不能传送。</strong></li>
</ul>
</li>
<li>A类地址的表示范围为：0.0.0.0~126.255.255.255,默认网络掩码为：255.0.0.0；A类地址分配给规模特别大的网络使用。A类网络用第一组数字表示网络本身的地址，后面三组数字作为连接于网络上的主机的地址。分配给具有大量主机（直接个人用户）而局域网络个数较少的大型网络。例如IBM公司的网络。</li>
</ul><blockquote><p>一个A类IP地址由1字节的网络地址和3字节主机地址组成，网络地址的最高位必须是“0”， 地址范围从1.0.0.0 到126.0.0.0。可用的A类网络有126个，每个网络能容纳1亿多个主机。</p></blockquote></section>
<section><h2>B类ip地址<a href="#b类ip地址"><span>#</span></a></h2><ul>
<li><strong>B类地址的第一组数字为128～191。</strong></li>
<li>其中128.0.0.0和191.255.0.0为保留ip。</li>
<li>B类地址的表示范围为&lt;128&gt;.0.0.0~191.255.255.255，默认网络掩码为&lt;255&gt;.255.0.0;实际范围是128.1.0.0—191.254.0.0;B类地址分配给一般的中型网络。B类网络用第一、二组数字表示网络的地址，后面两组数字代表网络上的主机地址。</li>
</ul><blockquote><p>一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成，网络地址的最高位必须是“10”，地址范围从128.0.0.0到191.255.255.255。可用的B类网络有16382个，每个网络能容纳6万多个主机 。</p></blockquote></section>
<section><h2>C类ip地址<a href="#c类ip地址"><span>#</span></a></h2><ul>
<li><strong>C类地址的第一组数字为192～223。</strong></li>
<li>其中192.0.0.0和223.255.255.0为保留ip</li>
<li>C类地址的表示范围为&lt;192&gt;.0.0.0~223.255.255.255,默认网络掩码为：255.255.255.0;实际范围是192.0.1.0—223.255.254.0;C类地址分配给小型网络，如一般的局域网和校园网，它可连接的主机数量是最少的，采用把所属的用户分为若干的网段进行管理。C类网络用前三组数字表示网络的地址，最后一组数字作为网络上的主机地址。</li>
</ul><blockquote><p>一个C类IP地址由3字节的网络地址和1字节的主机地址组成，网络地址的最高位必须是“110”。范围从192.0.0.0到223.255.255.255。C类网络可达209万余个，每个网络能容纳254个主机。</p></blockquote></section>
<section><h2>D类ip地址<a href="#d类ip地址"><span>#</span></a></h2><ul>
<li>224.0.0.0到239.255.255.255用于多点广播</li>
</ul><blockquote><p>D类IP地址第一个字节以“lll0”开始，它是一个专门保留的地址。它并不指向特定的网络，目前这一类地址被用在多点广播（Multicast）中。多点广播地址用来一次寻址一组计算机，它标识共享同一协议的一组计算机。</p></blockquote><ul>
<li>D类地址称为广播地址，供特殊协议向选定的节点发送信息时用</li>
</ul></section>
<section><h2>E类ip地址<a href="#e类ip地址"><span>#</span></a></h2><ul>
<li>240.0.0.0到255.255.255.254</li>
<li>255.255.255.255用于广播地址</li>
</ul><blockquote><p>以“llll0”开始，为将来使用保留。</p></blockquote><ul>
<li>E类地址保留给将来使用。</li>
</ul><section><h3>全零（“0．0．0．0”）地址对应于当前主机。全“1”的IP地址（“255．255．255．255”）是当前子网的广播地址。<a href="#全零0000地址对应于当前主机全1的ip地址255255255255是当前子网的广播地址"><span>#</span></a></h3></section></section>
<section><h2>保留地址的分配<a href="#保留地址的分配"><span>#</span></a></h2><p>一个机构网络要连入Internet，必须申请公用IP地址。但是考虑到网络安全和内部实验等特殊情况，在IP地址中专门保留了三个区域作为私有地址，其地址范围如下：
10.0.0.0/8&lt;10&gt;.0.0.0-10.255.255.255
172.16.0.0/12&lt;172&gt;.16.0.0-172.31.255.255
192.168.0.0/16&lt;192&gt;.168.0.0-192.168.255.255
使用保留地址的网络只能在内部进行通信，而不能与其他网络互连。因为本网络中的保留地址同样也可能被其它网络使用，如果进行网络互连，那么寻找路由时就会因为地址的不唯一而出现问题。但是这些使用保留地址的网络可以通过将本网络内的保留地址翻译转换成公共地址的方式实现与外部网络的互连。这也是保证网络安全的重要方法之一。</p></section>
<section><h2>特殊IP地址(保留IP地址)介绍<a href="#特殊ip地址保留ip地址介绍"><span>#</span></a></h2><section><h3>就像我们每个人都有一个身份证号码一样，网络里的每台电脑(更确切地说，是每一个设备的网络接口)都有一个IP地址用于标示自己。我们可能都知道这些地址由四个字节组成，用点分十进制表示以及它们的A，B，C分类等，然而，在总数大约为四十多亿个可用IP 地址里，你知道下面一些常见的有特殊意义地址吗？我们一起来看看吧：<a href="#就像我们每个人都有一个身份证号码一样网络里的每台电脑更确切地说是每一个设备的网络接口都有一个ip地址用于标示自己我们可能都知道这些地址由四个字节组成用点分十进制表示以及它们的abc分类等然而在总数大约为四十多亿个可用ip-地址里你知道下面一些常见的有特殊意义地址吗我们一起来看看吧"><span>#</span></a></h3><ul>
<li>一、0.0.0.0</li>
</ul><p>严格说来，0.0.0.0已经不是一个真正意义上的IP地址了。它表示的是这样一个集合：所有不清楚的主机和目的网络。这里的“不清楚”是指在本机的路由表里没有特定条目指明如何到达。对本机来说，它就是一个“收容所”，所有不认识的“三无”人员，一 律送进去。如果你在网络设置中设置了缺省网关，那么Windows系统会自动产生一个目的地址为0.0.0.0的缺省路由。</p><ul>
<li>二、255.255.255.255</li>
</ul><p>限制广播地址。对本机来说，这个地址指本网段内(同一广播域)的所有主机。如果翻译成人类的语言，应该是这样：“这个房间里的所有人都注意了！”这个地址不能被路由器转发。</p><ul>
<li>三、127.0.0.1</li>
</ul><p>本机地址，主要用于测试。用汉语表示，就是“我自己”。在Windows系统中，这个地址有一个别名“Localhost”。寻址这样一个地址，是不能把它发到网络接口的。除非出错，否则在传输介质上永远不应该出现目的地址为“127.0.0.1”的 数据包。</p><ul>
<li>四、224.0.0.1</li>
</ul><p>组播地址，注意它和广播的区别。从224.0.0.0到239.255.255.255都是这样的地址。224.0.0.1特指所有主机，224.0.0.2特指所有路由器。这样的地址多用于一些特定的程序以及多媒体程序。如果你的主机开启了IRDP (Internet路由发现协议，使用组播功能)功能，那么你的主机路由表中应该有这样一条路由。</p><ul>
<li>五、169.254.x.x</li>
</ul><p>如果你的主机使用了DHCP功能自动获得一个IP地址，那么当你的DHCP服务器发生故障，或响应时间太长而超出了一个系统规定的时间，Wingdows系统会为你分配这样一个地址。如果你发现你的主机IP地址是一个诸如此类的地址，很不幸，十有八九 是你的网络不能正常运行了。</p><ul>
<li>六、10.x.x.x、172.16。x。x～172.31。x。x、192.168。x。x</li>
</ul><p>私有地址，这些地址被大量用于企业内部网络中。一些宽带路由器，也往往使用192.168.1.1作为缺省地址。私有网络由于不与外部互连，因而可能使用随意的IP地址。保留这样的地址供其使用是为了避免以后接入公网时引起地址混乱。使用私有地址的私 有网络在接入Internet时，要使用地址翻译(NAT)，将私有地址翻译成公用合法地址。在Internet上，这类地址是不能出现的。
对一台网络上的主机来说，它可以正常接收的合法目的网络地址有三种：本机的IP地址、广播地址以及组播地址。</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/CSS%E4%B8%AD%E5%B8%B8%E7%94%A8%E7%9A%84HTML%E5%85%83%E7%B4%A0%E5%8F%8A%E6%A0%87%E7%AD%BE/</id>
      <title type="text">CSS中常用的HTML元素及标签</title>
      <published>2017-06-30T00:00:00.000Z</published>
      <updated>2017-06-30T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/CSS%E4%B8%AD%E5%B8%B8%E7%94%A8%E7%9A%84HTML%E5%85%83%E7%B4%A0%E5%8F%8A%E6%A0%87%E7%AD%BE/"/>
      <summary type="text">CSS中常用的HTML元素及标签</summary>
      <content type="html"><![CDATA[<section><h3>常用的HTML标签总结<a href="#常用的html标签总结"><span>#</span></a></h3><ul>
<li>
<ol>
<li>div 无意义标签，用来区分网页大模块，例如网页头部、主题内容、尾部</li>
</ol>
</li>
</ul><p><code>&lt;div&gt;无意义元素，用它来区分网页大模块&lt;/div&gt;</code></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>banner</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>div</span><span>&gt;区分模块</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>&lt;</span><span>a</span><span> </span><span>href</span><span>=</span><span>"http://www.baidu.com"</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>&lt;</span><span>img</span><span> </span><span>src</span><span>=</span><span>"pic.jpg"</span><span> </span><span>alt</span><span>=</span><span>"备注/描述"</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>&lt;/</span><span>a</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>&lt;</span><span>a</span><span> </span><span>href</span><span>=</span><span>""</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>&lt;</span><span>img</span><span> </span><span>src</span><span>=</span><span>""</span><span> </span><span>alt</span><span>=</span><span>"图片加载出问题了"</span><span> </span><span>width</span><span>=</span><span>"100px"</span><span> </span><span>height</span><span>=</span><span>"100px"</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>&lt;/</span><span>a</span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span>&lt;/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<ol>
<li>span 无意义标签,用来描述行内某个小模块</li>
</ol>
</li>
<li>
<ol>
<li>p <code>&lt;p&gt;段落&lt;/p&gt;</code></li>
</ol>
</li>
<li>
<ol>
<li>ul li 无序列表</li>
</ol>
</li>
<li>
<ol>
<li>ol li 有序列表</li>
</ol>
</li>
<li>
<ol>
<li>b 加粗</li>
</ol>
</li>
<li>
<ol>
<li>strong 加粗,浏览器解析的时候,有强调作用</li>
</ol>
</li>
<li>
<ol>
<li>body 身体,网页主体部分 （内容在浏览器可视区显示）</li>
</ol>
</li>
<li>
<ol>
<li>a 超链接,描点</li>
</ol>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>点击元素可以进行跳转的</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>a</span><span> </span><span>href</span><span>=</span><span>"链接路径"</span><span> </span><span>target</span><span>=</span><span>"_blank"</span><span>&gt;珠峰培训&lt;/</span><span>a</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span>&lt;</span><span>a</span><span> </span><span>href</span><span>=</span><span>"pic.jpg"</span><span> </span><span>target</span><span>=</span><span>"_blank"</span><span>&gt;珠峰培训&lt;/</span><span>a</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<ol>
<li>img 插入图片</li>
</ol>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>img</span><span> </span><span>src</span><span>=</span><span>"图片路径"</span><span> </span><span>alt</span><span>=</span><span>"备注/描述"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>img</span><span> </span><span>src</span><span>=</span><span>"pic.jpg"</span><span> </span><span>alt</span><span>=</span><span>"备注/描述"</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<ol>
<li>i 作用：<em>斜体</em></li>
</ol>
</li>
<li>
<ol>
<li>em 强调 作用：*斜体</li>
</ol>
</li>
<li>
<ol>
<li>h1-h6 标题</li>
</ol>
</li>
<li>
<ol>
<li>dl-dt-dd定义列表 常用在新闻标题和摘要</li>
</ol>
<ul>
<li>dt 定义标题</li>
<li>dd 定义描述</li>
<li>一个dt可以多个dd进行描述</li>
</ul>
</li>
</ul></section>
<section><h2>标签<a href="#标签"><span>#</span></a></h2><ul>
<li>标签（由尖括号和关键字组成的超文本）</li>
<li>关键字（就是普通文本），在编辑html这门语言的时候，相关组织将这些文本归纳到了一定的规则中，是他有了特殊的含义和作用</li>
<li>标签的分类：开始标签、结束标签、空标签</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>开始标签</span><span>&gt;&lt;</span><span>空标签</span><span> /&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>div</span><span>&gt;&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span>&lt;</span><span>b</span><span>&gt;&lt;/</span><span>b</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span>&lt;</span><span>strong</span><span>&gt;&lt;/</span><span>strong</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span>&lt;</span><span>ul</span><span>&gt;&lt;</span><span>li</span><span>&gt;&lt;/</span><span>li</span><span>&gt;&lt;/</span><span>ul</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span>&lt;</span><span>ol</span><span>&gt;&lt;</span><span>li</span><span>&gt;&lt;/</span><span>li</span><span>&gt;&lt;/</span><span>ol</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span>&lt;</span><span>p</span><span>&gt;&lt;/</span><span>p</span><span>&gt;···</span></div></div><div><div><div>8</div></div><div><span>&lt;/</span><span>结束标签</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>标签属性：用来描述标签功能的，一般写在开始标签中，跟在标签名的后面，用空格隔开，一个标签可以有很多标签属性，每一个属性都用空格隔开</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>开始标签</span><span> </span><span>属性名</span><span>=</span><span>"属性值"</span><span> </span><span>属性名1</span><span>=</span><span>"属性值"</span><span>&gt;&lt;</span><span>结束标签</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>img</span><span> </span><span>src</span><span>=</span><span>"url"</span><span> </span><span>alt</span><span>=</span><span>"备注"</span><span> /&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>html标签<a href="#html标签"><span>#</span></a></h3><ul>
<li>
<ol>
<li>html标签HTML 元素指的是从开始标签（start tag）到结束标签（end tag）的所有代码。</li>
</ol>
</li>
<li>
<p>标签不会出现在页面中，只有标签中的内容才会显示在页面上 ：也就是<code>&lt;html&gt;此处为内容&lt;/html&gt;</code></p>
</li>
<li>
<p>标签不区分大小写，但是推荐使用小写 ：(X)HTML 版本中强制使用小写，这样更加严谨</p>
</li>
<li>
<p>标签分为闭合标签和空标签 ：闭合标签是指由开始标签和结束标签组成的一对标签，这种标签允许嵌套和承载内容，例如：<code>&lt;html&gt;&lt;/html&gt;、&lt;p&gt;&lt;/p&gt;</code>；空标签是没有内容的标签，在开始标签中自动闭合，例如：<code>&lt;img /&gt;、&lt;br /&gt;、&lt;hr /&gt;等</code></p>
</li>
</ul></section></section>
<section><h2>元素<a href="#元素"><span>#</span></a></h2><ul>
<li>由标签（开始和结束标签中有内容）和内容组成，元素中内容可以为空，一个空标签也叫做一个元素</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>div</span><span>&gt;content&lt;/</span><span>div</span><span>&gt;--&gt;div元素</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>img</span><span> </span><span>src</span><span>=</span><span>"url"</span><span> </span><span>alt</span><span>=</span><span>"备注"</span><span> /&gt;--&gt;img元素</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>标签属性经过html的进化，舍弃了有关样式的标签属性，保留功能的标签属性</li>
<li>例如舍弃width bgcolor align，这些样式描述都放在css里面</li>
<li>保留alt title src href···</li>
</ul></section>
<section><h2>iframe标签<a href="#iframe标签"><span>#</span></a></h2><p>在引入其他文件的时候，必须写宽度和高度</p></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/CSS%E4%B8%AD%E7%9A%84form%E8%A1%A8%E5%8D%95%E4%B8%8Etable%E8%A1%A8%E6%A0%BC/</id>
      <title type="text">CSS中的form表单与table表格</title>
      <published>2017-06-30T00:00:00.000Z</published>
      <updated>2017-06-30T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/CSS%E4%B8%AD%E7%9A%84form%E8%A1%A8%E5%8D%95%E4%B8%8Etable%E8%A1%A8%E6%A0%BC/"/>
      <summary type="text">CSS中的form表单与table表格</summary>
      <content type="html"><![CDATA[<section><h3>form表单<a href="#form表单"><span>#</span></a></h3><ul>
<li>用来获取用户信息<code>&lt;form&gt;&lt;/form&gt;</code></li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>form</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>&lt;</span><span>input</span><span> </span><span>type</span><span>=</span><span>"radio"</span><span> </span><span>name</span><span>=</span><span>"ok"</span><span> </span><span>checked</span><span>=</span><span>"checked"</span><span>&gt;</span><span>&lt;!--单选按钮--&gt;</span><span>&lt;</span><span>label</span><span>&gt;满意&lt;/</span><span>label</span><span>&gt;</span><span>&lt;!--label 描述表单元素功能--&gt;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>&lt;!--type 类型--&gt;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>&lt;!--name 名字--&gt;</span></div></div><div><div><div>5</div></div><div><span>    </span><span>&lt;!--checked 选中--&gt;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>&lt;</span><span>input</span><span> </span><span>type</span><span>=</span><span>"radio"</span><span> </span><span>name</span><span>=</span><span>"ok"</span><span>&gt;</span><span>&lt;!--单选按钮--&gt;</span><span>&lt;</span><span>label</span><span>&gt;不满意&lt;/</span><span>label</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>&lt;</span><span>input</span><span> </span><span>type</span><span>=</span><span>"checkbox"</span><span>&gt;&lt;</span><span>label</span><span>&gt;篮球&lt;/</span><span>label</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>&lt;</span><span>input</span><span> </span><span>type</span><span>=</span><span>"checkbox"</span><span> </span><span>checked</span><span>&gt;&lt;</span><span>label</span><span>&gt;美女&lt;/</span><span>label</span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>&lt;</span><span>input</span><span> </span><span>type</span><span>=</span><span>"checkbox"</span><span>&gt;&lt;</span><span>label</span><span>&gt;彭于晏&lt;/</span><span>label</span><span>&gt;</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>&lt;</span><span>input</span><span> </span><span>type</span><span>=</span><span>"checkbox"</span><span>&gt;&lt;</span><span>label</span><span>&gt;陈冠希&lt;/</span><span>label</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>&lt;</span><span>input</span><span> </span><span>type</span><span>=</span><span>"checkbox"</span><span>&gt;&lt;</span><span>label</span><span>&gt;杨颖&lt;/</span><span>label</span><span>&gt;</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>&lt;</span><span>input</span><span> </span><span>type</span><span>=</span><span>"checkbox"</span><span>&gt;&lt;</span><span>label</span><span>&gt;维密&lt;/</span><span>label</span><span>&gt;</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>&lt;</span><span>textarea</span><span> </span><span>maxlength</span><span>=</span><span>"10"</span><span> </span><span>minlength</span><span>=</span><span>"1"</span><span>&gt;&lt;/</span><span>textarea</span><span>&gt;</span><span>&lt;!--文本域--&gt;</span></div></div><div><div><div>15</div></div><div><span>    </span><span>&lt;!--maxlength 字符输入的最大长度--&gt;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>&lt;</span><span>br</span><span>&gt;</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>&lt;</span><span>label</span><span>&gt;姓名&lt;/</span><span>label</span><span>&gt;&lt;</span><span>input</span><span> </span><span>type</span><span>=</span><span>"text"</span><span>&gt;</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>&lt;</span><span>br</span><span>&gt;</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>&lt;</span><span>label</span><span>&gt;手机&lt;/</span><span>label</span><span>&gt;&lt;</span><span>input</span><span> </span><span>type</span><span>=</span><span>"text"</span><span>&gt;</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>&lt;</span><span>br</span><span>&gt;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>&lt;</span><span>label</span><span>&gt;密码&lt;/</span><span>label</span><span>&gt;&lt;</span><span>input</span><span> </span><span>type</span><span>=</span><span>"password"</span><span>&gt;</span></div></div><div><div><div>22</div></div><div><span>&lt;/</span><span>form</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><ul>
<li>radio 单选按钮
<ul>
<li>name=“ok”（name的值相同情况下）同时给到input type=“radio”，表示单选只能选中其中的一个</li>
</ul>
</li>
<li>lable描述表单元素功能</li>
<li>type 类型</li>
<li>name 名字</li>
<li>cheked 选中
<ul>
<li>单独写checked也可以达到选中的效果</li>
</ul>
</li>
<li><code>&lt;input type="checkbox"&gt;</code>checkbox 多选按钮</li>
<li>textarea 文本域</li>
<li><code>&lt;textarea maxlength="10" minlength="1"&gt;&lt;/textarea&gt;</code>
<ul>
<li>maxlength字符输入的最大长度</li>
</ul>
</li>
</ul></section>
<section><h3>table表格<a href="#table表格"><span>#</span></a></h3><ul>
<li><code>&lt;caption&gt;标题&lt;/caption&gt;</code></li>
<li><code>&lt;thead&gt;表头&lt;/thead&gt;</code>
<ul>
<li>tr&gt;th（标题单元格，th加粗居中）</li>
</ul>
</li>
<li><code>&lt;tfoot&gt;</code> 表尾
<ul>
<li>tr&gt;th（普通单元格）</li>
<li>tr&gt;td（普通单元格，td不加粗不居中）</li>
</ul>
</li>
<li>tbody 表身
<ul>
<li>tr&gt;th（普通单元格）</li>
</ul>
</li>
</ul><blockquote><p>thead和tfoot分别有一个 tbody可以有多个
tfoot一般放置在thead的后面，为了防止tbody中的内容过多，tfoot加载过慢的情况，但是虽然书写位置在前面，在页面中显示的时候，这部分依然在整个表格的最后面
如果table用来搭建结构，我们只需写tr和td</p></blockquote><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>table</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>&lt;</span><span>tr</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>        </span></span><span>&lt;</span><span>td</span><span>&gt;&lt;/</span><span>td</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>&lt;</span><span>td</span><span>&gt;&lt;/</span><span>td</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>&lt;</span><span>td</span><span>&gt;&lt;/</span><span>td</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>&lt;/</span><span>tr</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>&lt;</span><span>tr</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>         </span></span><span>&lt;</span><span>td</span><span>&gt;&lt;/</span><span>td</span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span><span>         </span></span><span>&lt;</span><span>td</span><span>&gt;&lt;/</span><span>td</span><span>&gt;</span></div></div><div><div><div>10</div></div><div><span><span>         </span></span><span>&lt;</span><span>td</span><span>&gt;&lt;/</span><span>td</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>&lt;/</span><span>tr</span><span>&gt;</span></div></div><div><div><div>12</div></div><div><span>&lt;/</span><span>table</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/CSS%E5%B1%9E%E6%80%A7%E7%9A%84%E7%BB%A7%E6%89%BF%E5%8F%8A%E7%9B%B8%E5%85%B3%E9%9D%A2%E8%AF%95%E9%A2%98/</id>
      <title type="text">CSS属性的继承及相关面试题</title>
      <published>2017-06-30T00:00:00.000Z</published>
      <updated>2017-06-30T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/CSS%E5%B1%9E%E6%80%A7%E7%9A%84%E7%BB%A7%E6%89%BF%E5%8F%8A%E7%9B%B8%E5%85%B3%E9%9D%A2%E8%AF%95%E9%A2%98/"/>
      <summary type="text">CSS属性的继承及相关面试题</summary>
      <content type="html"><![CDATA[<section><h2>CSS属性的继承<a href="#css属性的继承"><span>#</span></a></h2><ul>
<li>子级元素从父级元素身上继承的一些可继承的css属性</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>div</span><span>{color:</span><span>red</span><span>;}</span></div></div><div><div><div>3</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span>&lt;</span><span>p</span><span>&gt;woshiyige[biaoqian&lt;/</span><span>p</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>根据 CSS，子元素从父元素继承属性。看看下面这条规则：
<ul>
<li>body {font-family: Verdana, sans-serif;}
<ul>
<li>根据上面这条规则，站点的 body 元素将使用 Verdana 字体（假如访问者的系统中存在该字体的话）。</li>
</ul>
</li>
</ul>
</li>
<li>继承的权重较小，可被其他选择器的样式覆盖</li>
</ul></section>
<section><h2>面试题<a href="#面试题"><span>#</span></a></h2><ul>
<li>哪些css样式可以被继承：和文字有关的css样式 和列表有关的css样式</li>
</ul><section><h3>总结<a href="#总结"><span>#</span></a></h3><ul>
<li>1.可继承属性</li>
<li>1)可以继承的文本相关属性</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>azimuth</span><span>&gt;&lt;</span><span>border-collapse</span><span>&gt;&lt;</span><span>border-spacing</span><span>&gt;&lt;</span><span>caption-side</span><span>&gt;&lt;</span><span>color</span><span>&gt;&lt;</span><span>cursor</span><span>&gt;&lt;</span><span>direction</span><span>&gt;&lt;</span><span>elevation</span><span>&gt;&lt;</span><span>empty-cells</span><span>&gt;&lt;</span><span>font-family</span><span>&gt;&lt;</span><span>font-size</span><span>&gt;&lt;</span><span>font-style</span><span>&gt;&lt;</span><span>font-variant</span><span>&gt;&lt;</span><span>font-weight</span><span>&gt;&lt;</span><span>font</span><span>&gt;&lt;</span><span>letter-spacing</span><span>&gt;&lt;</span><span>line-height</span><span>&gt;&lt;</span><span>list-style-image</span><span>&gt;&lt;</span><span>list-style-position</span><span>&gt;&lt;</span><span>list-style-type</span><span>&gt;&lt;</span><span>list-style</span><span>&gt;&lt;</span><span>orphans</span><span>&gt;&lt;</span><span>pitch-range</span><span>&gt;&lt;</span><span>pitch</span><span>&gt;&lt;</span><span>quotes</span><span>&gt;&lt;</span><span>richness</span><span>&gt;&lt;</span><span>speak-header</span><span>&gt;&lt;</span><span>speaknumeral</span><span>&gt;&lt;</span><span>speak-punctuation</span><span>&gt;&lt;</span><span>speak</span><span>&gt;&lt;</span><span>speechrate</span><span>&gt;&lt;</span><span>stress</span><span>&gt;&lt;</span><span>text-align</span><span>&gt;&lt;</span><span>text-indent</span><span>&gt;&lt;</span><span>texttransform</span><span>&gt;&lt;</span><span>visibility</span><span>&gt;&lt;</span><span>voice-family</span><span>&gt;&lt;</span><span>volume</span><span>&gt;&lt;</span><span>whitespace</span><span>&gt;&lt;</span><span>widows</span><span>&gt;&lt;</span><span>word-spacing</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>2)可以继承的列表相关属性</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>azimuth</span><span>&gt;&lt;</span><span>border-collapse</span><span>&gt;&lt;</span><span>border-spacing</span><span>&gt;&lt;</span><span>caption-side</span><span>&gt;&lt;</span><span>color</span><span>&gt;&lt;</span><span>cursor</span><span>&gt;&lt;</span><span>direction</span><span>&gt;&lt;</span><span>elevation</span><span>&gt;&lt;</span><span>empty-cells</span><span>&gt;&lt;</span><span>font-family</span><span>&gt;&lt;</span><span>font-size</span><span>&gt;&lt;</span><span>font-style</span><span>&gt;&lt;</span><span>font-variant</span><span>&gt;&lt;</span><span>font-weight</span><span>&gt;&lt;</span><span>font</span><span>&gt;&lt;</span><span>letter-spacing</span><span>&gt;&lt;</span><span>line-height</span><span>&gt;&lt;</span><span>list-style-image</span><span>&gt;&lt;</span><span>list-style-position</span><span>&gt;&lt;</span><span>list-style-type</span><span>&gt;&lt;</span><span>list-style</span><span>&gt;&lt;</span><span>orphans</span><span>&gt;&lt;</span><span>pitch-range</span><span>&gt;&lt;</span><span>pitch</span><span>&gt;&lt;</span><span>quotes</span><span>&gt;&lt;</span><span>richness</span><span>&gt;&lt;</span><span>speak-header</span><span>&gt;&lt;</span><span>speaknumeral</span><span>&gt;&lt;</span><span>speak-punctuation</span><span>&gt;&lt;</span><span>speak</span><span>&gt;&lt;</span><span>speechrate</span><span>&gt;&lt;</span><span>stress</span><span>&gt;&lt;</span><span>text-align</span><span>&gt;&lt;</span><span>text-indent</span><span>&gt;&lt;</span><span>texttransform</span><span>&gt;&lt;</span><span>visibility</span><span>&gt;&lt;</span><span>voice-family</span><span>&gt;&lt;</span><span>volume</span><span>&gt;&lt;</span><span>whitespace</span><span>&gt;&lt;</span><span>widows</span><span>&gt;&lt;</span><span>word-spacing</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>2.不可继承属性</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>display</span><span>&gt;&lt;</span><span>margin</span><span>&gt;&lt;</span><span>border</span><span>&gt;&lt;</span><span>padding</span><span>&gt;&lt;</span><span>background</span><span>&gt;&lt;</span><span>height</span><span>&gt;&lt;</span><span>min-height</span><span>&gt;&lt;</span><span>max-height</span><span>&gt;&lt;</span><span>width</span><span>&gt;&lt;</span><span>min-width</span><span>&gt;&lt;</span><span>max-width</span><span>&gt;&lt;</span><span>overflow</span><span>&gt;&lt;</span><span>position</span><span>&gt;&lt;</span><span>left</span><span>&gt;&lt;</span><span>right</span><span>&gt;&lt;</span><span>top</span><span>&gt;&lt;</span><span>bottom</span><span>&gt;&lt;</span><span>z-index</span><span>&gt;&lt;</span><span>float</span><span>&gt;&lt;</span><span>clear</span><span>&gt;&lt;</span><span>table-layout</span><span>&gt;&lt;</span><span>vertical-align</span><span>&gt;&lt;</span><span>page-break-after</span><span>&gt;&lt;</span><span>page-bread-before</span><span>&gt;和&lt;</span><span>unicode-bidi</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p>3.所有元素可继承：</p>
</li>
<li>
<p><code>&lt;visibility&gt;（可见性）和&lt;cursor&gt;(光标)</code></p>
</li>
<li>
<p>4.终端块状元素可继承：</p>
</li>
<li>
<p><code>&lt;text-indent&gt;和&lt;text-align&gt;</code></p>
</li>
<li>
<p>5.如果css属性不带有继承性，如何继承父级身上的属性，可以将要继承的属性的属性值写上<code>inherit</code></p>
</li>
<li></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>ul</span><span><span>{float:</span><span>left</span><span>;}</span></span></div></div><div><div><div>2</div></div><div><span>li</span><span><span>{float:</span><span>inherit</span><span>;}</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/CSS%E5%B8%B8%E7%94%A8%E9%80%89%E6%8B%A9%E5%99%A8/</id>
      <title type="text">CSS常用选择器</title>
      <published>2017-06-30T00:00:00.000Z</published>
      <updated>2017-06-30T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/CSS%E5%B8%B8%E7%94%A8%E9%80%89%E6%8B%A9%E5%99%A8/"/>
      <summary type="text">CSS常用选择器</summary>
      <content type="html"><![CDATA[<section><h2>CSS选择器<a href="#css选择器"><span>#</span></a></h2><ul>
<li>因为html和css分离，那么就出现一个问题，如何选择一个元素，将样式添加给这个元素—&gt;css选择器</li>
<li>选择器是css属性和html元素的连接桥梁，通过正确的选择器来找到想要操作的元素，添加一定的样式。</li>
<li>选择器{}</li>
</ul><section><h3>1.语法<a href="#1语法"><span>#</span></a></h3><p>选择器<code>{key:value;key:value;}</code></p><ul>
<li>可以批量选择<strong>选择器</strong>名称相同的元素</li>
<li>通过选择器类型不同，可以选择不同的html元素</li>
</ul></section></section>
<section><h2>2.CSS基础选择器分类<a href="#2css基础选择器分类"><span>#</span></a></h2><section><h3>1) 标签选择器<a href="#1-标签选择器"><span>#</span></a></h3><ul>
<li>1-1).说明&lt;直接使用元素标签进行选择&gt;
<ul>
<li>例如：<code>&lt;p&gt;&lt;/p&gt;</code></li>
<li>p{color;}</li>
</ul>
</li>
<li>1-2).权重&lt;1&gt;</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>h1</span><span>{color:</span><span>red</span><span>;}</span></div></div><div><div><div>3</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span>&lt;</span><span>h1</span><span>&gt;</span><span>标签选择器&lt;</span><span>/</span><span>h1</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2) 类选择器<a href="#2-类选择器"><span>#</span></a></h3><ul>
<li>2-1)说明:
<ul>
<li>
<p>1)将html元素的class标签属性值当作选择器使用，需要在这个属性值前面加一个“.”</p>
</li>
<li>
<p>2)通过元素的类名，来选择元素，一个元素可以有多个类名，都代表这个元素</p>
</li>
<li>
<p>3)类名是元素class属性中的属性值，例如(下例中的sum即为类名)</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>p</span><span> class='sum'</span><span>&gt;</span><span>&lt;</span><span>/</span><span>p</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span><span>.sum</span><span>{}&lt;/</span><span>style</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>4)一个html元素可以有多个css属性值（可以有多个类名，每一个类名之间用空格隔开）</p>
</li>
<li>
<p>5)类名可以重复使用</p>
</li>
</ul>
</li>
<li>2-2)权重&lt;10&gt;
<ul>
<li>
<p><strong>类选择器最前方一定要有点</strong>,例如:</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>.title</span><span>{color:</span><span>red</span><span>;}</span></div></div><div><div><div>3</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span>&lt;</span><span>h1</span><span> class="</span><span>title</span><span> title1"</span><span>&gt;</span><span>标签选择器&lt;</span><span>/</span><span>h1</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span>&lt;</span><span>h1</span><span> class="title"</span><span>&gt;</span><span>标签选择器&lt;</span><span>/</span><span>h1</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span>//</span><span>以上class属性名为title中的文字颜色都讲被设置为红色</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
</ul></section><section><h3>3) id选择器<a href="#3-id选择器"><span>#</span></a></h3><ul>
<li>
<p>3-1).说明:</p>
<ul>
<li>1).一个html元素，id属性值只能用一次，id在html中具有唯一性</li>
<li>2).类选择器最前方一定要有#</li>
<li>3).通过元素的id名，来选择元素</li>
<li>4).类名是元素id属性中的属性值(title/title1)，例如:</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>#title</span><span>{color:</span><span>red</span><span>;}</span></div></div><div><div><div>3</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span>&lt;</span><span>h1</span><span> id="</span><span>title</span><span> title1"</span><span>&gt;</span><span>id选择器&lt;</span><span>/</span><span>h1</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span>&lt;</span><span>h1</span><span> id="title"</span><span>&gt;</span><span>错误的，不识别&lt;</span><span>/</span><span>h1</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>3-2).权重&lt;100&gt;</p>
</li>
</ul></section></section>
<section><h2>总结(根据权重)<a href="#总结根据权重"><span>#</span></a></h2><blockquote><p><strong>标签选择器</strong>相当于人的姓名,<strong>类选择器</strong>相当于人的名字,<strong>id选择器</strong>相当于身份证号码,是独一无二的。</p></blockquote><section><h3>4) 通配符选择器<a href="#4-通配符选择器"><span>#</span></a></h3><ul>
<li>
<p>4-1) 说明:</p>
<ul>
<li>1)通过*匹配全部html元素，包括根元素</li>
<li>2)一般不使用，因为全部匹配耗性能</li>
<li>3)语法:<code>*{}</code></li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>*</span><span>{key:value}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>4-2). 权重&lt;1,可被覆盖</p>
</li>
</ul></section><section><h3>5) 并集选择器<a href="#5-并集选择器"><span>#</span></a></h3><ul>
<li>5-1).说明:
<ul>
<li>
<p>1). 你可以对选择器进行分组，这样，被分组的选择器就可以分享相同的声明。用逗号将需要分组的选择器分开。在下面的例子中，我们对所有的标题元素进行了分组。所有的标题元素都是绿色的。</p>
</li>
<li>
<p>例如：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>h1</span><span>,</span><span>h2</span><span>,</span><span>h3</span><span>,</span><span>h4</span><span>,</span><span>h5</span><span>,</span><span>h6</span><span>{color:</span><span>green</span><span>;}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
</ul></section><section><h3>6) 属性选择器<a href="#6-属性选择器"><span>#</span></a></h3><ul>
<li>
<p>6-1) 说明:</p>
<ul>
<li>
<ol>
<li>对带有指定属性的 HTML 元素设置样式，可以为拥有指定属性的 HTML 元素设置样式，而不仅限于 class 和 id 属性。</li>
</ol>
<ul>
<li>下面的例子为带有 title 属性的所有元素设置样式：</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[</span><span>title</span><span>]</span><span>{</span></div></div><div><div><div>2</div></div><div><span><span>        </span></span><span>color:</span><span>red</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>        </span></span><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<ol>
<li>利用标签的属性名和属性值来选择html元素</li>
</ol>
</li>
<li>
<ol>
<li><strong>属性选择器在使用的时候，如果一个元素有两个类名，那么是不生效的。</strong></li>
</ol>
</li>
<li>
<ol>
<li>属性选择器我们一般不会使用class,因为class可以直接使用类选择器</li>
</ol>
</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;!--有多少种方法只获取div?--&gt;</span></div></div><div><div><div>2</div></div><div><span>/*如果class值有两个，不能这样使用*/</span></div></div><div><div><div>3</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span><span>[</span><span>class</span><span>=</span><span>div1</span><span>]</span><span>{};&lt;/</span><span>style</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"div1 p1"</span><span> </span><span>id</span><span>=</span><span>"div2"</span><span>&gt;&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span>&lt;</span><span>p</span><span> </span><span>class</span><span>=</span><span>"p1"</span><span>&gt;&lt;/</span><span>p</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>6-2) 语法：</p>
</li>
<li>
<p><code>[标签属性名]{}</code></p>
</li>
<li>
<p><code>[标签属性名=属性值]{}</code></p>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>h1</span><span>[</span><span>title</span><span>]</span><span>{} //</span><span>交集选择器</span></div></div><div><div><div>3</div></div><div><span>//</span><span>权重:标签</span><span>+</span><span>属性的权重=11</span></div></div><div><div><div>4</div></div><div><span>[</span><span>type</span><span>]</span><span>{}</span></div></div><div><div><div>5</div></div><div><span>//</span><span>权重：10</span></div></div><div><div><div>6</div></div><div><span>[</span><span>type</span><span>=</span><span>text</span><span>]</span><span>{}</span></div></div><div><div><div>7</div></div><div><span>//</span><span>权重:10</span></div></div><div><div><div>8</div></div><div><span>&lt;</span><span>/</span><span>style</span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span>&lt;</span><span>a</span><span> href="" title=""</span><span>&gt;</span><span>link&lt;</span><span>/</span><span>a</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>6-3) 权重&lt;10&gt;</li>
</ul></section><section><h3>7) 属性和值选择器<a href="#7-属性和值选择器"><span>#</span></a></h3><ul>
<li>7-1) 说明:</li>
<li>
<ol>
<li>下面的例子为 title=“xx” 的所有元素设置样式：</li>
</ol>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[</span><span>title</span><span>=</span><span>xx</span><span>]</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>{</span></div></div><div><div><div>3</div></div><div><span><span>        </span></span><span>border:</span><span><span>5</span><span>px</span></span><span><span> </span><span>solid</span><span> </span></span><span>blue</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<ol>
<li>设置表单的样式</li>
</ol>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>    </span><span>input</span><span>[</span><span>type</span><span>=</span><span>"text"</span><span>]</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>{</span></div></div><div><div><div>3</div></div><div><span><span>        </span></span><span>width:</span><span><span>150</span><span>px</span></span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>display:</span><span>block</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>margin-bottom:</span><span><span>10</span><span>px</span></span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>background-color:</span><span>yellow</span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>font-family: </span><span>Verdana</span><span>, </span><span>Arial</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>8) 分组选择器<a href="#8-分组选择器"><span>#</span></a></h3><ul>
<li>
<p>8-1) 作用(应用场景)</p>
</li>
<li>
<ol>
<li>同一份css样式，可以一次性的添加给多个不同的html元素</li>
</ol>
</li>
<li>
<p>8-2)语法</p>
</li>
</ul><p>选择器1,选择器2,选择器3{};例如:</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>.box</span><span>,</span><span>li</span><span>,</span><span>.p1</span><span>{color: </span><span>red</span><span>}</span></div></div><div><div><div>2</div></div><div><span>.box</span><span>{color:</span><span>green</span><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>8-3)权重</li>
</ul><ol>
<li>分组选择器将不同的html分为一组，权重计算的时候都是独立计算，不会叠加。</li>
</ol></section><section><h3>9) 交集选择器<a href="#9-交集选择器"><span>#</span></a></h3><ul>
<li>
<p>9-1)一个元素具有<strong>两个</strong>属性(两种属性同属一个元素的时候)，可以使用交集选择器来进行元素的准确选择</p>
</li>
<li>
<p>9-2)组成选择器的两部分，必须属于同一个</p>
<ul>
<li>
<p>反例(错误用法):</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span><span>h1</span><span>.p1</span><span>{} //</span><span>--</span><span>&gt;</span><span>什么都选择不到&lt;</span><span>/</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>p</span><span> class="p1"</span><span>&gt;</span><span>&lt;</span><span>/</span><span>p</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span>&lt;</span><span>h1</span><span>&gt;</span><span>&lt;</span><span>/</span><span>h1</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>正例(正确用法)</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>p</span><span> class='name1 name2' id='id1'</span><span>&gt;</span><span>&lt;</span><span>/</span><span>p</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span>//</span><span>第一种:</span></div></div><div><div><div>4</div></div><div><span>p</span><span>.name1</span><span>{}</span></div></div><div><div><div>5</div></div><div><span>//</span><span>第二种:</span></div></div><div><div><div>6</div></div><div><span>p</span><span>#id1</span><span>{}</span></div></div><div><div><div>7</div></div><div><span>//</span><span>第三种:</span></div></div><div><div><div>8</div></div><div><span>.name1.name2</span><span>{}</span></div></div><div><div><div>9</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>使用解说(正确用法):</p>
<ul>
<li>1.组合选择器之间没有任何的符号和空格</li>
<li>2.标签选择器和其他选择器组合的时候，标签选择器要放在前面</li>
<li>3.交集选择器是两个选择器组合在一起，可以是1)标签和类名,2)标签和属性选择器,3)标签和id,4)两个类选择器。</li>
</ul>
</li>
</ul>
</li>
<li>
<p>9-3). 作用</p>
<ul>
<li>
<p>精确查找元素，增加选择器的权重</p>
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>h1</span><span>{}</span></div></div><div><div><div>3</div></div><div><span>//</span><span>标签选择器 权重:1</span></div></div><div><div><div>4</div></div><div><span>[</span><span>title</span><span>]</span><span>{}</span></div></div><div><div><div>5</div></div><div><span>//</span><span>属性选择器 权重:10</span></div></div><div><div><div>6</div></div><div><span>[</span><span>title</span><span>=</span><span>xx</span><span>]</span><span>{}</span></div></div><div><div><div>7</div></div><div><span>//</span><span>属性选择器 权重:10</span></div></div><div><div><div>8</div></div><div><span>h2</span><span>[</span><span>title</span><span>]</span><span>{}</span></div></div><div><div><div>9</div></div><div><span>//</span><span>交集选择器 权重:11</span></div></div><div><div><div>10</div></div><div><span>h2</span><span>[</span><span>title</span><span>=</span><span>xx</span><span>]</span><span>{}</span></div></div><div><div><div>11</div></div><div><span>//</span><span>交集选择器 权重:11</span></div></div><div><div><div>12</div></div><div><span>&lt;</span><span>/</span><span>style</span><span>&gt;</span></div></div><div><div><div>13</div></div><div><span>&lt;</span><span>h1</span><span> title="xx"</span><span>&gt;</span><span>&lt;</span><span>/</span><span>h1</span><span>&gt;</span></div></div><div><div><div>14</div></div><div><span>&lt;</span><span>h2</span><span> title="xx"</span><span>&gt;</span><span>&lt;</span><span>/</span><span>h2</span><span>&gt;</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>17</div></div><div><span>p</span><span>.p1</span><span>{}</span></div></div><div><div><div>18</div></div><div><span>//</span><span>交集选择器  权重:11</span></div></div><div><div><div>19</div></div><div><span>&lt;</span><span>/</span><span>style</span><span>&gt;</span></div></div><div><div><div>20</div></div><div><span>&lt;</span><span>p</span><span> class="p1"</span><span>&gt;</span><span>&lt;</span><span>/</span><span>p</span><span>&gt;</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>23</div></div><div><span>.p1.p2</span><span>{}</span></div></div><div><div><div>24</div></div><div><span>//</span><span>交集选择器  权重:20</span></div></div><div><div><div>25</div></div><div><span>&lt;</span><span>/</span><span>style</span><span>&gt;</span></div></div><div><div><div>26</div></div><div><span>&lt;</span><span>p</span><span> class="p1 p2"</span><span>&gt;</span><span>&lt;</span><span>/</span><span>p</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>
</li>
</ul>
</li>
</ul></section><section><h3>10) 子集选择器<a href="#10-子集选择器"><span>#</span></a></h3><ul>
<li>10-1) 说明:
<ul>
<li>
<ol>
<li>与后代选择器相比，子元素选择器只能选择作为某元素子元素的元素。</li>
</ol>
</li>
<li>
<ol>
<li>父级选择器是用来确定范围的，</li>
</ol>
</li>
<li>
<ol>
<li>子级选择器才是我们要添加样式的那个元素</li>
</ol>
</li>
<li>
<ol>
<li>子级选择器必须是紧邻的父子关系</li>
</ol>
</li>
</ul>
</li>
<li>10-2) 语法:
<ul>
<li>父级选择器&gt;子级选择器</li>
</ul>
</li>
<li>10-3). 权重
<ul>
<li>所有选择器之和</li>
</ul>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>ul</span><span>&gt;</span><span>li</span><span>{color:</span><span>red</span><span>;}</span></div></div><div><div><div>3</div></div><div><span>//</span><span>选择ul下的li 权重:2</span></div></div><div><div><div>4</div></div><div><span>&lt;</span><span>/</span><span>style</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span>&lt;</span><span>ul</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>&lt;</span><span>li</span><span>&gt;</span><span>&lt;</span><span>/</span><span>li</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span>&lt;</span><span>/</span><span>ul</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>11) 后代选择器(派生选择器)<a href="#11-后代选择器派生选择器"><span>#</span></a></h3><ul>
<li>
<p>11-1) 说明:</p>
<ul>
<li>
<ol>
<li>在一个根元素的范围内，查找到它的后代元素</li>
</ol>
</li>
<li>
<ol>
<li>后代选择器在写的时候尽量控制在３个左右</li>
</ol>
</li>
<li>
<ol>
<li>选择器过多浪费性能，不建议使用</li>
</ol>
</li>
</ul>
</li>
<li>
<p>11-2) 举例:</p>
<ul>
<li>
<ol>
<li>html结构：</li>
</ol>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>    </span></span><span>&lt;</span><span>ol</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>        </span></span><span>&lt;</span><span>li</span><span>&gt;&lt;</span><span>strong</span><span>&gt;我是斜体字。这是因为 strong 元素位于 li 元素内。&lt;/</span><span>strong</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>        </span></span><span>&lt;/</span><span>li</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>&lt;/</span><span>ol</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>2). 列表中的 strong 元素变为斜体字，而不是通常的粗体字，可以这样定义一个派生选择器：</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>    </span><span>li</span><span> </span><span>strong</span><span> {</span></div></div><div><div><div>2</div></div><div><span><span>        </span></span><span>font-style: </span><span>italic</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>        </span></span><span>font-weight: </span><span>normal</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>                </span></span><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>3). 后代选择器在写的时候尽量控制在３个左右,选择器过多浪费性能:</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>.div</span><span> </span><span>ul</span><span> </span><span>span</span><span>{}</span></div></div><div><div><div>3</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"div"</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>&lt;</span><span>ul</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>&lt;</span><span>li</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span><span>            </span></span><span>&lt;</span><span>span</span><span>&gt;只选择这个span元素&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>&lt;/</span><span>li</span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>&lt;/</span><span>ul</span><span>&gt;</span></div></div><div><div><div>10</div></div><div><span>&lt;/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
<li>
<p>11-3) 语法:</p>
<ul>
<li>祖辈选择器 要查找的后代选择器{};(中间用空格连接)</li>
</ul>
</li>
</ul></section><section><h3>12) 相邻兄弟选择器<a href="#12-相邻兄弟选择器"><span>#</span></a></h3><ul>
<li>
<p>12-1) 说明:</p>
<ul>
<li>1). 相邻兄弟选择器可选择紧接在另一元素后的元素，且二者有相同父元素。</li>
<li>2). 通过各个元素选择弟弟选择器,两个选择器之间用“+”连接;例如:
<ul>
<li><code>h1 + p {margin-top:50px;}</code></li>
</ul>
</li>
</ul>
</li>
<li>
<p>12-2) 语法:</p>
<ul>
<li>
<p>哥哥选择器+弟弟选择器{};</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>    </span><span>.list1</span><span>+</span><span>li</span><span>{color:</span><span>red</span><span>;}</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>//22222</span><span>变为红色</span></div></div><div><div><div>4</div></div><div><span>    </span><span>.list3</span><span>+</span><span>li</span><span>{color:</span><span>green</span><span>;}</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>//4444</span><span>变为绿色</span></div></div><div><div><div>6</div></div><div><span>&lt;</span><span>/</span><span>style</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span>&lt;</span><span>ul</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>&lt;</span><span>li</span><span> class="list1"</span><span>&gt;</span><span>11111&lt;</span><span>/</span><span>li</span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>&lt;</span><span>li</span><span>&gt;</span><span>22222&lt;</span><span>/</span><span>li</span><span>&gt;</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>&lt;</span><span>li</span><span> class="list3"</span><span>&gt;</span><span>33333&lt;</span><span>/</span><span>li</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>&lt;</span><span>li</span><span>&gt;</span><span>4444&lt;</span><span>/</span><span>li</span><span>&gt;</span></div></div><div><div><div>12</div></div><div><span>&lt;</span><span>/</span><span>ul</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
<li>
<p>12-3) 权重&lt;选择器之和&gt;</p>
</li>
</ul></section><section><h3>13) 伪类选择器<a href="#13-伪类选择器"><span>#</span></a></h3><ul>
<li>13-1) 说明:
<ul>
<li>
<ol>
<li>给一个元素添加某种状态</li>
</ol>
<ul>
<li>例如&lt;鼠标经过时&gt;/获取焦点时/鼠标点击时</li>
</ul>
</li>
</ul>
</li>
<li>13-2) 权重&lt;10&gt;</li>
<li>13-3) 举例:
<ul>
<li>
<ol>
<li>a标签</li>
</ol>
<ul>
<li>CSS 伪类用于向某些选择器添加特殊的效果</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>    </span><span>a</span><span>:link</span><span> {color: </span><span>#</span><span>FF0000</span><span>}</span></div></div><div><div><div>3</div></div><div><span>    </span><span>/* 未访问的链接 是默认状态*/</span></div></div><div><div><div>4</div></div><div><span>    </span><span>a</span><span>:visited</span><span> {color: </span><span>#</span><span>00FF00</span><span>}</span></div></div><div><div><div>5</div></div><div><span>    </span><span>/* 已访问的链接 鼠标点击后的状态*/</span></div></div><div><div><div>6</div></div><div><span>    </span><span>a</span><span>:hover</span><span> {color: </span><span>#</span><span>FF00FF</span><span>}</span></div></div><div><div><div>7</div></div><div><span>    </span><span>/* 鼠标移动到链接上 鼠标经过的状态*/</span></div></div><div><div><div>8</div></div><div><span>    </span><span>a</span><span>:active</span><span> {color: </span><span>#</span><span>0000FF</span><span>}</span></div></div><div><div><div>9</div></div><div><span>    </span><span>/* 选定的链接 鼠标点击的状态*/</span></div></div><div><div><div>10</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span>&lt;</span><span>a</span><span> </span><span>href</span><span>=</span><span>"javascript:void (0)"</span><span>&gt;最初形态&lt;/</span><span>a</span><span>&gt;</span></div></div><div><div><div>12</div></div><div><span>&lt;</span><span>a</span><span> </span><span>href</span><span>=</span><span>"javascript:void 0"</span><span>&gt;赛亚人形态&lt;/</span><span>a</span><span>&gt;</span></div></div><div><div><div>13</div></div><div><span>&lt;</span><span>a</span><span> </span><span>href</span><span>=</span><span>"javascript:"</span><span>&gt;超级赛亚人形态&lt;/</span><span>a</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<ol>
<li>input标签</li>
</ol>
</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>        </span><span>.input</span><span>{border: </span><span><span>1</span><span>px</span></span><span><span> </span><span>solid</span><span> </span></span><span>gainsboro</span><span>}</span></div></div><div><div><div>3</div></div><div><span>        </span><span><span>.input</span><span>:hover</span></span><span>{border-color: </span><span>gray</span><span>}</span></div></div><div><div><div>4</div></div><div><span>        </span><span><span>.input</span><span>:focus</span></span><span>{border-color: </span><span>blue</span><span>}</span></div></div><div><div><div>5</div></div><div><span>        </span><span>/*input:focus 鼠标聚焦后的状态，input独有的属性*/</span></div></div><div><div><div>6</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span>&lt;</span><span>input</span><span> </span><span>type</span><span>=</span><span>"text"</span><span> </span><span>class</span><span>=</span><span>"input"</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
</ul></section><section><h3>14) CSS 伪元素<a href="#14-css-伪元素"><span>#</span></a></h3><ul>
<li>14-1) 说明:
<ul>
<li>
<ol>
<li>通过css代码向指定元素<strong>内</strong>添加假的（html中不存在的）元素</li>
</ol>
</li>
</ul>
</li>
<li>14-2) 举例:
<ul>
<li>CSS 伪元素用于向某些选择器设置特殊效果
<ul>
<li>
<ol>
<li>before</li>
</ol>
<ul>
<li>“before”会出现在div所有内容之前</li>
<li>""伪元素可以在元素的内容前面插入新内容。</li>
<li>下面的例子在每个 <code>&lt;h1&gt;</code> 元素前面插入内容:‘我是一个伪元素’：</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>h1</span><span>:before</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>{</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>content:</span><span>'我是一个伪元素'</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<ol>
<li>after</li>
</ol>
<ul>
<li>
<p>2-1) 会出现在div所有内容之后，使用伪元素的时候要保证两个前提</p>
</li>
<li>
<p>2-2) 要有display这个属性</p>
</li>
<li>
<p>2-3) 要有content这个属性，这个属性的属性值可以为空，但是引号不能少(<code>content:""</code>):</p>
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>    </span><span>div</span><span>{</span></div></div><div><div><div>3</div></div><div><span><span>        </span></span><span>width: </span><span><span>300</span><span>px</span></span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>height: </span><span><span>300</span><span>px</span></span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>background-color: </span><span>red</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>    </span><span>div</span><span>:before</span><span>{</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>display: </span><span>block</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>content: </span><span>"我是before"</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>font-size: </span><span><span>40</span><span>px</span></span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>color: </span><span>white</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>13</div></div><div><span>    </span><span>div</span><span>:after</span><span>{</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>display: </span><span>block</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>content: </span><span>"我是aftre"</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>font-size: </span><span><span>40</span><span>px</span></span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>color: </span><span>blue</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div><div><div><div>20</div></div><div><span>&lt;</span><span>div</span><span>&gt;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>&lt;</span><span>span</span><span>&gt;我是span&lt;/</span><span>span</span><span>&gt;</span></div></div><div><div><div>22</div></div><div><span>&lt;/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>
<ul>
<li><strong>网页显示</strong>：
<figure><img alt="Alt 伪元素选择器" loading="lazy" width="1434" height="633" src="/_astro/1.CGC61IzS_1WEXnH.webp" /><figcaption>Alt 伪元素选择器</figcaption></figure>“伪元素选择器”</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul></section></section>
<section><h2>注意<a href="#注意"><span>#</span></a></h2><section><h3>1.选择器的查找机制<a href="#1选择器的查找机制"><span>#</span></a></h3><ul>
<li>选择器的查找机制是从右向左,例如:</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>.div</span><span> </span><span>ul</span><span> </span><span>li</span><span>{}</span></div></div><div><div><div>3</div></div><div><span>&lt;!</span><span>-- 第一步选择这个文档中所有的li</span></div></div><div><div><div>4</div></div><div><span>第二步选择哪些li是ul下面的</span></div></div><div><div><div>5</div></div><div><span>第三步选择哪些li是ul下面，ul还是</span><span>.div1下面的</span><span> --</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span>&lt;</span><span>/</span><span>style</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.选择器的组成最好不要超过三个<a href="#2选择器的组成最好不要超过三个"><span>#</span></a></h3></section><section><h3>3.后代选择器没有必要将每一层元素都写出来，只写那些关键节点即可(具有代表性的)<a href="#3后代选择器没有必要将每一层元素都写出来只写那些关键节点即可具有代表性的"><span>#</span></a></h3></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/CSS%E6%A0%87%E7%AD%BE%E8%AF%AD%E4%B9%89%E5%8C%96/</id>
      <title type="text">CSS标签语义化</title>
      <published>2017-06-30T00:00:00.000Z</published>
      <updated>2017-06-30T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/CSS%E6%A0%87%E7%AD%BE%E8%AF%AD%E4%B9%89%E5%8C%96/"/>
      <summary type="text">CSS标签语义化</summary>
      <content type="html"><![CDATA[<section><h3>标签语义化的重要性/为什么要遵循标签语义化：合理的标签做合理的事情<a href="#标签语义化的重要性为什么要遵循标签语义化合理的标签做合理的事情"><span>#</span></a></h3><ul>
<li>1、重要的内容，要放在语义重要的标签中，利于SEO优化(搜索引擎榨取),利于SEO优化(也就是搜索引擎的抓取，搜索引擎的爬虫也依赖于标记来确定上下文和各个关键字的权重);
<ul>
<li>浏览器会按照每个标签的意义去解析这个标签中的内容:h1—&gt;这是一个大标题，意义很重要，搜索引擎会重点抓取这个里面的内容</li>
<li>p—&gt;段落 浏览器在展现这一部分的时候，会独立成一块，让网页结构更加清晰，给用户更好的浏览体验</li>
</ul>
</li>
<li>2、在没有css样式的时候，页面也可以整齐的显示效果</li>
<li>3、更好的支持各种终端，例如无障碍阅读和有声小说等；</li>
<li>4、利于团队协作和后期维护</li>
</ul><section><h4>日常工作中怎样遵循标签语义化<a href="#日常工作中怎样遵循标签语义化"><span>#</span></a></h4><ul>
<li>1、尽量减少使用无意义标签，例如span和div；</li>
<li>2、尽量不使用标签本身的css属性，例如b、font、s等标签，如果需要这些样式，那么使用css样式来进行添加；</li>
<li>3、在需要强调的部分，使用strong、em，但是样式尽量使用css样式来描述；</li>
<li>4、表格搭建时，使用`表格头部 表格身体 表格尾部；</li>
<li>5、列表搭建时，使用<ul>无序列表</ul> <ol>有序列表</ol> <dl>定义列表</dl>；`</li>
</ul><blockquote><p>国家评比一个网站的关键点：访问量（流量/点击量）</p></blockquote></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/CSS%E7%9A%84%E5%BC%95%E5%85%A5%E6%96%B9%E5%BC%8F/</id>
      <title type="text">CSS的引入方式</title>
      <published>2017-06-30T00:00:00.000Z</published>
      <updated>2017-06-30T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/CSS%E7%9A%84%E5%BC%95%E5%85%A5%E6%96%B9%E5%BC%8F/"/>
      <summary type="text">CSS的引入方式</summary>
      <content type="html"><![CDATA[<section><h2>css如何在html中使用（html引入css的四种方法）<a href="#css如何在html中使用html引入css的四种方法"><span>#</span></a></h2><ul>
<li>
<ol>
<li>行内式：直接写在标签内，通过标签属性style引入</li>
</ol>
<ul>
<li>媒介：style属性<code>&lt;style type="text/css"&gt;选择器{}&lt;/style&gt;</code></li>
</ul>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>div</span><span> </span><span>style</span><span>=</span><span>"</span><span>css属性名:属性值；</span><span>"</span><span>&gt;&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>img</span><span> </span><span>style</span><span>=</span><span>"</span><span>css属性名:属性值；</span><span>"</span><span>alt</span><span>=</span><span>""</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p>css想要生效，html中必须有这个元素才可以</p>
</li>
<li>
<ol>
<li>内嵌式（内联式）&lt;将css代码写在style元素内&gt;，通过css选择器选择html元素，将css样式添加个这个元素</li>
</ol>
<ul>
<li>媒介：style标签+选择器</li>
</ul>
</li>
<li>
<p>style这个元素一般放在head元素内</p>
<ul>
<li>style元素：盛装css样式</li>
</ul>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>div</span><span>{height:</span><span><span>100</span><span>px</span></span><span>;}</span></div></div><div><div><div>3</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>&lt;</span><span>div</span><span>&gt;&lt;/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<ol>
<li>外联式（外链式）：将css代码单独放置在一个css文件中，再通过link标签将这个css文件引入到html文件中</li>
</ol>
<ul>
<li>媒介：link标签+选择器</li>
</ul>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>link</span><span> </span><span>rel</span><span>=</span><span>"stylesheet"</span><span> </span><span>herf</span><span>=</span><span>"css文件链接地址"</span><span> </span><span>type</span><span>=</span><span>"text/css"</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p>css这个文件中不能出现标签</p>
</li>
<li>
<ol>
<li>导入式：都是引入一个单独的css文件</li>
</ol>
<ul>
<li>媒介：<code>@import"css文件链接地址"</code>;
<ul>
<li>当有多个css文件的时候，可以使用导入式先导入到一个css文件中，再用外链式link外链进html文件</li>
</ul>
</li>
<li><code>@import"css文件链接地址"</code>;既不是html标签，也不是css属性，他是一条声明语句</li>
<li>这条语句必须写在style元素内,或者css文件内</li>
<li>这条语句必须在所在文件内的第一行</li>
</ul>
</li>
</ul></section>
<section><h2>外链式和导入式的差别：<a href="#外链式和导入式的差别"><span>#</span></a></h2><ul>
<li>link和@import虽然都是引入外部的css文件，但是他们是由天差地别的区别的
<ul>
<li>
<ol>
<li>link是html标签，@import完全是css提供的方式，要写在css文件或者style标签中。</li>
</ol>
</li>
<li>
<ol>
<li>他们的加载顺序也是有区别的，当一个页面被加载的时候，link引用的css文件会被同时加载，而@import引入的css文件会等页面全部下载完后再加载。</li>
</ol>
</li>
<li>
<ol>
<li>当使用javascript控制DOM去改变css样式的时候，只能使用link标签，因为import是不能被DOM控制的。</li>
</ol>
</li>
</ul>
</li>
</ul><section><h3>在工作中常用的引入方式是外链式<a href="#在工作中常用的引入方式是外链式"><span>#</span></a></h3><ul>
<li>
<p>四种引入方式的权重（一个html元素最终加载的css样式是谁决定的）</p>
<ul>
<li>有行内式的时候，听行内的</li>
<li>在选择器相同的情况下，谁最后加载就听谁的</li>
</ul>
</li>
<li>
<p>外链式和内嵌式一般都放在head元素内</p>
</li>
</ul></section></section>
<section><h1>CSS层叠样式表<a href="#css层叠样式表"><span>#</span></a></h1><ul>
<li>css的作用：
<ul>
<li>给html文档添加静态或者动态的样式</li>
</ul>
</li>
<li>css和html如何融合到一起</li>
<li>在css文件中如何选择一个html元素，将样式添加给这个元素</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/HTML%E5%9F%BA%E6%9C%AC%E7%BB%93%E6%9E%84/</id>
      <title type="text">HTML基本结构</title>
      <published>2017-06-30T00:00:00.000Z</published>
      <updated>2017-06-30T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/HTML%E5%9F%BA%E6%9C%AC%E7%BB%93%E6%9E%84/"/>
      <summary type="text">HTML基本结构</summary>
      <content type="html"><![CDATA[<section><h2>html的基本结构<a href="#html的基本结构"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;!</span><span>DOCTYPE</span><span> </span><span>html</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>文档声明：必须放在html文件的第一行；如果没有文档声明会触发浏览器的怪异模式</span></div></div><div><div><div>3</div></div><div><span>&lt;</span><span>html</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span>html元素：告知浏览器，我是一个html文件</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>&lt;</span><span>head</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>head元素：文档的头部，一般放在文档头部的内容不会显示在浏览器的可视区内</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>&lt;</span><span>meta</span><span> </span><span>charset</span><span>=</span><span>"utf-8"</span><span>&gt;规定一个语法</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>必须放在head的第一部分</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>&lt;</span><span>title</span><span>&gt;标题，显示在浏览器的页卡位置，title中的内容也会被seo抓取&lt;/</span><span>title</span><span>&gt;</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>&lt;</span><span>body</span><span>&gt;供用户浏览的所有内容，标签、图片、文本、视频···&lt;/</span><span>body</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>&lt;/</span><span>head</span><span>&gt;</span></div></div><div><div><div>12</div></div><div><span>&lt;/</span><span>html</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>一个html文件也叫做一个网页，可以称作是一个文档(document)</li>
<li>这个文档从html元素开始，一致向下分支延伸，像一颗大树一样，所以我们将html元素叫做这个文档的<strong>根元素</strong></li>
</ul><p><code>&lt;!DOCTYPE html&gt;</code>html5的文档声明</p><ul>
<li>
<p>作用：定义这个文档类型，浏览器先识别这句话，会按照定义的类型去解析这个文档</p>
</li>
<li>
<p>html5的文档声明，那么浏览器就会按照html5的规则解析整个页面
<code>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"       "http://www.w3.org/TR/html4/loose.dtd"&gt;html4版本的文档声明</code></p>
</li>
<li>
<p>所有高版本都会向下兼容，所以在以后的工作中，我们直接将文档声明写错html5就可以了</p>
</li>
<li>
<p>文档声明必须写在html文件的第一行</p>
</li>
<li>
<p>文档声明不区分大小写</p>
</li>
<li>
<p>如果html文件没有文档声明，会触发浏览器的怪异模式</p>
</li>
<li>
<p>文档声明不是一个html标签</p>
</li>
</ul><section><h3>1.html元素<a href="#1html元素"><span>#</span></a></h3><p>此元素告知浏览器其自身是一个html元素
是由开始和结束标签组成的，html文件里面所有的内容都会放在这个这个元素内</p></section><section><h3>2.head元素<a href="#2head元素"><span>#</span></a></h3><ul>
<li>整个文档的头部，head元素自带隐藏功能，display;里面的内容不会隐藏，只不过一般放置在head元素中的其他元素和内容也是自带隐藏功能的，例如link、script、meta···</li>
<li><code>&lt;script&gt;&lt;/script&gt;与head标签一样具有隐藏功能，写在其内的内容在网页不显示</code></li>
</ul></section><section><h3>3.<code>&lt;meta charset="UTF-8"&gt;</code><a href="#3meta-charsetutf-8"><span>#</span></a></h3></section><section><h3>4.<code>&lt;meta&gt;</code>规定了html文档的元信息<a href="#4meta规定了html文档的元信息"><span>#</span></a></h3><ul>
<li>charset=“UTF-8” 文档的编码
<ul>
<li>UTF-8 国际通用编码</li>
<li>gbk 国标</li>
<li>gb2312 国标</li>
</ul>
</li>
<li>name=“keyword” content=“关键词”
<ul>
<li>name=“keyword” content=“HTML5J5…”</li>
<li>SEO优化有关</li>
<li>SEO搜索引擎</li>
</ul>
</li>
</ul><p><code>&lt;meta name="keyword" content="关键词"&gt;</code>
<code>&lt;meta name="description" content="勿忘初心,方得始终"&gt;</code></p></section><section><h3>5.title元素<a href="#5title元素"><span>#</span></a></h3><ul>
<li>html文档名称 一个页面只有一个title元素
放文字 显示在浏览器的页卡（页头）位置</li>
</ul></section><section><h3>6.link标签<a href="#6link标签"><span>#</span></a></h3><ul>
<li><code>&lt;link href="favicon.ico" type="image/x-icon" rel="shortcut icon"&gt;</code>
<ul>
<li>图标让设计师生成</li>
<li>一般整个图片放在整个项目的根目录下</li>
<li>显示在浏览器页卡位置，title内容之前</li>
</ul>
</li>
<li><code>&lt;link rel="stylesheet" herf="url" type="texe/css"&gt;</code>
<ul>
<li>引入一个外部的css文件</li>
<li>rel不能缺少 stylesheet样式表</li>
<li>type可以省略 但是建议写全</li>
</ul>
</li>
</ul></section><section><h3>7.body元素<a href="#7body元素"><span>#</span></a></h3><ul>
<li>定义整个文档的主体部分，所有展示给用户的内容都要放在这个元素中</li>
<li>body中有常用的html元素（div、ul），文本内容、音频、视频、图片、表单</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;!</span><span>DOCTYPE</span><span> </span><span>html</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>html</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>&lt;</span><span>head</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>&lt;</span><span>meta</span><span> </span><span>charset</span><span>=</span><span>"UIF-8"</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>&lt;</span><span>title</span><span>&gt;&lt;/</span><span>title</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>&lt;/</span><span>head</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span>&lt;/</span><span>html</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/HTML%E6%A0%87%E7%AD%BE%E5%88%86%E7%B1%BB/</id>
      <title type="text">HTML标签分类</title>
      <published>2017-06-30T00:00:00.000Z</published>
      <updated>2017-06-30T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/HTML%E6%A0%87%E7%AD%BE%E5%88%86%E7%B1%BB/"/>
      <summary type="text">HTML标签分类</summary>
      <content type="html"><![CDATA[<section><h3>html标签分类<a href="#html标签分类"><span>#</span></a></h3><ul>
<li>html标签又叫做html元素，它分为块级元素和内联元素（也可以叫做行内元素），都是html规范中的概念。</li>
</ul><ul>
<li>块级元素</li>
<li>块级元素是指本身属性为display;的元素。因为它自身的特点，我们通常使用块级元素来进行大布局（大结构）的搭建</li>
<li>块级元素的特点：</li>
<li>
<ol>
<li>独占一行，每一个块级元素都会从新的一行重新开始，从上到下排布</li>
</ol>
</li>
<li>
<ol>
<li>可以直接控制宽度、高度以及盒子模型的相关css属性</li>
</ol>
</li>
<li>
<ol>
<li>在不设置宽度的情况下，块级元素的宽度是它父级元素内容的宽度</li>
</ol>
</li>
<li>
<ol>
<li>在不设置高度的情况下，块级元素的高度是它本身内容的高度</li>
</ol>
<ul>
<li>常用的块级元素:</li>
<li>div 常用块级容器，也是css layout的主要标签</li>
<li>h1 大标题</li>
<li>h2 副标题</li>
<li>h3 三级标题</li>
<li>h4 四级标题</li>
<li>h5 五级标题</li>
<li>h6 六级标题</li>
</ul>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>标题：</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>h1</span><span>&gt;一级标题&lt;/</span><span>h1</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span>&lt;</span><span>h2</span><span>&gt;二级标题&lt;/</span><span>h2</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span>h${$级标题}*6+tab生成：</span></div></div><div><div><div>5</div></div><div><span>&lt;</span><span>h1</span><span>&gt;1级标题&lt;/</span><span>h1</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span>&lt;</span><span>h2</span><span>&gt;2级标题&lt;/</span><span>h2</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span>&lt;</span><span>h3</span><span>&gt;3级标题&lt;/</span><span>h3</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span>&lt;</span><span>h4</span><span>&gt;4级标题&lt;/</span><span>h4</span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span>&lt;</span><span>h5</span><span>&gt;5级标题&lt;/</span><span>h5</span><span>&gt;</span></div></div><div><div><div>10</div></div><div><span>&lt;</span><span>h6</span><span>&gt;6级标题&lt;/</span><span>h6</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>hr 水平分隔线</li>
<li>menu 菜单列表</li>
<li>ol 有序列表 li列表项</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>有序列表</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>ol</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>&lt;</span><span>li</span><span>&gt;盗天仙图&lt;/</span><span>li</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>&lt;</span><span>li</span><span>&gt;名侦探&lt;/</span><span>li</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>&lt;</span><span>li</span><span>&gt;鬼吹灯&lt;/</span><span>li</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>&lt;</span><span>li</span><span>&gt;盗墓笔记&lt;/</span><span>li</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>&lt;</span><span>li</span><span>&gt;名侦探&lt;/</span><span>li</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>&lt;</span><span>li</span><span>&gt;鬼吹灯&lt;/</span><span>li</span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span>&lt;/</span><span>ol</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>ul 无序列表 li列表项</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>无序列表</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>ul</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>&lt;</span><span>li</span><span>&gt;&lt;</span><span>span</span><span> </span><span>style</span><span>=</span><span>"</span><span>color:red</span><span>"</span><span>&gt;√&lt;</span><span>b</span><span>&gt;有保证&lt;/</span><span>b</span><span>&gt;&lt;/</span><span>span</span><span>&gt;:先学习考试后入学&lt;/</span><span>li</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>&lt;</span><span>li</span><span>&gt;&lt;</span><span>span</span><span> </span><span>style</span><span>=</span><span>"</span><span>color:red</span><span>"</span><span>&gt;√&lt;</span><span>b</span><span>&gt;有实力&lt;/</span><span>b</span><span>&gt;&lt;/</span><span>span</span><span>&gt;:专注JS培训七年铸就传奇就业,平均工资超12K&lt;/</span><span>li</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>&lt;</span><span>li</span><span>&gt;&lt;</span><span>span</span><span> </span><span>style</span><span>=</span><span>"</span><span>color:red</span><span>"</span><span>&gt;√&lt;</span><span>b</span><span>&gt;有深度&lt;/</span><span>b</span><span>&gt;&lt;/</span><span>span</span><span>&gt;:结合的大学算法和数据结构的基础课&lt;/</span><span>li</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>&lt;</span><span>li</span><span>&gt;&lt;</span><span>span</span><span> </span><span>style</span><span>=</span><span>"</span><span>color:red</span><span>"</span><span>&gt;√&lt;</span><span>b</span><span>&gt;重原生&lt;/</span><span>b</span><span>&gt;&lt;/</span><span>span</span><span>&gt;:狠练原生代码,原生JS+Node才是王道&lt;/</span><span>li</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>&lt;</span><span>li</span><span>&gt;&lt;</span><span>span</span><span> </span><span>style</span><span>=</span><span>"</span><span>color:red</span><span>"</span><span>&gt;√&lt;</span><span>b</span><span>&gt;重应用&lt;/</span><span>b</span><span>&gt;&lt;/</span><span>span</span><span>&gt;:PC+移动端+H5+CSS3+node的前后台全栈项目&lt;/</span><span>li</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>&lt;</span><span>li</span><span>&gt;&lt;</span><span>span</span><span> </span><span>style</span><span>=</span><span>"</span><span>color:red</span><span>"</span><span>&gt;√&lt;</span><span>b</span><span>&gt;重未来&lt;/</span><span>b</span><span>&gt;&lt;/</span><span>span</span><span>&gt;:app开发,微信开发,angular,es6,前沿技术&lt;/</span><span>li</span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span>&lt;/</span><span>ul</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>dl 定义列表 dt 定义术语 dd定义描述</li>
<li>table 表格</li>
<li>p 段落</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"poem"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>h4</span><span>&gt;早发白帝城&lt;/</span><span>h4</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span>&lt;</span><span>h5</span><span>&gt;作者：李白&lt;/</span><span>h5</span><span>&gt;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>&lt;</span><span>p</span><span>&gt;朝辞白帝彩云间，&lt;</span><span>br</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>千里江陵一日还。&lt;</span><span>br</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>两岸猿声啼不尽，&lt;</span><span>br</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>轻舟已过万重山。&lt;</span><span>br</span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>&lt;</span><span>img</span><span> </span><span>src</span><span>=</span><span>"timg.jpg"</span><span> </span><span>alt</span><span>=</span><span>"李白"</span><span>&gt;</span></div></div><div><div><div>10</div></div><div><span>&lt;/</span><span>p</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span>&lt;/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>div</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>&lt;</span><span>h4</span><span> </span><span>align</span><span>=</span><span>"center"</span><span>&gt;早发白帝城&lt;/</span><span>h4</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>&lt;</span><span>h5</span><span> </span><span>align</span><span>=</span><span>"center"</span><span>&gt;作者：李白&lt;/</span><span>h5</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>&lt;</span><span>p</span><span> </span><span>align</span><span>=</span><span>"center"</span><span>&gt;朝辞白帝彩云间，&lt;/</span><span>p</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>&lt;</span><span>p</span><span> </span><span>align</span><span>=</span><span>"center"</span><span>&gt;千里江陵一日还。&lt;/</span><span>p</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>&lt;</span><span>p</span><span> </span><span>align</span><span>=</span><span>"center"</span><span>&gt;两岸猿声啼不尽，&lt;/</span><span>p</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>&lt;</span><span>p</span><span> </span><span>align</span><span>=</span><span>"center"</span><span>&gt;轻舟已过万重山。&lt;/</span><span>p</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>&lt;</span><span>img</span><span> </span><span>src</span><span>=</span><span>"timg.jpg"</span><span> </span><span>alt</span><span>=</span><span>"李白"</span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span>&lt;/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p>form 交互表单</p>
</li>
<li>
<p>内联元素</p>
</li>
<li>
<p>内联元素是指本身属性为display;的元素。因为它自身的特点，我们通常使用块级元素来进行文字、小图标（小结构）的搭建。</p>
</li>
<li>
<p>内联元素的特点：</p>
</li>
<li>
<ol>
<li>和其他内联元素从左到右在一行显示</li>
</ol>
</li>
<li>
<p>2.不能直接控制宽度、高度以及盒子模型的相关css属性，但是直接设置内外边距的左右值是可以的</p>
</li>
<li>
<p>3.内联元素的宽高是由本身内容的大小决定（文字、图片等）</p>
</li>
<li>
<p>4.内联元素只能容纳文本或者其他内联元素（此处请注意，不要在内联元素中嵌套块级元素）</p>
</li>
<li>
<p>常用的内联元素:</p>
</li>
<li>
<p>span 常用内联容器，定义文本内区块</p>
</li>
<li>
<p>a 锚点</p>
</li>
<li>
<p>文本设置类:</p>
<ul>
<li>b 加粗</li>
<li>strong 加粗强调</li>
<li>i 斜体</li>
<li>em 斜体强调</li>
<li>s 中划线（不推荐使用）</li>
<li>strike 中划线</li>
<li>del 文档中已被删除的文本</li>
<li>big 大字体文本、small小字体文本）</li>
<li>small 小字体文本</li>
<li>br 强制换行</li>
<li>u 下划线</li>
<li>textarea 多行文本输入框</li>
<li>input 输入框</li>
<li>select 下拉列表</li>
<li>label（input 元素定义标注/标记）、img</li>
<li>sub 下标</li>
<li>sup 上标</li>
</ul>
</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/markdown%E7%9A%84%E7%AE%80%E5%8D%95%E4%BD%BF%E7%94%A8/</id>
      <title type="text">markdown的简单使用</title>
      <published>2017-06-30T00:00:00.000Z</published>
      <updated>2017-06-30T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/markdown%E7%9A%84%E7%AE%80%E5%8D%95%E4%BD%BF%E7%94%A8/"/>
      <summary type="text">markdown的简单使用</summary>
      <content type="html"><![CDATA[<ul>
<li>
<p>#—&gt; 一级标题 相当于html中的h1标签</p>
</li>
<li>
<p>[TOC]—&gt;目录</p>
</li>
</ul>

<ul>
<li>
<p>##—&gt; 二级标题 相当于html中的h2标签</p>
</li>
<li>
<p>###—&gt; 三级标题 相当于html中的h3标签</p>
</li>
<li>
<p>####—&gt; 四级标题 相当于html中的h4标签</p>
</li>
<li>
<p>#####—&gt; 五级标题 相当于html中的h5标签</p>
</li>
<li>
<p>######—&gt; 六级标题 相当于html中的h6标签</p>
</li>
<li>
<p>在每个段落或标题结束后 增加一个回车（一行空白）</p>
</li>
<li>
<p>普通段落相当于html中的p标签</p>
</li>
</ul>
<section><h3>列表<a href="#列表"><span>#</span></a></h3><ul>
<li><code>-</code>+<code>空格</code>（-列表-）</li>
<li><code>-</code>+<code>空格</code>+<code>tab</code>（二级列表）</li>
<li><code>-</code>+<code>空格</code>+<code>tab</code>+<code>tab</code>（三级列表）</li>
<li>如何缩进 —&gt; 点击<code>tab</code>键</li>
<li>编辑新的内容（英文状态下，按住<code>shift</code>+<code>—</code>）</li>
</ul></section>
<section><h3><code>&gt;</code> (大于号加空格)—&gt; 摘要或标注<a href="#-大于号加空格-摘要或标注"><span>#</span></a></h3></section>
<section><h3>编辑表格&lt;左边有冒号代表左对齐&gt;,右边有冒号代表右对齐,两边都有冒号代表居中<a href="#编辑表格右边有冒号代表右对齐两边都有冒号代表居中"><span>#</span></a></h3><ul>
<li>快捷键：<code>ctrl+alt+T</code></li>
<li>|标题|标题|标题|</li>
<li>|:----|----:|:----:|</li>
<li>|左对齐|右对齐|居中|</li>
<li>例如:</li>
</ul>

<table><thead><tr><th>标题</th><th>标题</th><th>标题</th></tr></thead><tbody><tr><td>左对齐左对齐左对齐</td><td>右对齐右对齐右对齐</td><td>居中居中居中居中</td></tr><tr><td>内容</td><td>内容</td><td>内容</td></tr></tbody></table></section>
<section><h3>编辑代码块<code>&lt;div&gt;div&lt;/div&gt;</code><a href="#编辑代码块divdivdiv"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>div</span><span>&gt;</span><span>div&lt;</span><span>/</span><span>div</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>div</span><span>&gt;</span><span>div&lt;</span><span>/</span><span>div</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span>&lt;</span><span>div</span><span>&gt;</span><span>div&lt;</span><span>/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h3>编辑行内代码&lt;独立的行间代码&gt;<a href="#编辑行内代码"><span>#</span></a></h3><ul>
<li><code>html</code>中的<code>p</code>标签：<code>&lt;p&gt;</code></li>
</ul></section>
<section><h3>插入图片<a href="#插入图片"><span>#</span></a></h3><ul>
<li>可以直接复制粘贴</li>
<li>快捷键：<code>ctrl+G</code></li>
</ul></section>
<section><h3>插入链接<a href="#插入链接"><span>#</span></a></h3><ul>
<li><code>ctrl+L</code></li>
</ul></section>
<section><h3>保存笔记的方法<a href="#保存笔记的方法"><span>#</span></a></h3><ul>
<li>点击【账号】选择【导出】 —&gt;  可以导出<code>md</code>格式，<code>pdf</code>格式，<code>html</code>格式
<ul>
<li><code>md</code>格式：再次打开时，可以使用文本文档打开，将内容复制一份粘到<code>markdown</code>软件中</li>
<li><code>pdf</code>格式：直接观看，但不能修改</li>
<li><code>html</code>格式：可以浏览器中直接观看，可以在代码编辑器中修改</li>
</ul>
</li>
</ul></section>
<section><h2>快捷键<a href="#快捷键"><span>#</span></a></h2><ul>
<li>文档管理 —&gt; Ctrl+O</li>
<li>帮助 —&gt; Ctrl+/</li>
<li>最大化编辑器 —&gt; Ctrl+Enter</li>
<li>预览文档 —&gt; Ctrl+Alt+Enter</li>
<li>同步文档 —&gt; Ctrl+S</li>
<li>创建文档 —&gt; Ctrl+Alt+N</li>
<li>系统菜单 —&gt; Ctrl+M</li>
<li>斜体 —&gt; Ctrl+I</li>
<li>粗体 —&gt; Ctrl+B</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/window%E5%BF%AB%E6%8D%B7%E9%94%AE%E6%95%B4%E7%90%86/</id>
      <title type="text">Windows快捷键整理</title>
      <published>2017-06-30T00:00:00.000Z</published>
      <updated>2017-06-30T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/window%E5%BF%AB%E6%8D%B7%E9%94%AE%E6%95%B4%E7%90%86/"/>
      <summary type="text">Windows快捷键整理</summary>
      <content type="html"><![CDATA[<section><h2>Windows快捷键整理<a href="#windows快捷键整理"><span>#</span></a></h2><ul>
<li>
<p>window+E 打开我的电脑</p>
</li>
<li>
<p>alt+tab 切换操作界面</p>
</li>
</ul><ul>
<li>
<p>window+R 运行</p>
</li>
<li>
<p>ctrl+C 复制</p>
</li>
<li>
<p>ctrl+X 剪切</p>
</li>
<li>
<p>ctrl+S 保存</p>
</li>
<li>
<p>ctrl+shift+S 另存</p>
</li>
<li>
<p>ctrl+Z 撤销</p>
</li>
<li>
<p>ctrl+W 关闭</p>
</li>
<li>
<p>ctrl+A 全选</p>
</li>
<li>
<p>ctrl+V 粘贴</p>
</li>
<li>
<p>ctrl+alt+delete 资源管理器  或 菜单右键选择资源管理器</p>
</li>
<li>
<p>F2 重命名</p>
</li>
<li>
<p>web：</p>
<ul>
<li>ctrl+alt+L整理代码</li>
</ul>
</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/%E5%89%8D%E7%AB%AF%E4%B8%89%E5%B1%82/</id>
      <title type="text">前端三层</title>
      <published>2017-06-30T00:00:00.000Z</published>
      <updated>2017-06-30T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/%E5%89%8D%E7%AB%AF%E4%B8%89%E5%B1%82/"/>
      <summary type="text">前端三层、前端常识</summary>
      <content type="html"><![CDATA[<section><h2>前端三层<a href="#前端三层"><span>#</span></a></h2><ol>
<li>html结构 是直接被浏览器解析加载</li>
<li>CSS样式 是在html结构之上去装点网站</li>
<li>javascript 交互 动态效果/数据交互</li>
</ol><section><h3>基础知识<a href="#基础知识"><span>#</span></a></h3><ul>
<li>
<ol>
<li>网页</li>
</ol>
<ul>
<li>网页是构成网站的基本元素，通俗来讲，一个html文件就是一个网页</li>
</ul>
</li>
<li>
<ol>
<li>网站</li>
</ol>
<ul>
<li>是由很多个网页组成的，共同为一个目标服务的网页集合</li>
</ul>
</li>
<li>
<ol>
<li>站群（流水线统一化管理）</li>
</ol>
<ul>
<li>由很多网站组成的，为同一个公司服务。</li>
<li>例如整个百度下所属的子公司都有自己的网站。例如：百度搜索/糯米/音乐/手机助手/百度金融等组成的就是一个站群。</li>
</ul>
</li>
</ul></section><section><h3>HTTP（超文本传输协议）<a href="#http超文本传输协议"><span>#</span></a></h3><ul>
<li>HyperText Transfer Protocol</li>
<li>在万维网上提供一种发布和接收HTML页面（网页）的方法。</li>
<li>eg：<code>http://www.baidu.com</code></li>
</ul><p>404服务器无响应</p><section><h4>步骤<a href="#步骤"><span>#</span></a></h4><ol>
<li>输入网址，建立链接，建立客户端和服务端的连接。</li>
<li>发送请求信息：客户端发送一个请求给服务器</li>
<li>发送相应信息：服务器找到请求后，给予相应的响应信息</li>
<li>关闭连接：客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上，然后客户机与服务器断开连接</li>
</ol></section></section><section><h3>服务器<a href="#服务器"><span>#</span></a></h3><ul>
<li>服务器，是提供计算服务的设备。由于服务器需要响应服务请求，并进行处理，因此一般来说服务器应具备承担服务并且保障服务的能力。</li>
<li>在网络环境下，根据服务器提供的服务类型不同，分为文件服务器，数据库服务器，应用程序服务器，WEB服务器等。
<ul>
<li>防篡改：WEB端服务器一旦受到攻击，在0.0n秒做出反应，将内网服务器中的内容，马上覆盖在WEB服务器上。</li>
<li>负载均衡：平均WEB服务器压力，将用户访问进行分流。</li>
<li>vpn：用来翻墙，有指定账号就可以通过这个产品进行内网访问。</li>
</ul>
</li>
</ul></section><section><h3>浏览器<a href="#浏览器"><span>#</span></a></h3><ul>
<li>
<p>浏览器是指可以显示网页服务器或者文件系统的HTML文件（标准通用标记语言的一个应用）内容，并让用户与这些文件交互的一种软件。</p>
</li>
<li>
<p>html，css，js都是运行在这个软件中，浏览器是一个工厂，html/css/js是工人和原料。</p>
</li>
<li>
<p>IE6—&gt;IE7（很快淘汰）—&gt;IE8(时间较长，稳定性好)—&gt;IE9(半年到一年)—&gt;IE10—&gt;IE11—&gt;IE11—&gt;IE(Edge)</p>
</li>
<li>
<p>最好用的浏览器—&gt;谷歌</p>
</li>
</ul></section><section><h3>网页的基本组成<a href="#网页的基本组成"><span>#</span></a></h3><ul>
<li>HTML&lt;是网页的骨架&gt;,支撑起血肉(文字,图片,音视频等)</li>
<li>CSS&lt;表皮和衣服&gt;、化妆品</li>
<li>javascript：动态和交互</li>
</ul></section></section>
<section><h2>HTML（超文本标记语言）<a href="#html超文本标记语言"><span>#</span></a></h2><ul>
<li>网页本身就是一种文本文件（除了文字再无其他），只有通过特定的标记描述，那些普通文本才能在浏览器中正常显示。</li>
<li>在页面中如果遇到图片、音视频的时候，如何用文本描述，需要用超文本进行引入才可以正常显示。</li>
</ul><section><h3>HTML文件的特点<a href="#html文件的特点"><span>#</span></a></h3><ul>
<li>浏览器根据标记来解析和描述内容（从html的第一行开始向下），如果遇到错误，浏览器不会指出也不会报错，会跳过此处继续加载，编辑人员需要根据显示效果去分析哪里出错误了——html不会报错</li>
</ul></section><section><h3>HTML的兼容问题<a href="#html的兼容问题"><span>#</span></a></h3><ul>
<li>因为浏览器是由不同厂商生产的，所以对html的解析有分歧，产生了页面效果显示不一致的情况，我们将这个问题叫做兼容问题。</li>
</ul></section><section><h3>超文本（标签）<a href="#超文本标签"><span>#</span></a></h3><ul>
<li>标签语法：
<ul>
<li>由成对的尖括号和关键字组成，叫做标签。<code>&lt;TagName&gt;</code></li>
<li>关键字（标签名）：是已经规范过的，不是自己随便制造的。</li>
<li>例如：<code>&lt;div&gt;</code> , <code>&lt;/h2&gt;</code> , <code>&lt;img/&gt;</code></li>
</ul>
</li>
</ul></section><section><h3>标签属性<a href="#标签属性"><span>#</span></a></h3><p>属性提供了这个元素的更多信息，语法：由属性名和属性值组成（键值对 key=“value”）</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>span</span><span> </span><span>style</span><span>=</span><span>"</span><span>font-family:宋体;</span><span>"</span><span> </span><span>title</span><span>=</span><span>"标题"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>span是标签名</span></div></div><div><div><div>3</div></div><div><span>style是标签属性名</span></div></div><div><div><div>4</div></div><div><span>"font-family:宋体;标签属性值</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>一个标签可以由多个标签属性，每一个属性之间用空格隔开</p></section><section><h3>标签的分类<a href="#标签的分类"><span>#</span></a></h3><ul>
<li>开始标签 <code>&lt;div&gt;</code></li>
<li>结束标签 <code>&lt;/div&gt;</code></li>
<li>自闭合标签(空标签) <code>&lt;br/&gt;</code></li>
</ul></section><section><h3>HTML元素<a href="#html元素"><span>#</span></a></h3><ul>
<li>
<p>1.可以将元素理解成一个容器，容器中放置的就是</p>
</li>
<li>
<p>2.由标签和内容组成的，叫做元素。</p>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>div</span><span>&gt;</span><span>此处是内容&lt;</span><span>/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h4>元素分类<a href="#元素分类"><span>#</span></a></h4><ul>
<li>
<p>由开始标签和结束标签组成的元素，可以进行嵌套（一个元素包着另一个元素），元素中可以添加内容，只有一个空标签，只能进行功能的添加，例如img元素</p>
</li>
<li>
<p>标签和元素是用来标记和描述内容的，所以这些标签和元素用户是看不到的，用户只能看到这个元素的内容。</p>
</li>
</ul></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/%E7%9B%B8%E5%AF%B9%E8%B7%AF%E5%BE%84%E4%B8%8E%E7%BB%9D%E5%AF%B9%E8%B7%AF%E5%BE%84/</id>
      <title type="text">相对路径与绝对路径</title>
      <published>2017-06-30T00:00:00.000Z</published>
      <updated>2017-06-30T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/%E7%9B%B8%E5%AF%B9%E8%B7%AF%E5%BE%84%E4%B8%8E%E7%BB%9D%E5%AF%B9%E8%B7%AF%E5%BE%84/"/>
      <summary type="text">相对路径与绝对路径</summary>
      <content type="html"><![CDATA[<section><h2>路径url<a href="#路径url"><span>#</span></a></h2><section><h3>绝对路径<a href="#绝对路径"><span>#</span></a></h3><ul>
<li>指带域名的文件的完整路径或磁盘中指定文件的全部路径。
<ul>
<li>例如：C:\windows\system32\cmd.exe</li>
<li>例如：<a href="http://www.zhufengpeixun.com/" target="_blank">http://www.zhufengpeixun.com/</a></li>
</ul>
</li>
<li>可以理解为地址：珠峰培训的地址是北京昌平区回龙观东大街3号楼02号东段珠峰培训</li>
</ul></section><section><h3>相对路径<a href="#相对路径"><span>#</span></a></h3><ul>
<li>是指在同一个文件夹下通过一个参考点找到其他文件</li>
<li>返回上一级用“../”</li>
<li>平级之间直接写文件名</li>
<li>下一级用“/”</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>link</span><span> </span><span>rel</span><span>=</span><span>"stylesheet"</span><span> </span><span>href</span><span>=</span><span>"../面试题.md"</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/Nodejs%E7%9A%84%E5%85%A8%E5%B1%80%E5%AF%B9%E8%B1%A1%E5%92%8C%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F/</id>
      <title type="text">Nodejs的全局对象和全局变量</title>
      <published>2017-06-27T00:00:00.000Z</published>
      <updated>2017-06-27T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/Nodejs%E7%9A%84%E5%85%A8%E5%B1%80%E5%AF%B9%E8%B1%A1%E5%92%8C%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F/"/>
      <summary type="text">Nodejs的全局对象和全局变量</summary>
      <content type="html"><![CDATA[<section><h4>全局对象<a href="#全局对象"><span>#</span></a></h4><ul>
<li>所有模块都可以调用</li>
<li>
<ol>
<li><code>global</code>：表示Node所在的全局环境，类似于浏览器中的<code>window</code>对象。</li>
</ol>
<ul>
<li>你可以通过<code>console.log(global);</code>来输出一下<code>global</code>;</li>
</ul>
</li>
</ul><ul>
<li>
<p>1-1. <code>global</code>全局对象里常用的变量</p>
<ul>
<li>
<ol>
<li><code>__dirname</code> 存储的是在<code>nodejs</code>中执行<code>javascript</code>所在的绝对目录</li>
</ol>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>__dirname</span><span>);</span></span></div></div><div><div><div>2</div></div><div><span>//C:\Users\Gao\Documents\webstore学习文件\node</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<ol>
<li><code>__filename</code>  文件名</li>
</ol>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>__filename</span><span>);</span></span></div></div><div><div><div>2</div></div><div><span>//C:\Users\Gao\Documents\webstore学习文件\node\global.js</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
<li>
<ol>
<li><code>process</code> 程序所执行的一些相关的内容信息的封装对象</li>
</ol>
</li>
<li>
<p>指向<code>Node</code>内置的<code>process</code>模块，允许开发者与当前进程互动。</p>
<ul>
<li>
<p>例如你在DOS或终端窗口直接输入<code>node</code>，就会进入<code>NODE</code>的命令行方式（<code>REPL</code>环境）。如果要退出的话，可以输入 <code>process.exit()</code>;</p>
</li>
<li>
<p>2-1. 和输出相关的 <code>process.stdout</code>/<code>process.stderr</code></p>
<ul>
<li>
<ol>
<li><code>process.stdout</code> —&gt;  <code>standard output</code> —&gt; 标准的信息输出</li>
</ol>
</li>
<li>
<ol>
<li><code>process.stderr</code> —&gt;  <code>standard error</code>  —&gt; 标准的错误输出</li>
</ol>
<ul>
<li>
<p><code>console.info</code>和<code>console.error</code>这些相关的输出功能就是调用的<code>process.stdout</code>和<code>process.stderr</code>来完成的</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>process</span><span>.</span></span><span>stdout</span><span>.</span><span>write</span><span>(</span><span>"this is stdout"</span><span>);</span></div></div><div><div><div>2</div></div><div><span><span>process</span><span>.</span></span><span>stderr</span><span>.</span><span>write</span><span>(</span><span>"this is stderr"</span><span>);</span><span>//红色的</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p>2-2. <code>process</code>如何去监听一些事件</p>
<ul>
<li>
<ol>
<li><code>process.stdin.on()</code>  监听用户输入的键盘信息</li>
</ol>
</li>
<li>
<ol>
<li><code>process.on()</code>监听操作系统对<code>node</code>发出的一些信号</li>
</ol>
</li>
</ul>
</li>
<li>
<p>2-3. 如何读取输入用户的键盘输入</p>
<ul>
<li>
<ol>
<li><code>process.stdin</code></li>
</ol>
<ul>
<li>在使用<code>process.stdin</code>之前  要先对他进行一下编码设置</li>
</ul>
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>process</span><span>.</span></span><span>stdin</span><span>.</span><span>setEncoding</span><span>(</span><span>"utf-8"</span><span>);</span></div></div><div><div><div>2</div></div><div><span>//这里的编码设置和平常编写网页时候的文本编码不一样</span></div></div><div><div><div>3</div></div><div><span>//在这里如果想读取纯文本信息  只要把他的编码设置成utf-8就可以了   不需要去考虑类似jbk或者jb2312来区分是不是中文</span></div></div><div><div><div>4</div></div><div><span>//on方法来监听用户相关的输入事件</span></div></div><div><div><div>5</div></div><div><span>// process.stdin.on("data",function (data) {</span></div></div><div><div><div>6</div></div><div><span>//     console.log(data);</span></div></div><div><div><div>7</div></div><div><span>// });</span></div></div><div><div><div>8</div></div><div><span><span>process</span><span>.</span></span><span>stdin</span><span>.</span><span>on</span><span>(</span><span>"readable"</span><span>,</span><span>function</span><span> () {</span></div></div><div><div><div>9</div></div><div><span>    </span><span>var</span><span><span> </span><span>data</span></span><span>=</span><span><span>process</span><span>.</span></span><span>stdin</span><span>.</span><span>read</span><span>();</span></div></div><div><div><div>10</div></div><div><span>    </span><span>//回调函数没有参数 需要通过process.stdin.read来读取用户的键盘输入信息</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>data</span><span>);</span></span></div></div><div><div><div>12</div></div><div><span>});</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>//exit事件</span></div></div><div><div><div>15</div></div><div><span><span>process</span><span>.</span></span><span>on</span><span>(</span><span>"exit"</span><span>,</span><span>function</span><span> () {</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>"programe will exit"</span><span>);</span></div></div><div><div><div>17</div></div><div><span>});</span></div></div><div><div><div>18</div></div><div><span>//在程序正常退出的之前  会触发exit事件</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>//SIGINT --&gt; signal    interrupted  信号 被中断</span></div></div><div><div><div>21</div></div><div><span>//当一个信号被中断的时候就会触发SIGINT事件(cmd 中  ctrl+c会中断信号)</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span><span>process</span><span>.</span></span><span>on</span><span>(</span><span>"SIGINT"</span><span>,</span><span>function</span><span> () {</span><span>//会改变程序默认的退出行为</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>"programe has a sigint"</span><span>);</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>process</span><span>.</span><span>exit</span><span>();</span><span>//让程序正常退出</span></div></div><div><div><div>26</div></div><div><span>});</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>
</li>
</ul>
</li>
<li>
<ol>
<li>
<p><code>console</code>：指向<code>Node</code>内置的<code>console</code>模块，提供命令行环境中的标准输入、标准输出功能。</p>
<p>通常是写<code>console.log()</code>;</p>
</li>
</ol>
</li>
</ul>
</li>
</ul></section>
<section><h4>全局函数<a href="#全局函数"><span>#</span></a></h4><ul>
<li>
<ol>
<li>定时器函数：共有4个，分别是<code>setTimeout()</code>, <code>clearTimeout()</code>, <code>setInterval()</code>, <code>clearInterval()</code>。</li>
</ol>
</li>
<li>
<ol>
<li><code>require</code>：用于加载模块</li>
</ol>
</li>
</ul></section>
<section><h4>全局变量：<a href="#全局变量"><span>#</span></a></h4><ul>
<li>
<ol>
<li><code>_filename</code>：指向当前运行的脚本文件名。</li>
</ol>
</li>
<li>
<ol>
<li><code>_dirname</code>：指向当前运行的脚本所在的目录</li>
</ol>
</li>
</ul></section>
<section><h4>准全局变量<a href="#准全局变量"><span>#</span></a></h4><ul>
<li>
<p>模块内部的局部变量，指向的对象根据模块不同而不同，但是所有模块都适用，可以看作是伪全局变量，主要为<code>module</code>, <code>module.exports</code>, <code>exports</code>等。</p>
</li>
<li>
<p><code>module</code>变量指代当前模块。<code>module.exports</code>变量表示当前模块对外输出的接口，其他文件加载该模块，实际上就是读取<code>module.exports</code>变量。</p>
</li>
<li>
<p><code>module.id</code> 模块的识别符，通常是模块的文件名。</p>
</li>
<li>
<p><code>module.filename</code> 模块的文件名。</p>
</li>
<li>
<p><code>module.loaded</code> 返回一个布尔值，表示模块是否已经完成加载。</p>
</li>
<li>
<p><code>module.parent</code> 返回使用该模块的模块。</p>
</li>
<li>
<p><code>module.children</code> 返回一个数组，表示该模块要用到的其他模块。</p>
</li>
<li>
<p>这里需要特别指出的是，<code>exports</code>变量实际上是一个指向<code>module.exports</code>对象的链接，等同在每个模块头部，有一行这样的命令。
<code>var exports = module.exports;</code></p>
</li>
<li>
<p>这造成的结果是，在对外输出模块接口时，可以向<code>exports</code>对象添加方法，但是不能直接将<code>exports</code>变量指向一个函数：
<code>exports = function (x){ console.log(x);};</code></p>
</li>
<li>
<p>上面这样的写法是无效的，因为它切断了<code>exports</code>与<code>module.exports</code>之间的链接。</p>
</li>
<li>
<p>如果你觉得，<code>exports</code>与<code>module.exports</code>之间的区别很难分清，一个简单的处理方法，就是放弃使用<code>exports</code>，只使用<code>module.exports</code>。</p>
</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/JS%E4%B8%AD%E7%9A%84caller%E5%92%8Ccallee/</id>
      <title type="text">JS中的caller和callee</title>
      <published>2017-06-26T00:00:00.000Z</published>
      <updated>2017-06-26T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/JS%E4%B8%AD%E7%9A%84caller%E5%92%8Ccallee/"/>
      <summary type="text">JS中的caller和callee</summary>
      <content type="html"><![CDATA[<section><h3><code>caller</code><a href="#caller"><span>#</span></a></h3><ul>
<li>检验函数被谁调用过</li>
<li>检验函数被谁调用过 返回值是调用这个函数的函数本身,没有的话返回null</li>
</ul></section>
<section><h3><code>arguments.callee</code><a href="#argumentscallee"><span>#</span></a></h3><ul>
<li>函数本身</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>Fn</span><span>() {</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>arguments</span><span>.</span><span>callee</span><span>.</span><span>caller</span><span>);</span><span>//--&gt;function fn() {Fn()}</span></div></div><div><div><div>3</div></div><div><span>    </span><span>//--&gt;arguments.callee 函数本身</span></div></div><div><div><div>4</div></div><div><span>    </span><span>//caller:检验函数被谁调用过 返回值是调用这个函数的函数本身,没有的话返回null</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>Fn</span><span>.</span><span>prototype</span><span>.</span><span>constructor</span><span> </span><span>===</span><span> </span><span>arguments</span><span>.</span><span>callee</span><span>);</span><span>//--&gt;true</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div><span>function</span><span> </span><span>fn</span><span>() {</span></div></div><div><div><div>8</div></div><div><span>    </span><span>Fn</span><span>()</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div><div><div><div>10</div></div><div><span>fn</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>sum</span><span><span>(</span><span>n</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>arguments</span><span>.</span><span>callee</span><span>===</span><span>arguments</span><span>.</span><span>callee</span><span>.</span><span>caller</span><span>);</span></div></div><div><div><div>3</div></div><div><span>    </span><span>//-&gt;第一次输出false，因为第一次是函数自己执行，即自调用 自调用的时候console.log(arguments.callee.caller) 输出null   而此时arguments.callee 函数本身仍然是sun函数本身   所以输出false;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>// --&gt;当自调用执行完成后  arguments.callee===arguments.callee.caller===sum这个函数本身   ---&gt;  返回true</span></div></div><div><div><div>5</div></div><div><span>    </span><span>if</span><span><span>(</span><span>n</span></span><span>&lt;=</span><span>0</span><span>){</span></div></div><div><div><div>6</div></div><div><span>        </span><span>return</span><span> </span><span>0</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div><span>    </span><span>return</span><span><span> </span><span>n</span></span><span>+</span><span>sum</span><span>(</span><span>--</span><span><span>n</span><span>);</span></span></div></div><div><div><div>9</div></div><div><span>}</span></div></div><div><div><div>10</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>sum</span><span>(</span><span>10</span><span>));</span><span>//55</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/JS%E4%B8%AD%E7%9A%84%E5%90%8C%E6%AD%A5%E5%BC%82%E6%AD%A5%E7%BC%96%E7%A8%8B%E6%80%9D%E6%83%B3/</id>
      <title type="text">JS中的同步异步编程思想</title>
      <published>2017-06-23T00:00:00.000Z</published>
      <updated>2017-06-23T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/JS%E4%B8%AD%E7%9A%84%E5%90%8C%E6%AD%A5%E5%BC%82%E6%AD%A5%E7%BC%96%E7%A8%8B%E6%80%9D%E6%83%B3/"/>
      <summary type="text">JS中的同步异步编程思想</summary>
      <content type="html"><![CDATA[<ul>
<li>JS是单线程的-&gt;JS就是个傻子,脑子一根筋,做着当前的这件事情,没有完成之前,绝对不会做下一件是事情</li>
</ul>

<section><h3>JS中的两种编程思想&lt;同步&gt;、异步<a href="#js中的两种编程思想异步"><span>#</span></a></h3><ul>
<li>1、同步编程-&gt;上一件事情没有完成,继续处理上一件事情,只有上一件事情完成了,才会做下一件事情(JS中大部分都是同步编程的)</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>for</span><span> (</span><span>var</span><span><span> </span><span>i</span><span> </span></span><span>=</span><span> </span><span>0</span><span><span>; </span><span>i</span><span> </span></span><span>&lt;</span><span> </span><span>100000</span><span><span>; </span><span>i</span></span><span>++</span><span>) {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>if</span><span><span> (</span><span>i</span><span> </span></span><span>==</span><span> </span><span>99999</span><span>) {</span></div></div><div><div><div>3</div></div><div><span><span>        </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>"循环结束了~~"</span><span>);</span><span>//-&gt;(1)</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div><div><div><div>6</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>"ok"</span><span>);</span><span>//-&gt;(2)</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<ol>
<li>for循环就是同步编程的,只有循环结束后,才会继续执行下面的代码</li>
</ol>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>while</span><span> (</span><span>1</span><span>) {</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>}</span></div></div><div><div><div>4</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>"ok"</span><span>);</span><span>//-&gt;永远都不会执行的,因为上面的循环是死循环,循环永远都不会结束</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>2、异步-&gt;规划要做一件事情,但是不是当前立马去执行这件事情,需要等一定的时间,这样的话,我们不会等着它执行,而是继续执行下面的操作,“只有当下面的事情都处理完成了,才会返回头处理之前的事情;如果下面的事情并没有处理完成,不管之前的事情有没有到时间,都踏踏实实的给我等着”</li>
<li>在JS中异步编程只有四种情况:
<ul>
<li>1)定时器都是异步编程的</li>
<li>2)所有的事件绑定都是异步编程的</li>
<li>3)Ajax读取数据的时候,我们一般都设置为异步编程</li>
<li>4)回调函数也是异步编程的</li>
</ul>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>n</span><span> </span></span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>window</span><span>.</span></span><span>setTimeout</span><span>(</span><span>function</span><span> () {</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>n</span><span>++</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>n</span><span>);</span></span><span>//-&gt;1 (2)</span></div></div><div><div><div>5</div></div><div><span>}, </span><span>1000</span><span>);</span></div></div><div><div><div>6</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>n</span><span>);</span></span><span>//-&gt;0 (1)</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>3.定时器
<ul>
<li>
<ol>
<li>每一个浏览器对于定时器的等待时间都有一个最小的值,谷歌&lt;5&gt;6ms IE&lt;10&gt;13ms,如果设置的等待时间小于这个值,不起作用,还是需要等到最小时间才执行的;尤其是写0也不是立即执行;</li>
</ol>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>n</span><span> </span></span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>window</span><span>.</span></span><span>setTimeout</span><span>(</span><span>function</span><span> () {</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>n</span><span>++</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>n</span><span>);</span></span><span>//-&gt;1 (2)</span></div></div><div><div><div>5</div></div><div><span>}, </span><span>0</span><span>);</span></div></div><div><div><div>6</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>n</span><span>);</span></span><span>//-&gt;0 (1)</span></div></div><div><div><div>7</div></div><div><span>//--&gt;先输出0  再输出1</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<ol>
<li>我们定时器设置的等待时间不一定就是最后执行的时间,如果定时器之后还有其他的事情正在处理中,不管定时器的时间有没有到,都是不会执行定时器的</li>
</ol>
</li>
</ul>
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>n</span><span> </span></span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>window</span><span>.</span></span><span>setTimeout</span><span>(</span><span>function</span><span> () {</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>n</span><span>++</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>n</span><span>);</span></span><span>//-&gt;不执行的</span></div></div><div><div><div>5</div></div><div><span>}, </span><span>0</span><span>);</span></div></div><div><div><div>6</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>n</span><span>);</span></span><span>//-&gt;0 (1)</span></div></div><div><div><div>7</div></div><div><span>while</span><span> (</span><span>1</span><span>) {</span><span>//-&gt;死循环</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>n</span><span>++</span><span>;</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div><div><div><div>10</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>n</span><span>);</span></span><span>//-&gt;不执行</span></div></div><div><div><div>11</div></div><div><span>var</span><span><span> </span><span>n</span><span> </span></span><span>=</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>window</span><span>.</span></span><span>setTimeout</span><span>(</span><span>function</span><span> () {</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>n</span><span> </span><span>+=</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>n</span><span>); </span></span><span>//-&gt;7 (4)</span></div></div><div><div><div>15</div></div><div><span>}, </span><span>20</span><span>);</span></div></div><div><div><div>16</div></div><div><span><span>window</span><span>.</span></span><span>setTimeout</span><span>(</span><span>function</span><span> () {</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>n</span><span> </span><span>+=</span><span> </span><span>5</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>n</span><span>); </span></span><span>//-&gt;5 (3)</span></div></div><div><div><div>19</div></div><div><span>}, </span><span>5</span><span>);</span></div></div><div><div><div>20</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>n</span><span>);</span></span><span>//-&gt;0 (1)</span></div></div><div><div><div>21</div></div><div><span>for</span><span> (</span><span>var</span><span><span> </span><span>i</span><span> </span></span><span>=</span><span> </span><span>0</span><span><span>; </span><span>i</span><span> </span></span><span>&lt;</span><span> </span><span>10000000</span><span><span>; </span><span>i</span></span><span>++</span><span>) {}</span></div></div><div><div><div>22</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>n</span><span>);</span></span><span>//-&gt;0 (2)</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>
<ul>
<li>3)事件绑定</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>oLis</span></span><span>=</span><span><span>document</span><span>.</span></span><span>getElementsByTagName</span><span>(</span><span>"li"</span><span>);</span></div></div><div><div><div>2</div></div><div><span>    </span><span>for</span><span>(</span><span>var</span><span><span> </span><span>i</span></span><span>=</span><span>0</span><span><span>;</span><span>i</span></span><span>&lt;</span><span><span>oLis</span><span>.</span></span><span>length</span><span><span>;</span><span>i</span></span><span>++</span><span>){</span></div></div><div><div><div>3</div></div><div><span><span>        </span></span><span>oLis</span><span>[</span><span>i</span><span>].</span><span>onclick</span><span>=</span><span>function</span><span>(){</span></div></div><div><div><div>4</div></div><div><span>            </span><span>tabChange</span><span><span>(</span><span>i</span><span>);</span></span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/DOS%E5%9F%BA%E6%9C%AC%E5%91%BD%E4%BB%A4%E5%A4%A7%E5%85%A8/</id>
      <title type="text">DOS基本命令大全</title>
      <published>2017-06-20T00:00:00.000Z</published>
      <updated>2017-06-20T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/DOS%E5%9F%BA%E6%9C%AC%E5%91%BD%E4%BB%A4%E5%A4%A7%E5%85%A8/"/>
      <summary type="text">DOS基本命令大全</summary>
      <content type="html"><![CDATA[<section><h4>基本命令<a href="#基本命令"><span>#</span></a></h4><ul>
<li>
<p>1、列出文件</p>
<ul>
<li>ls 参数 目录名</li>
<li>例: 看看驱动目录下有什么 /System/Library/Extensions</li>
<li>参数 -w 显示中文，-l 详细信息， -a 包括隐藏文件</li>
</ul>
</li>
<li>
<p>2、转换目录</p>
<ul>
<li>cd    例：想到驱动目录下溜达一圈   cd /System/Library/Extensions</li>
</ul>
</li>
<li>
<p>3、建立新目录</p>
<ul>
<li>mkdir 目录名</li>
<li>例：在驱动目录下建一个备份目录 backup</li>
<li>mkdir /System/Library/Extensions/backup</li>
<li>在桌面上建一个备份目录 backup</li>
<li>mkdir /User/用户名/Desktop/backup</li>
</ul>
</li>
<li>
<p>4、拷贝文件</p>
<ul>
<li>cp 参数 源文件 目标文件</li>
<li>例：想把桌面的Natit.kext 拷贝到驱动目录中</li>
<li>cp -R /User/用户名/Desktop/Natit.kext /System/Library/Extensions</li>
<li>参数R表示对目录进行递归操作，kext在图形界面下看起来是个文件，实际上是个文件夹。</li>
<li>把驱动目录下的所有文件备份到桌面backup</li>
<li>cp -R /System/Library/Extensions/* /User/用户名/Desktop/backup</li>
</ul>
</li>
<li>
<p>5、删除文件</p>
<ul>
<li>rm 参数 文件</li>
<li>例：想删除驱动的缓存  rm -rf /System/Library/Extensions.kextcache</li>
<li>rm -rf /System/Library/Extensions.mkext</li>
<li>参数－rf 表示递归和强制，千万要小心使用，如果执行了 rm -rf / 你的系统就全没了</li>
</ul>
</li>
<li>
<p>6、移动文件</p>
<ul>
<li>mv 文件</li>
<li>例：想把AppleHDA.Kext 移到桌面</li>
<li>mv /System/Library/Extensions/AppleHDA.kext /User/用户名/Desktop</li>
<li>想把AppleHDA.Kext 移到备份目录中</li>
<li>mv /System/Library/Extensions/AppleHDA.kext /System/Library/Extensions/backup</li>
</ul>
</li>
<li>
<p>7、文本编辑</p>
<ul>
<li>nano 文件名</li>
<li>例：编辑natit Info.plist</li>
<li>nano /System/Library/Extensions/Natit.kext/Info.plist</li>
</ul>
</li>
</ul><blockquote><p>目录操作</p></blockquote><ul>
<li>
<p>命令名           功能描述                          使用举例</p>
</li>
<li>
<p>mkdir        创建一个目录                      mkdir dirname</p>
</li>
<li>
<p>rmdir        删除一个目录                      rmdir dirname</p>
</li>
<li>
<p>mvdir        移动或重命名一个目录                mvdir dir1 dir2</p>
</li>
<li>
<p>cd           改变当前目录                       cd dirname</p>
</li>
<li>
<p>pwd          显示当前目录的路径名                pwd</p>
</li>
<li>
<p>ls           显示当前目录的内容                  ls -la</p>
</li>
</ul><blockquote><p>文件操作</p></blockquote><ul>
<li>
<p>命令名              功能描述                  使用举例</p>
</li>
<li>
<p>cat        显示或连接文件                 cat filename</p>
</li>
<li>
<p>od         显示非文本文件的内容            od -c filename</p>
</li>
<li>
<p>cp         复制文件或目录                 cp file1 file2</p>
</li>
<li>
<p>rm         删除文件或目录                 rm filename</p>
</li>
<li>
<p>mv         改变文件名或所在目录            mv file1 file2</p>
</li>
<li>
<p>find       使用匹配表达式查找文件          find . -name “*.c” -print</p>
</li>
<li>
<p>file       显示文件类型                  file filename</p>
</li>
</ul><blockquote><p>选择操作</p></blockquote><ul>
<li>
<p>命令名           功能描述                  使用举例</p>
</li>
<li>
<p>head      显示文件的最初几行          head -20 filename</p>
</li>
<li>
<p>tail      显示文件的最后几行          tail -15 filename</p>
</li>
<li>
<p>cut       显示文件每行中的某些域       cut -f1,7 -d: /etc/passwd</p>
</li>
<li>
<p>colrm     从标准输入中删除若干列       colrm 8 20 file2</p>
</li>
<li>
<p>diff      比较并显示两个文件的差异      diff file1 file2</p>
</li>
<li>
<p>sort      排序或归并文件               sort -d -f -u file1</p>
</li>
<li>
<p>uniq      去掉文件中的重复行            uniq file1 file2</p>
</li>
<li>
<p>comm      显示两有序文件的公共和非公共行   comm file1 file2</p>
</li>
<li>
<p>wc        统计文件的字符数、词数和行数     wc filename</p>
</li>
<li>
<p>nl        给文件加上行号                nl file1 &gt;file2</p>
</li>
</ul><blockquote><p>进程操作</p></blockquote><ul>
<li>
<p>命令名          功能描述               使用举例</p>
</li>
<li>
<p>ps          显示进程当前状态           ps u</p>
</li>
<li>
<p>kill        终止进程                 kill -9 30142</p>
</li>
</ul><blockquote><p>时间操作</p></blockquote><ul>
<li>
<p>命令名       功能描述                 使用举例</p>
</li>
<li>
<p>date      显示系统的当前日期和时间      date</p>
</li>
<li>
<p>cal       显示日历                    cal 8 1996</p>
</li>
<li>
<p>time      统计程序的执行时间           time a.out</p>
</li>
</ul><blockquote><p>网络与通信操作</p></blockquote><ul>
<li>
<p>命令名          功能描述                         使用举例</p>
</li>
<li>
<p>telnet      远程登录                       telnet hpc.sp.NET.edu.cn</p>
</li>
<li>
<p>rlogin      远程登录                       rlogin hostname -l username</p>
</li>
<li>
<p>rsh         在远程主机执行指定命令            rsh f01n03 date</p>
</li>
<li>
<p>ftp         在本地主机与远程主机之间传输文件    ftpftp.sp.net.edu.cn</p>
</li>
<li>
<p>rcp         在本地主机与远程主机 之间复制文件   rcp file1 host1</p>
</li>
<li>
<p>ping        给一个网络主机发送 回应请求         ping hpc.sp.net.edu.cn</p>
</li>
<li>
<p>mail        阅读和发送电子邮件                 mail</p>
</li>
<li>
<p>write       给另一用户发送报文                 write username pts/1</p>
</li>
<li>
<p>mesg        允许或拒绝接收报文                 mesg n</p>
</li>
</ul><blockquote><p>Korn Shell 命令</p></blockquote><ul>
<li>
<p>命令名              功能描述                     使用举例</p>
</li>
<li>
<p>history       列出最近执行过的 几条命令及编号        history</p>
</li>
<li>
<p>r             重复执行最近执行过的 某条命令          r -2</p>
</li>
<li>
<p>alias         给某个命令定义别名                   alias del=rm -i</p>
</li>
<li>
<p>unalias       取消对某个别名的定义                 unalias del</p>
</li>
</ul><blockquote><p>其它命令</p></blockquote><ul>
<li>
<p>命令名                功能描述                    使用举例</p>
</li>
<li>
<p>uname      显示操作系统的有关信息                  uname -a</p>
</li>
<li>
<p>clear      清除屏幕或窗口内容                       clear</p>
</li>
<li>
<p>env        显示当前所有设置过的环境变量              env</p>
</li>
<li>
<p>who        列出当前登录的所有用户                   who</p>
</li>
<li>
<p>whoami     显示当前正进行操作的用户名               whoami</p>
</li>
<li>
<p>tty        显示终端或伪终端的名称                  tty</p>
</li>
<li>
<p>stty       显示或重置控制键定义                   stty -a</p>
</li>
<li>
<p>du         查询磁盘使用情况                       du -k subdir</p>
</li>
<li>
<p>df /tmp    显示文件系统的总空间和可用空间</p>
</li>
<li>
<p>w          显示当前系统活动的总信息</p>
</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/IE%E7%89%88%E6%9C%AC%E6%9D%A1%E4%BB%B6%E6%B3%A8%E9%87%8A%E8%AF%AD%E5%8F%A5(%E5%85%A8)/</id>
      <title type="text">IE版本条件注释语句(全)</title>
      <published>2017-06-20T00:00:00.000Z</published>
      <updated>2017-06-20T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/IE%E7%89%88%E6%9C%AC%E6%9D%A1%E4%BB%B6%E6%B3%A8%E9%87%8A%E8%AF%AD%E5%8F%A5(%E5%85%A8)/"/>
      <summary type="text">IE版本条件注释语句(全)</summary>
      <content type="html"><![CDATA[<ul>
<li>IE版本条件注释语句(全)</li>
</ul>

<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;!--[if lt IE 9]&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;script charset="utf-8" type="text/javascript" src="js/html5.min.js"&gt;&lt;/script&gt;</span></div></div><div><div><div>3</div></div><div><span>&lt;![endif]--&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>1、只有IE才能识别</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;!--[if IE]&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;link type="text/css" rel="stylesheet" href="my.css" /&gt;</span></div></div><div><div><div>3</div></div><div><span>&lt;![endif]--&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>因为只有IE5以上的版本才开始支持IE条件注释，所有“只有IE”才能识别的意思是“只有IE5版本以上”才能识别。</p>
</li>
<li>
<p>2、只有特定版本才能识别</p>
</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;!--[if IE 8]&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;link type="text/css" rel="stylesheet" href="my.css" /&gt;</span></div></div><div><div><div>3</div></div><div><span>&lt;![endif]--&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>识别特定的IE版本，高了或者低了都不可以。上例只有IE8才能识别。</p>
</li>
<li>
<p>3、只有不是特定版本的才能识别</p>
</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;!--[if !IE 7]&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;link type="text/css" rel="stylesheet" href="my.css" /&gt;</span></div></div><div><div><div>3</div></div><div><span>&lt;![endif]--&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>上例中特定IE7版本不能识别，其他版本都能识别，当然要在IE5以上。</p>
</li>
<li>
<p>4、只有高于特定版本才能识别</p>
</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;!--[if gt IE 7]&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;link type="text/css" rel="stylesheet" href="my.css" /&gt;</span></div></div><div><div><div>3</div></div><div><span>&lt;![endif]--&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>上例中只有高于IE7的版本才能识别。IE7无法识别。</p>
</li>
<li>
<p>5、等于或者高于特定版本才能识别</p>
</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;!--[if gte IE 7]&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;link type="text/css" rel="stylesheet" href="my.css" /&gt;</span></div></div><div><div><div>3</div></div><div><span>&lt;![endif]--&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>上例中IE7和更高的版本都能识别。</p>
</li>
<li>
<p>6、只有低于特定版本的才能识别</p>
</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;!--[if lt IE 7]&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;link type="text/css" rel="stylesheet" href="my.css" /&gt;</span></div></div><div><div><div>3</div></div><div><span>&lt;![endif]--&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>上例中只有低于IE7的版本才能识别，IE7无法识别。</p>
</li>
<li>
<p>7、等于或者低于特定版本的才能识别</p>
</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;!--[if lte IE 7]&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;link type="text/css" rel="stylesheet" href="my.css" /&gt;</span></div></div><div><div><div>3</div></div><div><span>&lt;![endif]--&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>上例中IE7和更低的版本可以识别。</p>
</li>
<li>
<p>关键词解释</p>
</li>
<li>
<p>上面那些代码好像很难记的样子，其实只要稍微解释一下关键字就很容易记住了。</p>
</li>
<li>
<p>lt ：就是Less than的简写，也就是小于的意思。</p>
</li>
<li>
<p>lte ：就是Less than or equal to的简写，也就是小于或等于的意思。</p>
</li>
<li>
<p>gt ：就是Greater than的简写，也就是大于的意思。</p>
</li>
<li>
<p>gte：就是Greater than or equal to的简写，也就是大于或等于的意思。</p>
</li>
<li>
<p>!：就是不等于的意思，跟javascript里的不等于判断符相同。</p>
</li>
</ul>
<blockquote><p>特别提示：</p></blockquote>
<ul>
<li>１、有人会试图使用&lt;!—[if !IE]&gt;来定义非IE浏览器下的状况，但注意：条件注释只有在IE浏览器下才能执行，这个代码在非IE浏览下被当做注释视而不见。</li>
<li>２、我们通常用IE条件注释根据浏览器不同载入不同css，从而解决样式兼容性问题的。其实它可以做的更多。它可以保护任何代码块——HTML代码块、JavaScript代码块、服务器端代码……看看下面的代码。</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;!--[if IE]&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;script type="text/javascript"&gt;</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>alert("你使用的是IE浏览器！");</span></div></div><div><div><div>4</div></div><div><span>&lt;/script&gt;</span></div></div><div><div><div>5</div></div><div><span>&lt;![endif]--&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>!–[if !IE]&gt;</span><span>&lt;</span><span>!–&gt;</span><span>&lt;</span><span>!–</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–除IE外都可识别（IE10版本以上也可以识别）–&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>!–[if IE]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE9以及以下版本可识别–&gt;</span></div></div><div><div><div>3</div></div><div><span>&lt;</span><span>!–[if IE 5]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–仅IE5可识别–&gt;</span></div></div><div><div><div>4</div></div><div><span>&lt;</span><span>!–[if IE 5.0]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–仅IE5.0可识别–&gt;</span></div></div><div><div><div>5</div></div><div><span>&lt;</span><span>!–[if IE 5.5]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–仅IE5.5可识别–&gt;</span></div></div><div><div><div>6</div></div><div><span>&lt;</span><span>!–[if IE 6]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–仅IE6可识别–&gt;</span></div></div><div><div><div>7</div></div><div><span>&lt;</span><span>!–[if IE 7]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–仅IE7可识别–&gt;</span></div></div><div><div><div>8</div></div><div><span>&lt;</span><span>!–[if IE 8]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–仅IE8可识别–&gt;</span></div></div><div><div><div>9</div></div><div><span>&lt;</span><span>!–[if IE 9]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–仅IE9可识别–&gt;</span></div></div><div><div><div>10</div></div><div><span>&lt;</span><span>!–[if lt IE 5]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE5以下版本可识别–&gt;</span></div></div><div><div><div>11</div></div><div><span>&lt;</span><span>!–[if lt IE 5.0]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE5.0以下版本可识别–&gt;</span></div></div><div><div><div>12</div></div><div><span>&lt;</span><span>!–[if lt IE 5.5]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE5.5以下版本可识别–&gt;</span></div></div><div><div><div>13</div></div><div><span>&lt;</span><span>!–[if lt IE 6]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE6以下版本可识别–&gt;</span></div></div><div><div><div>14</div></div><div><span>&lt;</span><span>!–[if lt IE 7]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE7以下版本可识别–&gt;</span></div></div><div><div><div>15</div></div><div><span>&lt;</span><span>!–[if lt IE 8]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE8以下版本可识别–&gt;</span></div></div><div><div><div>16</div></div><div><span>&lt;</span><span>!–[if lt IE 9]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE9以下版本可识别–&gt;</span></div></div><div><div><div>17</div></div><div><span>&lt;</span><span>!–[if lte IE 5]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE5以及IE5以下版本可识别–&gt;</span></div></div><div><div><div>18</div></div><div><span>&lt;</span><span>!–[if lte IE 5.0]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE5.0以及IE5.0以下版本可识别–&gt;</span></div></div><div><div><div>19</div></div><div><span>&lt;</span><span>!–[if lte IE 5.5]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE5.5以及IE5.5以下版本可识别–&gt;</span></div></div><div><div><div>20</div></div><div><span>&lt;</span><span>!–[if lte IE 6]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE6以及IE6以下版本可识别–&gt;</span></div></div><div><div><div>21</div></div><div><span>&lt;</span><span>!–[if lte IE 7]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE7以及IE7以下版本可识别–&gt;</span></div></div><div><div><div>22</div></div><div><span>&lt;</span><span>!–[if lte IE 8]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE8以及IE8以下版本可识别–&gt;</span></div></div><div><div><div>23</div></div><div><span>&lt;</span><span>!–[if lte IE 9]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE9以及IE9以下版本可识别–&gt;</span></div></div><div><div><div>24</div></div><div><span>&lt;</span><span>!–[if gt IE 5]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE5以上版本可识别–&gt;</span></div></div><div><div><div>25</div></div><div><span>&lt;</span><span>!–[if gt IE 5.0]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE5.0以上版本可识别–&gt;</span></div></div><div><div><div>26</div></div><div><span>&lt;</span><span>!–[if gt IE 5.5]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE5.5以上版本可识别–&gt;</span></div></div><div><div><div>27</div></div><div><span>&lt;</span><span>!–[if gt IE 6]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE6以上版本可识别–&gt;</span></div></div><div><div><div>28</div></div><div><span>&lt;</span><span>!–[if gt IE 7]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE7以上版本可识别–&gt;</span></div></div><div><div><div>29</div></div><div><span>&lt;</span><span>!–[if gt IE 8]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE8以上版本可识别–&gt;</span></div></div><div><div><div>30</div></div><div><span>&lt;</span><span>!–[if gt IE 9]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE9以上版本可识别–&gt;</span></div></div><div><div><div>31</div></div><div><span>&lt;</span><span>!–[if gte IE 5]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE5以及IE5以上版本可识别–&gt;</span></div></div><div><div><div>32</div></div><div><span>&lt;</span><span>!–[if gte IE 5.0]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE5.0以及IE5.0以上版本可识别–&gt;</span></div></div><div><div><div>33</div></div><div><span>&lt;</span><span>!–[if gte IE 5.5]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE5.5以及IE5.5以上版本可识别–&gt;</span></div></div><div><div><div>34</div></div><div><span>&lt;</span><span>!–[if gte IE 6]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE6以及IE6以上版本可识别–&gt;</span></div></div><div><div><div>35</div></div><div><span>&lt;</span><span>!–[if gte IE 7]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE7以及IE7以上版本可识别–&gt;</span></div></div><div><div><div>36</div></div><div><span>&lt;</span><span>!–[if gte IE 8]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE8以及IE8以上版本可识别–&gt;</span></div></div><div><div><div>37</div></div><div><span>&lt;</span><span>!–[if gte IE 9]&gt;</span><span>&lt;</span><span>![endif]–&gt;</span><span>&lt;</span><span>!–IE9以及IE9以上版本可识别–&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/%E7%BD%91%E7%AB%99%E5%A6%82%E4%BD%95%E5%8F%91%E5%B8%83/</id>
      <title type="text">网站如何发布</title>
      <published>2017-06-20T00:00:00.000Z</published>
      <updated>2017-06-20T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/%E7%BD%91%E7%AB%99%E5%A6%82%E4%BD%95%E5%8F%91%E5%B8%83/"/>
      <summary type="text">网站如何发布</summary>
      <content type="html"><![CDATA[<ul>
<li>客户端（浏览器）</li>
<li>DNS服务器  域名解析服务器</li>
<li><a href="http://www.baidu.com-%3E61.135.169.121" target="_blank">www.baidu.com-&gt;61.135.169.121</a></li>
</ul>

<section><h4>网站如何发布?<a href="#网站如何发布"><span>#</span></a></h4><section><h5>1.租一台服务器（阿里云服务器：主机/虚拟服务器） 给这个主机/服务器连接网络（连个网线），联网之后就会有个外网ip地址 （就是别人通过外网的ip可以找到我们的服务器，一般公司都会禁止外网IP访问）<a href="#1租一台服务器阿里云服务器主机虚拟服务器-给这个主机服务器连接网络连个网线联网之后就会有个外网ip地址-就是别人通过外网的ip可以找到我们的服务器一般公司都会禁止外网ip访问"><span>#</span></a></h5><ul>
<li>
<p>例如，通过本地webstore打开本地的文件地址是 <code>http://localhost:63342/webstore%E5%AD%A6%E4%B9%A0%E6%96%87%E4%BB%B6/JS%E6%AD%A3%E5%BC%8F%E8%AF%BE/%E5%91%A8%E5%95%B8%E5%A4%A9%E8%AF%BE%E4%BB%B6/JavaScript201602-master/20160512_CSS3%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/PPT/%E9%99%84%E4%BB%B6/2%E3%80%81%E5%B8%B8%E7%94%A8%E5%B1%9E%E6%80%A7/1%E3%80%81%E4%BD%BF%E7%94%A8border-color%E5%88%B6%E4%BD%9C%E4%B8%89%E8%A7%92%E7%AC%A6%E5%8F%B7.html?_ijt=214ukq11e5l4bismdevhkenfhm</code></p>
<ul>
<li>localhost&lt;本地文件地址&gt;</li>
</ul>
</li>
<li>
<p>百度的服务器的外网IP：61.135.169.121</p>
</li>
</ul></section><section><h5>2.买一个域名（域名备案）<a href="#2买一个域名域名备案"><span>#</span></a></h5><ul>
<li>域名有哪些？
<ul>
<li>.cn / .com / .net / .org / .wang /.gov…</li>
</ul>
</li>
</ul></section><section><h5>3.将自己的项目放到服务器上 上传到服务器指定的磁盘上—&gt;FTP上传（上传工具FileZilla）<a href="#3将自己的项目放到服务器上-上传到服务器指定的磁盘上ftp上传上传工具filezilla"><span>#</span></a></h5></section><section><h5>4.发布项目（网站）一个服务区可以发布多个项目，每个项目各自占一个端口，每一个端口都有对应的端口号（每一个端口号都是唯一的，不能重复的），用端口号来进行区分项目—&gt;0~65535之间的任意一个数<a href="#4发布项目网站一个服务区可以发布多个项目每个项目各自占一个端口每一个端口都有对应的端口号每一个端口号都是唯一的不能重复的用端口号来进行区分项目065535之间的任意一个数"><span>#</span></a></h5><p>发布网站的工具 IIS  Apache   nginx   node</p></section><section><h5>5.域名解析（DNS解析） 把购买的域名和服务器的IP地址关联到一起 以后只要提到域名 就关联的是这个服务器<a href="#5域名解析dns解析-把购买的域名和服务器的ip地址关联到一起-以后只要提到域名-就关联的是这个服务器"><span>#</span></a></h5><ul>
<li>DNS服务器：他是一台服务器 是属于全世界的万维网联盟，只要是地球上的域名解析都在他这里进行</li>
<li><code>www.baidu.com</code>  61.135.169.121</li>
<li><code>www.jd.com</code>  111.206.231.1</li>
</ul><blockquote><p>HTTP事物</p></blockquote><ul>
<li>请求<code>Request</code>阶段：</li>
<li>1.客户端通过域名访问，到DNS服务器上找到对应的外网IP地址</li>
<li>2.通过外网IP找到对应的项目服务器</li>
<li>3.通过端口号找到服务器上对应的项目，因为在发布项目的时候，就已经将项目文件和端口号对应了</li>
<li>响应response阶段：</li>
<li>4.服务器将客户端请求的资源文件的 源代码 返回给客户端</li>
<li>5.客户端（浏览器）进行解析文件 渲染页面
<ul>
<li>这两步组成了前后交互的模型/过程 “HTTP事物”—&gt;只有请求Request阶段  响应response阶段  都完成  才叫做HTTP事物</li>
</ul>
</li>
</ul><blockquote><p>URI</p></blockquote><ul>
<li>URI：统一资源标识符</li>
<li>URI=URL+URN</li>
<li>URL：统一资源定位符</li>
<li>URN：统一资源名称</li>
</ul></section><section><h5>一个完整的URL   —&gt;    <code>https://www.baidu.com:443/xxx/xxx.html?name=hh&amp;age=10#video</code><a href="#一个完整的url-------httpswwwbaiducom443xxxxxxhtmlnamehhage10video"><span>#</span></a></h5><ul>
<li>
<ol>
<li>https 传输协议</li>
</ol>
<ul>
<li>传输协议：HTTP / HTTPS  /  FTP</li>
<li>他是内容传输的媒介（快递公司）</li>
<li>客户端通过传输协议把一些信息传给服务器</li>
<li>同样 服务端也可以把一些信息返回给客户端</li>
<li>HTTP：超文本传输协议 除了传输文本之外 还可以传输其他的东西 比如图片 音频 视频（二进制流/base64）</li>
<li>HTTPS&lt;更安全的http&gt;，因为他的传输通道加密了（SSL加密）（一般跟金钱 用户重要信息的网站都会采用HTTPS传输）</li>
<li>FTP：一般都是将我们的项目文件传到服务器上，采用一些工具 例如上传工具FileZilla</li>
</ul>
</li>
<li>
<ol>
<li><code>www.baidu.com</code> 域名</li>
</ol>
<ul>
<li>一级域名 <code>www.qq.com</code> 一级域名 需要购买 ，二级域名、三级域名自己分配即可</li>
<li>二级域名 sport.qq.com</li>
<li>三级域名 kbs.sports.qq.com</li>
</ul>
</li>
<li>
<ol>
<li>443 端口号</li>
</ol>
<ul>
<li>取值范围 0-65535之间的一个数</li>
<li>HTTP的端口号&lt;80&gt;</li>
<li>HTTPS的端口号&lt;443&gt;</li>
<li>FTP的端口号&lt;21&gt;</li>
<li>webstore 默认的端口号：63342</li>
</ul>
</li>
<li>
<ol>
<li>xxx/xxx.html 文件的目录—请求文件的路径和名称</li>
</ol>
<ul>
<li>表示的是在当前项目下xxx文件夹下的xxx.html</li>
<li>/index.html    表示的是当前项目根目录下的index.html文件</li>
<li>../index.html  表示的是当前项目上一级目录下的index.html文件</li>
<li>在不指定文件目录的时候 默认进入的是index.html（因为一般在发布项目的时候，会指定一个默认的入口文件 一般是index.html或者deflut.html）</li>
</ul>
</li>
<li>
<ol>
<li>?name=hh&amp;age=10?+参数</li>
</ol>
<ul>
<li>1）客户端可以通过 ?+参数 的方式给服务器传递一些信息</li>
<li>2）服务器不进行处理，例如之前做H5的时候  根据page=n，展示不同的区域</li>
<li>3）处理缓存的问题 传某个参数，但是这个参数服务器不需要  我们用它来做缓存处理  保证每次的URL都不一样  防止缓存   （例如ajax获取数据的拼接）</li>
</ul>
</li>
<li>
<ol>
<li>#video 哈希值HASH</li>
</ol>
<ul>
<li>1） 客户端也可以通过这种方式给服务器传数据 （一般不用了）</li>
<li>2） 锚点定位</li>
<li>3） 通过哈希值HASH 实现页面路由的切换</li>
</ul>
</li>
</ul></section><section><h5>6.客户端 浏览器 代码解析和页面的渲染<a href="#6客户端-浏览器-代码解析和页面的渲染"><span>#</span></a></h5><ul>
<li>开发标准由W3C</li>
<li>W3C：一个非盈利机构，他就是用来制定编程规范和标准的地方</li>
<li>按照浏览器的开发标准和规范开发出来的浏览器 都有一个东西叫引擎 也就是内核</li>
<li>我们前端工程师也要按照标准和规范去写代码</li>
<li>把符合标准的代码放到标准的浏览器中 通过引擎来渲染</li>
<li>IE内核（Trident引擎）：IE5-11，IE Edge，360，猎豹，百度</li>
<li>Gecko：火狐</li>
<li>webkit（V8引擎）  最快的 ：谷歌、Safari、QQ</li>
<li>Presto引擎：欧朋Opera</li>
</ul></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/Canvas%E4%B9%8B3%E7%BB%98%E5%88%B6%E7%9F%A9%E5%BD%A2/</id>
      <title type="text">Canvas之3绘制矩形</title>
      <published>2017-06-09T00:00:00.000Z</published>
      <updated>2017-06-09T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/Canvas%E4%B9%8B3%E7%BB%98%E5%88%B6%E7%9F%A9%E5%BD%A2/"/>
      <summary type="text">Canvas之3绘制矩形</summary>
      <content type="html"><![CDATA[<ul>
<li>
<ol>
<li><code>cvs.fillRect(x,y,w,h);</code> —&gt; 填充矩形</li>
</ol>
<ul>
<li>x,y 是这个矩形左上角的坐标</li>
<li>w,h 是这个矩形的宽高</li>
</ul>
</li>
</ul>

<ul>
<li>
<ol>
<li><code>cvs.strokeRect(x,y,w,h);</code> —&gt; 带边框的矩形</li>
</ol>
<ul>
<li>x,y 是这个矩形左上角的坐标</li>
<li>w,h 是这个矩形的宽高
<ul>
<li>注意&lt;如果设置边框&gt; 边框一半在里面一半在外面</li>
</ul>
</li>
</ul>
</li>
<li>
<ol>
<li><code>cvs.clearRect(x,y,w,h);</code> —&gt; 清除填充图的某一部分，清除的还是一个矩形</li>
</ol>
<ul>
<li>x,y 是这个矩形左上角的坐标</li>
<li>w,h 是这个矩形的宽高</li>
</ul>
</li>
</ul>
<section><h5>案例<a href="#案例"><span>#</span></a></h5><p>案例1</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>  </span><span>function</span><span> </span><span>draw1</span><span>(){</span></div></div><div><div><div>2</div></div><div><span>    </span><span>//填充矩形</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillStyle</span><span>=</span><span>'#fccdda'</span><span>;</span><span>//画之前填充颜色</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillRect</span><span>(</span><span>10</span><span>,</span><span>20</span><span>,</span><span>100</span><span>,</span><span>50</span><span>);</span><span>//设置填充矩形,矩形的左上角坐标为10,20 宽100px 高50px</span></div></div><div><div><div>5</div></div><div><span>    </span><span>//边框矩形</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>strokeStyle</span><span>=</span><span>'red'</span><span>;</span><span>//设置边框的矩形边框颜色</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>lineWidth</span><span>=</span><span>20</span><span>;</span><span>//设置边框宽度20px</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>strokeRect</span><span>(</span><span>150</span><span>,</span><span>20</span><span>,</span><span>100</span><span>,</span><span>50</span><span>);</span><span>//设置边框矩形，  矩形的左上角坐标为150,20 宽100px 高50px</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span>  </span><span>draw1</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>案例2</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>draw2</span><span>(){</span><span>//清除填充图的某一部分，清除的还是一个矩形cvs.clearRect(x,y,w,h)</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>fillStyle</span><span>=</span><span>'orange'</span><span>;</span></div></div><div><div><div>3</div></div><div><span>  </span><span>//画之前填充颜色</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>fillRect</span><span>(</span><span>20</span><span>,</span><span>100</span><span>,</span><span>300</span><span>,</span><span>100</span><span>);</span></div></div><div><div><div>5</div></div><div><span>  </span><span>//设置填充矩形,矩形左上角坐标为20,100 宽300px 高100px</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>clearRect</span><span>(</span><span>140</span><span>,</span><span>140</span><span>,</span><span>60</span><span>,</span><span>60</span><span>);</span></div></div><div><div><div>7</div></div><div><span>  </span><span>//清除填充图的矩形 清除的这个矩形左上角坐标140,140 宽60px 高60px</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>clearRect</span><span>(</span><span>20</span><span>,</span><span>100</span><span>,</span><span>40</span><span>,</span><span>40</span><span>);</span></div></div><div><div><div>9</div></div><div><span>  </span><span>//清除填充图的矩形 清除的这个矩形左上角坐标20,100 宽40px 高40px</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>clearRect</span><span>(</span><span>280</span><span>,</span><span>100</span><span>,</span><span>40</span><span>,</span><span>40</span><span>);</span></div></div><div><div><div>11</div></div><div><span>  </span><span>//清除填充图的矩形 清除的这个矩形左上角坐标280,100 宽40px 高40px</span></div></div><div><div><div>12</div></div><div><span>}</span></div></div><div><div><div>13</div></div><div><span>draw2</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/Canvas%E4%B9%8B4%E6%B8%90%E5%8F%98/</id>
      <title type="text">Canvas之4渐变</title>
      <published>2017-06-09T00:00:00.000Z</published>
      <updated>2017-06-09T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/Canvas%E4%B9%8B4%E6%B8%90%E5%8F%98/"/>
      <summary type="text">Canvas之4渐变</summary>
      <content type="html"><![CDATA[<ul>
<li>1.线性渐变</li>
<li><code>var CLG=cvs.createLinearGradient(x0,y0,x1,y1);</code>
<ul>
<li>x0&lt;渐变开始的x坐标&gt;</li>
<li>y0&lt;渐变开始的y坐标&gt;</li>
<li>x1&lt;渐变结束的x坐标&gt;</li>
<li>y1&lt;渐变结束的y坐标&gt;</li>
</ul>
</li>
<li><code>CLG.addColorStop(n,m);</code>
<ul>
<li>n&lt;设置颜色的偏移量&gt;</li>
<li>m&lt;颜色&gt;</li>
</ul>
</li>
</ul>

<ul>
<li>例如:</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>draw1</span><span>(){</span></div></div><div><div><div>2</div></div><div><span>  </span><span>var</span><span> </span><span>CLG</span><span>=</span><span><span>cvs</span><span>.</span></span><span>createLinearGradient</span><span>(</span><span>0</span><span>,</span><span>0</span><span>,</span><span>200</span><span>,</span><span>200</span><span>);</span></div></div><div><div><div>3</div></div><div><span>  </span><span>//创建一个线性渐变 渐变开始的坐标0,0 渐变结束的坐标200,200 (即从左上角到右下角渐变)</span></div></div><div><div><div>4</div></div><div><span>  </span><span>CLG</span><span>.</span><span>addColorStop</span><span>(</span><span>0</span><span>,</span><span>'red'</span><span>);</span><span>//设置渐变的偏移量0% 颜色红色</span></div></div><div><div><div>5</div></div><div><span>  </span><span>CLG</span><span>.</span><span>addColorStop</span><span>(</span><span>0.25</span><span>,</span><span>'yellow'</span><span>);</span><span>//设置渐变的偏移量25% 颜色黄色</span></div></div><div><div><div>6</div></div><div><span>  </span><span>CLG</span><span>.</span><span>addColorStop</span><span>(</span><span>0.5</span><span>,</span><span>'skyblue'</span><span>);</span><span>//设置渐变的偏移量50% 颜色天空蓝</span></div></div><div><div><div>7</div></div><div><span>  </span><span>CLG</span><span>.</span><span>addColorStop</span><span>(</span><span>0.75</span><span>,</span><span>'orange'</span><span>);</span><span>//设置渐变的偏移量75% 颜色橘黄</span></div></div><div><div><div>8</div></div><div><span>  </span><span>CLG</span><span>.</span><span>addColorStop</span><span>(</span><span>1</span><span>,</span><span>'pink'</span><span>);</span><span>//设置渐变的偏移量100% 颜色粉色</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>fillStyle</span><span>=</span><span>CLG</span><span>;</span><span>//设置填充样式是线性渐变</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>fillRect</span><span>(</span><span>0</span><span>,</span><span>0</span><span>,</span><span>200</span><span>,</span><span>200</span><span>);</span><span>//设置填充矩形 左上角坐标0,0  宽200px  高200px</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>fill</span><span>();</span><span>//设置样式为填充样式</span></div></div><div><div><div>12</div></div><div><span>}</span></div></div><div><div><div>13</div></div><div><span>draw1</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>2.径向渐变(发散性渐变)</li>
<li><code>cvs.createRadialGradient(x0,y0,x1,y1,r1);</code>
<ul>
<li>x0&lt;发散渐变开始中心的x坐标&gt;</li>
<li>y0：发散渐变开始中心的y坐标</li>
<li>r0&lt;发散渐变开始的半径&gt;</li>
<li>x1&lt;发散渐变结束中心的x坐标&gt;</li>
<li>y1：发散渐变结束中心的y坐标</li>
<li>r1&lt;发散渐变结束的半径&gt;</li>
</ul>
</li>
<li>例如:</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>draw2</span><span>(){</span></div></div><div><div><div>2</div></div><div><span>  </span><span>var</span><span> </span><span>CRG</span><span>=</span><span><span>cvs</span><span>.</span></span><span>createRadialGradient</span><span>(</span><span>200</span><span>,</span><span>200</span><span>,</span><span>200</span><span>,</span><span>200</span><span>,</span><span>200</span><span>,</span><span>10</span><span>);</span></div></div><div><div><div>3</div></div><div><span>  </span><span>//创建一个径向/发散性渐变 渐变开始的坐标200,200 渐变开始的半径200px 渐变结束的坐标200,200 渐变结束的半径10px</span></div></div><div><div><div>4</div></div><div><span>  </span><span>CRG</span><span>.</span><span>addColorStop</span><span>(</span><span>0</span><span>,</span><span>'purple'</span><span>);</span></div></div><div><div><div>5</div></div><div><span>  </span><span>CRG</span><span>.</span><span>addColorStop</span><span>(</span><span>0.2</span><span>,</span><span>'yellow'</span><span>);</span></div></div><div><div><div>6</div></div><div><span>  </span><span>CRG</span><span>.</span><span>addColorStop</span><span>(</span><span>0.4</span><span>,</span><span>'pink'</span><span>);</span></div></div><div><div><div>7</div></div><div><span>  </span><span>CRG</span><span>.</span><span>addColorStop</span><span>(</span><span>0.6</span><span>,</span><span>'lightblue'</span><span>);</span></div></div><div><div><div>8</div></div><div><span>  </span><span>CRG</span><span>.</span><span>addColorStop</span><span>(</span><span>0.8</span><span>,</span><span>'skyblue'</span><span>);</span></div></div><div><div><div>9</div></div><div><span>  </span><span>CRG</span><span>.</span><span>addColorStop</span><span>(</span><span>1</span><span>,</span><span>'white'</span><span>);</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>fillStyle</span><span>=</span><span>CRG</span><span>;</span><span>//设置填充样式是径向渐变</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>fillRect</span><span>(</span><span>100</span><span>,</span><span>100</span><span>,</span><span>200</span><span>,</span><span>200</span><span>);</span></div></div><div><div><div>12</div></div><div><span>  </span><span>//设置填充矩形 左上角坐标100,100  宽200px  高200px</span></div></div><div><div><div>13</div></div><div><span>}</span></div></div><div><div><div>14</div></div><div><span>draw2</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure></div>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/Canvas%E4%B9%8B5%E7%BB%98%E5%88%B6%E6%96%87%E6%9C%AC/</id>
      <title type="text">Canvas之5绘制文本</title>
      <published>2017-06-09T00:00:00.000Z</published>
      <updated>2017-06-09T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/Canvas%E4%B9%8B5%E7%BB%98%E5%88%B6%E6%96%87%E6%9C%AC/"/>
      <summary type="text">Canvas之5绘制文本</summary>
      <content type="html"><![CDATA[<ul>
<li>1.阴影
<ul>
<li>cvs.shadowOffsetX//阴影的横向偏移量，默认值是0</li>
<li>cvs.shadowOffsetY//阴影的纵向偏移量，默认值是0</li>
<li>cvs.shadowColor//阴影的颜色</li>
<li>cvs.shadowBlur//阴影的模糊范围（值越大越模糊）</li>
</ul>
</li>
</ul>

<ul>
<li>案例</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>  </span><span>function</span><span> </span><span>draw1</span><span>(){</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>shadowColor</span><span>=</span><span>'#000fff'</span><span>;</span><span>//设置阴影颜色</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>shadowOffsetX</span><span>=</span><span>30</span><span>;</span><span>//设置阴影的横向偏移量30px</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>shadowOffsetY</span><span>=</span><span>20</span><span>;</span><span>//设置阴影的纵向偏移量20px</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>shadowBlur</span><span>=</span><span>20</span><span>;</span><span>//设置阴影的模糊范围20px</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillStyle</span><span>=</span><span>'#449fdb'</span><span>;</span><span>//设置填充的样式为颜色填充</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillRect</span><span>(</span><span>50</span><span>,</span><span>50</span><span>,</span><span>100</span><span>,</span><span>100</span><span>);</span><span>//设置填充矩形 左上角坐标50,50 宽100px 高100px</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span>  </span><span>draw1</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>2.绘制文本</p>
<ul>
<li>设置字体样式 cvs.font=‘字体大小font-size 字体样式font-family’</li>
<li>水平对齐方式 cvs.textAlign(start,end,right,center);</li>
<li>垂直对齐方式 cvs.textBaseline=”</li>
<li>属性值,middle,hangle,bottom,alphabetic,ideographic</li>
<li>计算文本长度
<ul>
<li>var text=‘dfbzbh’</li>
<li>console.log(cvs.measureText(text));//width&lt;40&gt;.453125</li>
</ul>
</li>
<li>填充文字
<ul>
<li>cvs.fillText(text,x,y,maxWidth);</li>
<li>
<ol>
<li>text&lt;文本内容&gt;</li>
</ol>
</li>
<li>
<ol>
<li>x&lt;文字起始点的横坐标&gt;</li>
</ol>
</li>
<li>
<ol>
<li>y&lt;文字起始点的纵坐标&gt;</li>
</ol>
</li>
</ul>
</li>
<li>绘制文字轮廓
<ul>
<li>cvs.strokeText(text,x,y,maxWidth);</li>
<li>
<ol>
<li>text&lt;文本内容&gt;</li>
</ol>
</li>
<li>
<ol>
<li>x&lt;文字起始点的横坐标&gt;</li>
</ol>
</li>
<li>
<ol>
<li>y&lt;文字起始点的纵坐标&gt;</li>
</ol>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p>案例1</p>
</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>draw1</span><span>(){</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>shadowColor</span><span>=</span><span>'#000fff'</span><span>;</span><span>//设置阴影颜色</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>shadowOffsetX</span><span>=</span><span>30</span><span>;</span><span>//设置阴影的横向偏移量30px</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>shadowOffsetY</span><span>=</span><span>20</span><span>;</span><span>//设置阴影的纵向偏移量20px</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>shadowBlur</span><span>=</span><span>20</span><span>;</span><span>//设置阴影的模糊范围20px</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillStyle</span><span>=</span><span>'#449fdb'</span><span>;</span><span>//设置填充的样式为颜色填充</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillRect</span><span>(</span><span>50</span><span>,</span><span>50</span><span>,</span><span>100</span><span>,</span><span>100</span><span>);</span></div></div><div><div><div>8</div></div><div><span>    </span><span>//设置填充矩形 左上角坐标50,50 宽100px 高100px</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span>  </span><span>draw1</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>案例2</li>
</ul>
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>  </span><span>function</span><span> </span><span>draw2</span><span>(){</span></div></div><div><div><div>2</div></div><div><span>    </span><span>var</span><span><span> </span><span>text</span></span><span>=</span><span>'hellow word'</span><span>;</span><span>//设置文本内容</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillStyle</span><span>=</span><span>'yellow'</span><span>;</span><span>//设置填充样式颜色</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>font</span><span>=</span><span>'40px verdana'</span><span>;</span><span>//设置字体样式</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>textAlign</span><span>=</span><span>'start'</span><span>;</span><span>//设置字体的水平对齐方式</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>textBaseline</span><span>=</span><span>'top'</span><span>;</span><span>//设置字体的垂直对齐方式</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillText</span><span><span>(</span><span>text</span><span>,</span></span><span>10</span><span>,</span><span>10</span><span>);</span></div></div><div><div><div>8</div></div><div><span>    </span><span>//设置填充文字 文本内容text 文本起始点坐标10,10</span></div></div><div><div><div>9</div></div><div><span>    </span><span>var</span><span><span> </span><span>length</span></span><span>=</span><span><span>cvs</span><span>.</span></span><span>measureText</span><span><span>(</span><span>text</span><span>);</span></span></div></div><div><div><div>10</div></div><div><span>    </span><span>//获取文本宽度(长度)length</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>dir</span><span><span>(</span><span>length</span><span>);</span></span></div></div><div><div><div>12</div></div><div><span>    </span><span>//TextMetrics--&gt;width:241.171875</span></div></div><div><div><div>13</div></div><div><span>    </span><span>//==&gt;length.width字体的宽度</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillText</span><span>(</span><span>"字体长度为"</span><span>+</span><span><span>length</span><span>.</span></span><span>width</span><span>,</span><span>10</span><span>,</span><span>60</span><span>);</span></div></div><div><div><div>15</div></div><div><span>    </span><span>//设置填充文字(通过字符串拼接方式) 文本起始点坐标10,60</span></div></div><div><div><div>16</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span>  </span><span>draw2</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>
<ul>
<li>案例3&lt;文本线性渐变&gt;</li>
</ul>
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>draw3</span><span>(){</span></div></div><div><div><div>2</div></div><div><span>    </span><span>var</span><span> </span><span>CLG</span><span>=</span><span><span>cvs</span><span>.</span></span><span>createLinearGradient</span><span>(</span><span>0</span><span>,</span><span>0</span><span>,</span><span>300</span><span>,</span><span>100</span><span>);</span></div></div><div><div><div>3</div></div><div><span>    </span><span>//创建一个线性渐变 渐变开始的坐标0,0 渐变结束的坐标300,100</span></div></div><div><div><div>4</div></div><div><span>    </span><span>CLG</span><span>.</span><span>addColorStop</span><span>(</span><span>0</span><span>,</span><span>'skyblue'</span><span>);</span><span>//设置渐变的偏移量0% 天空蓝</span></div></div><div><div><div>5</div></div><div><span>    </span><span>CLG</span><span>.</span><span>addColorStop</span><span>(</span><span>0.25</span><span>,</span><span>'plum'</span><span>);</span><span>//设置渐变的偏移量25% 紫色</span></div></div><div><div><div>6</div></div><div><span>    </span><span>CLG</span><span>.</span><span>addColorStop</span><span>(</span><span>0.5</span><span>,</span><span>'lightblue'</span><span>);</span><span>//设置渐变的偏移量50% 蓝</span></div></div><div><div><div>7</div></div><div><span>    </span><span>CLG</span><span>.</span><span>addColorStop</span><span>(</span><span>0.75</span><span>,</span><span>'skyblue'</span><span>);</span><span>//设置渐变的偏移量75% 天空蓝</span></div></div><div><div><div>8</div></div><div><span>    </span><span>CLG</span><span>.</span><span>addColorStop</span><span>(</span><span>1</span><span>,</span><span>'plum'</span><span>);</span><span>//设置渐变的偏移量100% 紫色</span></div></div><div><div><div>9</div></div><div><span>    </span><span>var</span><span><span> </span><span>text</span></span><span>=</span><span>'hellow word'</span><span>;</span><span>//设置文本内容</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillStyle</span><span>=</span><span>CLG</span><span>;</span><span>//设置填充样式是线性渐变</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>shadowOffsetX</span><span>=</span><span>5</span><span>;</span><span>//设置阴影的横向偏移量5px</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>shadowOffsetY</span><span>=</span><span>4</span><span>;</span><span>//设置阴影的纵向偏移量4px</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>shadowColor</span><span>=</span><span>'#ffb6c1'</span><span>;</span><span>//设置阴影的颜色</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>shadowBlur</span><span>=</span><span>5</span><span>;</span><span>//设置阴影的模糊度</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>font</span><span>=</span><span>'40px cursive'</span><span>;</span><span>//设置字体样式</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>textAlign</span><span>=</span><span>'top'</span><span>;</span><span>//设置字体的水平对齐方式</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillText</span><span><span>(</span><span>text</span><span>,</span></span><span>50</span><span>,</span><span>150</span><span>);</span></div></div><div><div><div>18</div></div><div><span>    </span><span>//设置填充文字text 文本起始点坐标50,150</span></div></div><div><div><div>19</div></div><div><span>    </span><span>var</span><span><span> </span><span>width</span></span><span>=</span><span><span>cvs</span><span>.</span></span><span>measureText</span><span><span>(</span><span>text</span><span>).</span></span><span>width</span><span>;</span><span>//获取文本宽度(长度)length</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillText</span><span>(</span><span>"字体长度为："</span><span>+</span><span><span>width</span><span>,</span></span><span>10</span><span>,</span><span>200</span><span>);</span></div></div><div><div><div>21</div></div><div><span>    </span><span>//设置填充文字(通过字符串拼接方式) 文本起始点坐标10,200</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>24</div></div><div><span>  </span><span>draw3</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>
<ul>
<li>案例4&lt;文本径向渐变&gt;</li>
</ul>
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>  </span><span>function</span><span> </span><span>draw4</span><span>(){</span></div></div><div><div><div>2</div></div><div><span>    </span><span>var</span><span> </span><span>CRG</span><span>=</span><span><span>cvs</span><span>.</span></span><span>createLinearGradient</span><span>(</span><span>0</span><span>,</span><span>0</span><span>,</span><span>600</span><span>,</span><span>0</span><span>,</span><span>0</span><span>,</span><span>20</span><span>);</span></div></div><div><div><div>3</div></div><div><span>    </span><span>//创建一个径向渐变 渐变开始的坐标0,0 开始渐变的半径600px 渐变结束的坐标0,0 渐变结束的半径20px</span></div></div><div><div><div>4</div></div><div><span>    </span><span>CRG</span><span>.</span><span>addColorStop</span><span>(</span><span>0</span><span>,</span><span>'pink'</span><span>);</span></div></div><div><div><div>5</div></div><div><span>    </span><span>CRG</span><span>.</span><span>addColorStop</span><span>(</span><span>0.25</span><span>,</span><span>'skyblue'</span><span>);</span></div></div><div><div><div>6</div></div><div><span>    </span><span>CRG</span><span>.</span><span>addColorStop</span><span>(</span><span>0.5</span><span>,</span><span>'yellow'</span><span>);</span></div></div><div><div><div>7</div></div><div><span>    </span><span>CRG</span><span>.</span><span>addColorStop</span><span>(</span><span>0.75</span><span>,</span><span>'plum'</span><span>);</span></div></div><div><div><div>8</div></div><div><span>    </span><span>CRG</span><span>.</span><span>addColorStop</span><span>(</span><span>1</span><span>,</span><span>'skyblue'</span><span>);</span></div></div><div><div><div>9</div></div><div><span>     </span><span>var</span><span><span> </span><span>text</span></span><span>=</span><span>'I WANT EAT'</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>     </span></span><span>cvs</span><span>.</span><span>fillStyle</span><span>=</span><span>CRG</span><span>;</span><span>//设置填充样式是径向渐变</span></div></div><div><div><div>11</div></div><div><span><span>     </span></span><span>cvs</span><span>.</span><span>font</span><span>=</span><span>'80px simsun'</span><span>;</span><span>//设置字体样式</span></div></div><div><div><div>12</div></div><div><span><span>       </span></span><span>cvs</span><span>.</span><span>textAlign</span><span>=</span><span>'start'</span><span>;</span><span>//设置文本横向对齐方式</span></div></div><div><div><div>13</div></div><div><span><span>     </span></span><span>cvs</span><span>.</span><span>textBaseline</span><span>=</span><span>'top'</span><span>;</span><span>//设置文本纵向对齐方式</span></div></div><div><div><div>14</div></div><div><span><span>     </span></span><span>cvs</span><span>.</span><span>shadowColor</span><span>=</span><span>'lightblue'</span><span>;</span><span>//设置阴影颜色</span></div></div><div><div><div>15</div></div><div><span><span>     </span></span><span>cvs</span><span>.</span><span>shadowBlur</span><span>=</span><span>10</span><span>;</span><span>//设置阴影的模糊范围10px</span></div></div><div><div><div>16</div></div><div><span><span>     </span></span><span>cvs</span><span>.</span><span>fillText</span><span><span>(</span><span>text</span><span>,</span></span><span>10</span><span>,</span><span>10</span><span>);</span><span>//设置填充文字text 文本起始点坐标10,10</span></div></div><div><div><div>17</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>  </span><span>draw4</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/Canvas%E4%B9%8B6%E7%BB%98%E5%88%B6%E5%9B%BE%E7%89%87/</id>
      <title type="text">Canvas之6绘制图片</title>
      <published>2017-06-09T00:00:00.000Z</published>
      <updated>2017-06-09T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/Canvas%E4%B9%8B6%E7%BB%98%E5%88%B6%E5%9B%BE%E7%89%87/"/>
      <summary type="text">Canvas之6绘制图片</summary>
      <content type="html"><![CDATA[<section><h5>绘图<a href="#绘图"><span>#</span></a></h5><ul>
<li>
<ol>
<li><code>cvs.drawImage(Image,x,y,w,h);</code></li>
</ol>
<ul>
<li>Image 就是可以放在DOM中的真实图片，可以动态创建，也可以获取页面上的</li>
<li>x,y 图片放入画布,在画布左上角的坐标</li>
<li>w,h 绘制图片的宽高</li>
</ul>
</li>
</ul><ul>
<li>案例&lt;将图片放在画布上&gt;</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>  </span><span>function</span><span> </span><span>draw1</span><span>(){</span></div></div><div><div><div>2</div></div><div><span>    </span><span>var</span><span><span> </span><span>img</span></span><span>=</span><span>new</span><span><span> </span><span>Image</span><span>;</span></span><span>//动态创建一个img</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>img</span><span>.</span><span>src</span><span>=</span><span>'default.gif'</span><span>;</span><span>//添加图片链接</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>img</span><span>.</span><span>onload</span><span>=</span><span>function</span><span>(){</span><span>//如果图片地址真实存在 执行这个函数</span></div></div><div><div><div>5</div></div><div><span><span>      </span></span><span>cvs</span><span>.</span><span>drawImage</span><span>(</span><span>this</span><span>,</span><span>0</span><span>,</span><span>100</span><span>,</span><span>100</span><span>,</span><span>90</span><span>);</span></div></div><div><div><div>6</div></div><div><span>      </span><span>//将图片放在画布上 图片左上角的坐标0,100 图片宽100px 高90px</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span>  </span><span>draw1</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<ol>
<li><code>cvs.drawImage(img_elem,sx,sy,sw,sh,dx,dy,dw,dh);</code></li>
</ol>
<ul>
<li>
<p>sx,sy 图片左上角的坐标</p>
</li>
<li>
<p>sw,sh  矩形区域的宽高 用来截取图片</p>
</li>
<li>
<p>dx,dy  截取出来放在画布canvas上的坐标</p>
</li>
<li>
<p>dw,dh  画在canvas上的宽高</p>
</li>
<li>
<p>总结:</p>
<ul>
<li>sw,sy,sx,sy 是用来截取图片的过程</li>
<li>dx,dy,dw,dh 把截取出来的图片放在canvas上的过程</li>
</ul>
</li>
</ul>
</li>
<li>
<p>案例&lt;截取图片&gt;</p>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>  </span><span>function</span><span> </span><span>draw2</span><span>(){</span></div></div><div><div><div>2</div></div><div><span>    </span><span>var</span><span><span> </span><span>img</span></span><span>=</span><span>new</span><span><span> </span><span>Image</span><span>;</span></span><span>//动态创建一个img</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>img</span><span>.</span><span>src</span><span>=</span><span>'1.jpg'</span><span>;</span><span>//添加图片链接</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>img</span><span>.</span><span>onload</span><span>=</span><span>function</span><span>(){</span><span>//如果图片地址真实存在 执行这个函数</span></div></div><div><div><div>5</div></div><div><span><span>      </span></span><span>cvs</span><span>.</span><span>drawImage</span><span>(</span><span>this</span><span>,</span><span>480</span><span>,</span><span>150</span><span>,</span><span>440</span><span>,</span><span>410</span><span>,</span><span>0</span><span>,</span><span>0</span><span>,</span><span>200</span><span>,</span><span>200</span><span>);</span></div></div><div><div><div>6</div></div><div><span>      </span><span>//this就是img 将图片放在画布上 需要截取的图片在原图片左上角的坐标480,150  截取图片的大小为440px*410px 截取出来的图片放入画布的坐标0,0 截取出来的图片画在画布canvas的宽200px 高200px</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span>//  draw2();</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<ol>
<li>设置平铺</li>
</ol>
</li>
<li>
<p>cvs.creatPattern(image,type)</p>
<ul>
<li>Image 就是可以放在DOM中的真实图片，可以动态创建，也可以获取页面上的</li>
<li>type:
<ul>
<li>no-repeat 不平铺</li>
<li>repeat 全方向平铺</li>
<li>repeat-x x轴方向平铺</li>
<li>repeat-y y轴方向平铺</li>
</ul>
</li>
</ul>
</li>
<li>
<p>案例</p>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>draw3</span><span>(){</span></div></div><div><div><div>2</div></div><div><span>  </span><span>var</span><span><span> </span><span>img</span></span><span>=</span><span>new</span><span><span> </span><span>Image</span><span>;</span></span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>img</span><span>.</span><span>src</span><span>=</span><span>'default.gif'</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>img</span><span>.</span><span>onload</span><span>=</span><span>function</span><span>(){</span></div></div><div><div><div>5</div></div><div><span>    </span><span>var</span><span><span> </span><span>rep</span></span><span>=</span><span><span>cvs</span><span>.</span></span><span>createPattern</span><span>(</span><span>this</span><span>,</span><span>'repeat'</span><span>);</span><span>//设置图片平铺</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillStyle</span><span>=</span><span><span>rep</span><span>;</span></span><span>//设置填充样式为图片平铺</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillRect</span><span>(</span><span>0</span><span>,</span><span>0</span><span><span>,</span><span>draw</span><span>.</span></span><span>width</span><span><span>,</span><span>draw</span><span>.</span></span><span>height</span><span>);</span></div></div><div><div><div>8</div></div><div><span>    </span><span>//draw.width画布的宽 draw.height画布的高</span></div></div><div><div><div>9</div></div><div><span>    </span><span>//设置填充矩形 矩形左上角坐标0,0 矩形的宽为画布的宽 矩形的高为画布的高</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>11</div></div><div><span>}</span></div></div><div><div><div>12</div></div><div><span>//draw3();</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/Canvas%E4%B9%8B7%E5%8F%98%E5%BD%A2/</id>
      <title type="text">Canvas之7变形</title>
      <published>2017-06-09T00:00:00.000Z</published>
      <updated>2017-06-09T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/Canvas%E4%B9%8B7%E5%8F%98%E5%BD%A2/"/>
      <summary type="text">Canvas之7变形</summary>
      <content type="html"><![CDATA[<ul>
<li>
<ol>
<li>平移translate(x,y);
x&lt;坐标原点向x轴平移的距离&gt;
y&lt;坐标原点向y轴平移的距离&gt;</li>
</ol>
</li>
</ul>

<ul>
<li>案例</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>  </span><span>function</span><span> </span><span>draw1</span><span>(){</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillStyle</span><span>=</span><span>'skyblue'</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>//设置填充颜色天空蓝</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillRect</span><span>(</span><span>0</span><span>,</span><span>0</span><span>,</span><span>200</span><span>,</span><span>100</span><span>);</span></div></div><div><div><div>5</div></div><div><span>    </span><span>//矩形左上角坐标0,0 宽200px 高100px</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>translate</span><span>(</span><span>50</span><span>,</span><span>50</span><span>);</span></div></div><div><div><div>7</div></div><div><span>    </span><span>//设置平移 坐标原点向x轴(向右)平移50px 坐标原点向y轴(向下)偏移50px</span></div></div><div><div><div>8</div></div><div><span>    </span><span>//--&gt;这个平移只会对后面的矩形造成影响 不会影响前面的</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillStyle</span><span>=</span><span>'pink'</span><span>;</span></div></div><div><div><div>10</div></div><div><span>    </span><span>//设置填充颜色粉色</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillRect</span><span>(</span><span>0</span><span>,</span><span>0</span><span>,</span><span>180</span><span>,</span><span>80</span><span>);</span></div></div><div><div><div>12</div></div><div><span>    </span><span>//矩形左上角坐标0,0 宽180px 高80px</span></div></div><div><div><div>13</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span>  </span><span>draw1</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<ol>
<li>缩放 vas.scale(x0,y0);
x0
y0</li>
</ol>
</li>
<li>
<p>案例</p>
</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>  </span><span>function</span><span> </span><span>draw2</span><span>(){</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>scale</span><span>(</span><span>1</span><span>,</span><span>2</span><span>);</span><span>//设置缩放 x轴不变 y轴是之前的2倍</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillStyle</span><span>=</span><span>'plum'</span><span>;</span><span>//设置填充样式为颜色填充</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillRect</span><span>(</span><span>0</span><span>,</span><span>0</span><span>,</span><span>200</span><span>,</span><span>100</span><span>);</span></div></div><div><div><div>5</div></div><div><span>    </span><span>//矩形左上角坐标0,0 宽200px 高100px</span></div></div><div><div><div>6</div></div><div><span>    </span><span>//--&gt;那么转化后的矩形宽200px 高200px</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>8</div></div><div><span>  </span><span>draw2</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>3.旋转 vas.rotate(angle);
angle&lt;坐标轴转的角度&gt; 他是一个弧度(和画圆的计算是一样的)</p>
</li>
<li>
<p>案例</p>
</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>  </span><span>function</span><span> </span><span>draw3</span><span>(){</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>rotate</span><span><span>(</span><span>Math</span><span>.</span></span><span>PI</span><span>/</span><span>4</span><span>);</span><span>//设置旋转  旋转角度为45度</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillStyle</span><span>=</span><span>'lightblue'</span><span>;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillRect</span><span>(</span><span>100</span><span>,</span><span>100</span><span>,</span><span>200</span><span>,</span><span>100</span><span>);</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>  </span><span>draw3</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<blockquote><p>注意：平移、缩放、旋转都是对原始坐标（画布）操作的</p></blockquote>
<ul>
<li>例如:</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>draw3</span><span>(){</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>translate</span><span>(</span><span>200</span><span>,</span><span>0</span><span>);</span><span>//此时的原点已经变到200,0的位置</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>rotate</span><span><span>(</span><span>Math</span><span>.</span></span><span>PI</span><span>/</span><span>4</span><span>);</span><span>//设置旋转  旋转角度为45度</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>fillStyle</span><span>=</span><span>'lightblue'</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>fillRect</span><span>(</span><span>100</span><span>,</span><span>100</span><span>,</span><span>200</span><span>,</span><span>100</span><span>);</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div><span>draw3</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure></div>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/Canvas%E4%B9%8B8%E5%9B%BE%E5%BD%A2%E7%BB%84%E5%90%88/</id>
      <title type="text">Canvas之8图形组合</title>
      <published>2017-06-09T00:00:00.000Z</published>
      <updated>2017-06-09T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/Canvas%E4%B9%8B8%E5%9B%BE%E5%BD%A2%E7%BB%84%E5%90%88/"/>
      <summary type="text">Canvas之8图形组合</summary>
      <content type="html"><![CDATA[<section><h4>图形组合<a href="#图形组合"><span>#</span></a></h4><ul>
<li><code>cvs.globalCompositeOperation=type;</code></li>
<li>type的值:
<ul>
<li>1.source-over 默认值 覆盖 在原来的图形上绘制新图 新图在上</li>
<li>2.source-out 显示新图的非交集部分</li>
<li>3.source-in 显示新图和图形的交集，颜色是新图的颜色</li>
<li>4.source-atop 显示旧图和交集部分 交集是新图颜色</li>
<li>5.destination-over  在原来图形的下面绘制新图 旧图在上</li>
<li>6.destination-out 显示旧图的非交集部分</li>
<li>7.destination-in 显示交集 颜色是旧图颜色</li>
<li>8.destination-atop 显示新图和交集部分 交集是旧图颜色</li>
<li>9.lighter&lt;全部显示&gt; 交集部分是叠加颜色</li>
<li>10.xor&lt;显示新旧图的非交集部分&gt;</li>
<li>11.copy 只显示新图</li>
</ul>
</li>
</ul><ul>
<li>案例1&lt;在原来的图形上绘制新图&gt; 新图在上</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>draw</span></span><span>=</span><span><span>document</span><span>.</span></span><span>getElementById</span><span>(</span><span>'draw'</span><span>);</span></div></div><div><div><div>2</div></div><div><span>var</span><span><span> </span><span>cvs</span></span><span>=</span><span><span>draw</span><span>.</span></span><span>getContext</span><span>(</span><span>'2d'</span><span>);</span></div></div><div><div><div>3</div></div><div><span>function</span><span> </span><span>draw1</span><span>(){</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillStyle</span><span>=</span><span>'gold'</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillRect</span><span>(</span><span>10</span><span>,</span><span>10</span><span>,</span><span>100</span><span>,</span><span>100</span><span>);</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>globalCompositeOperation</span><span>=</span><span>'source-over'</span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillStyle</span><span>=</span><span>'pink'</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>fillRect</span><span>(</span><span>50</span><span>,</span><span>50</span><span>,</span><span>100</span><span>,</span><span>100</span><span>);</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div><div><div><div>10</div></div><div><span>draw1</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/Canvas%E5%8A%A8%E6%80%81%E6%A1%88%E4%BE%8B/</id>
      <title type="text">Canvas动态案例</title>
      <published>2017-06-09T00:00:00.000Z</published>
      <updated>2017-06-09T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/Canvas%E5%8A%A8%E6%80%81%E6%A1%88%E4%BE%8B/"/>
      <summary type="text">Canvas动态案例</summary>
      <content type="html"><![CDATA[<p>Canvas动态案例</p>

<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;!</span><span>DOCTYPE</span><span> </span><span>html</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>html</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>&lt;</span><span>head</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>&lt;</span><span>meta</span><span> </span><span>charset</span><span>=</span><span>"UTF-8"</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>&lt;</span><span>title</span><span>&gt;&lt;/</span><span>title</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>&lt;/</span><span>head</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>&lt;</span><span>body</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>&lt;</span><span>canvas</span><span> </span><span>id</span><span>=</span><span>"draw"</span><span> </span><span>width</span><span>=</span><span>"220"</span><span> </span><span>height</span><span>=</span><span>"320"</span><span> </span><span>style</span><span>=</span><span>"</span><span>background-color: skyblue</span><span>"</span><span>&gt;&lt;/</span><span>canvas</span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>&lt;/</span><span>body</span><span>&gt;</span></div></div><div><div><div>10</div></div><div><span>&lt;/</span><span>html</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span>&lt;</span><span>script</span><span> </span><span>type</span><span>=</span><span>"text/javascript"</span><span>&gt;</span></div></div><div><div><div>12</div></div><div><span>  </span><span>var</span><span><span> </span><span>draw</span></span><span>=</span><span><span>document</span><span>.</span></span><span>getElementById</span><span>(</span><span>'draw'</span><span>);</span></div></div><div><div><div>13</div></div><div><span>  </span><span>var</span><span><span> </span><span>cvs</span></span><span>=</span><span><span>draw</span><span>.</span></span><span>getContext</span><span>(</span><span>'2d'</span><span>);</span></div></div><div><div><div>14</div></div><div><span>  </span><span>var</span><span><span> </span><span>img</span></span><span>=</span><span>new</span><span><span> </span><span>Image</span><span>;</span></span></div></div><div><div><div>15</div></div><div><span><span>  </span></span><span>img</span><span>.</span><span>src</span><span>=</span><span>'walkingdead.png'</span><span>;</span><span>//添加图片地址</span></div></div><div><div><div>16</div></div><div><span><span>  </span></span><span>img</span><span>.</span><span>onload</span><span>=</span><span>function</span><span>(){</span><span>//图片上有10张小图横着排列</span></div></div><div><div><div>17</div></div><div><span>    </span><span>var</span><span><span> </span><span>width</span></span><span>=</span><span>this</span><span>.</span><span>width</span><span>/</span><span>10</span><span>;</span></div></div><div><div><div>18</div></div><div><span>    </span><span>var</span><span><span> </span><span>height</span></span><span>=</span><span>this</span><span>.</span><span>height</span><span>;</span></div></div><div><div><div>19</div></div><div><span>    </span><span>var</span><span><span> </span><span>i</span></span><span>=</span><span>0</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>window</span><span>.</span><span>setInterval</span><span>(</span><span>function</span><span>(){</span></div></div><div><div><div>21</div></div><div><span><span>      </span></span><span>cvs</span><span>.</span><span>clearRect</span><span>(</span><span>0</span><span>,</span><span>0</span><span><span>,</span><span>draw</span><span>.</span></span><span>width</span><span><span>,</span><span>draw</span><span>.</span></span><span>height</span><span>);</span><span>//清除上一个图片</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>drawImage</span><span><span>(</span><span>img</span><span>,</span><span>i</span></span><span>*</span><span><span>width</span><span>,</span></span><span>0</span><span><span>,</span><span>width</span><span>,</span><span>height</span><span>,</span></span><span>0</span><span>,</span><span>0</span><span><span>,</span><span>width</span><span>,</span><span>height</span><span>);</span></span></div></div><div><div><div>23</div></div><div><span>    </span><span>if</span><span><span>(</span><span>i</span></span><span>==</span><span>9</span><span>){</span></div></div><div><div><div>24</div></div><div><span><span>      </span></span><span>i</span><span>=</span><span>0</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span><span>else</span><span><span>{</span><span>i</span></span><span>++</span><span>;}</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>},</span><span>200</span><span>);</span></div></div><div><div><div>27</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>&lt;/</span><span>script</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%8F%8A%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/</id>
      <title type="text">服务器及相关知识</title>
      <published>2017-06-09T00:00:00.000Z</published>
      <updated>2017-06-09T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%8F%8A%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/"/>
      <summary type="text">服务器及相关知识</summary>
      <content type="html"><![CDATA[<section><h3>服务器<a href="#服务器"><span>#</span></a></h3><p>是具有储存功能的计算机设备（笔记本电脑本身就是一个服务器）</p><section><h4>服务器根据功能分类<a href="#服务器根据功能分类"><span>#</span></a></h4><ul>
<li>web服务器：供用户访问的 安全系数相对较低</li>
<li>数据库服务器：放在内网的服务器，用来安装数据库</li>
<li>应用服务器：放在内网的服务器，用来安装应用（产品）</li>
</ul></section><section><h4>操作系统有关<a href="#操作系统有关"><span>#</span></a></h4><ul>
<li>可视操作：可以直观看到所有文件，可以直接操作这些文件（<code>window</code>）</li>
<li>不可视操作：不能直观看到所有文件，需要<code>ssh</code>，<code>ftp</code>这样的工具进行连接（或者是敲命令进行）</li>
</ul></section><section><h4>大型机与嵌入式系统使用很多样化的操作系统<a href="#大型机与嵌入式系统使用很多样化的操作系统"><span>#</span></a></h4><ul>
<li>在服务器方面<code>Linux</code>、<code>UNIX</code>和<code>WindowsServer</code>占据了市场的大部分份额。在超级计算机方面，<code>Linux</code>取代<code>Unix</code>成为了第一大操作系统，截止2012年6月，世界超级计算机500强排名中基于<code>Linux</code>的超级计算机占据了462个席位，比率高达92%。随着智能手机的发展，<code>Android</code>和<code>iOS</code>已经成为目前最流行的两大手机操作系统。</li>
</ul></section><section><h4>内外网<a href="#内外网"><span>#</span></a></h4><ul>
<li>内网：数据库 ，产品应用——可供用户观看的页面</li>
<li>外网：web服务器，web服务器（多个相同的web服务器，负载均衡）——可供用户访问的</li>
<li>vpn(翻墙软件)负载均衡：内外网的连接工具</li>
</ul></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/Canvas%E4%B9%8B1%E7%BB%98%E5%88%B6%E7%BA%BF%E6%9D%A1%E7%9A%84%E6%9C%89%E5%85%B3%E5%B1%9E%E6%80%A7%E5%92%8C%E6%AD%A5%E9%AA%A4/</id>
      <title type="text">Canvas之1绘制线条的有关属性和步骤</title>
      <published>2017-06-08T00:00:00.000Z</published>
      <updated>2017-06-08T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/Canvas%E4%B9%8B1%E7%BB%98%E5%88%B6%E7%BA%BF%E6%9D%A1%E7%9A%84%E6%9C%89%E5%85%B3%E5%B1%9E%E6%80%A7%E5%92%8C%E6%AD%A5%E9%AA%A4/"/>
      <summary type="text">Canvas之1绘制线条的有关属性和步骤</summary>
      <content type="html"><![CDATA[<p><code>&lt;canvas id="" width="" height=""&gt;&lt;/canvas&gt;</code>
canvas  在页面上绘制图形用的（通常称他画布）
canvas只是一个容器，我们用js脚本来控制他
<code>&lt;canvas id="draw" width="600" height="500" style="border: 1px solid #ccc;"&gt;&lt;/canvas&gt;</code></p>

<section><h3>绘制线条的有关属性和步骤<a href="#绘制线条的有关属性和步骤"><span>#</span></a></h3><blockquote><p>1.相关属性</p></blockquote><ul>
<li>
<p>1.填充的样式</p>
<ul>
<li><code>cvs.fillStyle --&gt; </code>fillStyle`填充样式</li>
<li><code>cvs.strokeStyle --&gt; </code>strokeStyle<code>笔触样式 主要用来画边框的</code></li>
<li><code>cvs.lineWidth --&gt; 边框的宽度</code></li>
</ul>
</li>
<li>
<p>2.绘制图形有两种方式</p>
<ul>
<li><code>cvs.fill(); --&gt; 填充样式</code></li>
<li><code>cvs.stroke(); --&gt; 边框样式</code></li>
</ul>
</li>
<li>
<p>3.颜色值的四种书写方式</p>
<ul>
<li>1).颜色名      —&gt;“red”</li>
<li>2).十六进制    —&gt;“#fff”</li>
<li>3).三色值      —&gt;rgb(0,0,0)</li>
<li>4).四色值      —&gt;rgba(0,0,0,0.3)</li>
</ul>
</li>
<li>
<p>4.坐标:</p>
<ul>
<li>1.)以画布为基准,距离画布的上边是y坐标值(top值),距离画布的左边是x坐标值(left值);</li>
<li>cvs.moveTo(x,y);  —&gt; 起始点坐标</li>
<li>cvs.lineTo(x,y);  —&gt; 结束点的坐标</li>
<li>如果没有moveTo就把上一个挨着的lineTo作为起始坐标</li>
<li>例如&lt;假如第一个不是moveto而是lineto&gt;,那么lineTo就是其实坐标</li>
</ul>
</li>
<li>
<p>5.开始和关闭一个路径</p>
<ul>
<li>cvs.beginPath(); —&gt; 开始一个新的路径</li>
<li>cvs.closePath(); —&gt; 关闭当前路径</li>
<li>注意&lt;加上&gt;.closePath会自动闭合 会自动连接起始坐标和结束坐标</li>
</ul>
</li>
<li>
<p>6.canvas中的圆角</p>
<ul>
<li>1).设置线条交汇处的样式</li>
<li>cvs.lineJoin 他有三个属性：
<ul>
<li>1).尖角miter</li>
<li>2).斜角bevel</li>
<li>3).圆角round</li>
</ul>
</li>
<li>2).设置一条线段两端点的样式</li>
<li>lineCap焦点样式
<ul>
<li>1)平的butt(默认值)</li>
<li>2.)圆角round</li>
<li>3.)方角square</li>
</ul>
</li>
</ul>
</li>
</ul><blockquote><p>2.步骤及案例</p></blockquote><ul>
<li>
<p>步骤1.获取出canvas标签,例如:
<code>var draw=document.getElementById('draw');</code></p>
</li>
<li>
<p>步骤2.设置绘制环境—2d 平面图,例如:</p>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>cvs</span></span><span>=</span><span><span>draw</span><span>.</span></span><span>getContext</span><span>(</span><span>'2d'</span><span>);</span></div></div><div><div><div>2</div></div><div><span>//cvs 这个就是你的画板 接下来就可以在cvs上进行绘制</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>步骤3</li>
<li>案例1&lt;线段&gt;</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>  </span><span>function</span><span> </span><span>draw1</span><span>(){</span></div></div><div><div><div>2</div></div><div><span>  </span><span>var</span><span><span> </span><span>draw</span></span><span>=</span><span><span>document</span><span>.</span></span><span>getElementById</span><span>(</span><span>'draw'</span><span>);</span></div></div><div><div><div>3</div></div><div><span>  </span><span>var</span><span><span> </span><span>cvs</span></span><span>=</span><span><span>draw</span><span>.</span></span><span>getContext</span><span>(</span><span>'2d'</span><span>);</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>beginPath</span><span>();</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>moveTo</span><span>(</span><span>50</span><span>,</span><span>50</span><span>);</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>lineTo</span><span>(</span><span>150</span><span>,</span><span>50</span><span>);</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>closePath</span><span>();</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>strokeStyle</span><span>=</span><span>'#800080'</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>lineWidth</span><span>=</span><span>5</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>stroke</span><span>();</span><span>//以边框的形式显示</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>12</div></div><div><span>  </span><span>draw1</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>案例2&lt;等腰直角三角形&gt;</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>draw2</span><span>(){</span></div></div><div><div><div>2</div></div><div><span>  </span><span>var</span><span><span> </span><span>draw</span></span><span>=</span><span><span>document</span><span>.</span></span><span>getElementById</span><span>(</span><span>'draw'</span><span>);</span></div></div><div><div><div>3</div></div><div><span>  </span><span>var</span><span><span> </span><span>cvs</span></span><span>=</span><span><span>draw</span><span>.</span></span><span>getContext</span><span>(</span><span>'2d'</span><span>);</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>beginPath</span><span>();</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>lineTo</span><span>(</span><span>80</span><span>,</span><span>120</span><span>);</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>lineTo</span><span>(</span><span>80</span><span>,</span><span>240</span><span>);</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>lineTo</span><span>(</span><span>200</span><span>,</span><span>240</span><span>);</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>closePath</span><span>();</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>strokeStyle</span><span>=</span><span>'ec568c'</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>lineWidth</span><span>=</span><span>10</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>stroke</span><span>();</span></div></div><div><div><div>12</div></div><div><span>}</span></div></div><div><div><div>13</div></div><div><span>draw2</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>案例3&lt;圆角矩形&gt;</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>draw3</span><span>(){</span></div></div><div><div><div>2</div></div><div><span>  </span><span>var</span><span><span> </span><span>draw</span></span><span>=</span><span><span>document</span><span>.</span></span><span>getElementById</span><span>(</span><span>'draw'</span><span>);</span></div></div><div><div><div>3</div></div><div><span>  </span><span>var</span><span><span> </span><span>cvs</span></span><span>=</span><span><span>draw</span><span>.</span></span><span>getContext</span><span>(</span><span>'2d'</span><span>);</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>beginPath</span><span>();</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>lineCap</span><span>=</span><span>'round'</span><span>;</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>lineTo</span><span>(</span><span>50</span><span>,</span><span>50</span><span>);</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>lineTo</span><span>(</span><span>250</span><span>,</span><span>50</span><span>);</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>closePath</span><span>();</span><span>//关闭就没有圆角效果</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>lineWidth</span><span>=</span><span>100</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>strokeStyle</span><span>=</span><span>'#896446'</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>stroke</span><span>();</span></div></div><div><div><div>12</div></div><div><span>}</span></div></div><div><div><div>13</div></div><div><span>draw3</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>案例4&lt;圆角三角形&gt;</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>draw4</span><span>(){</span></div></div><div><div><div>2</div></div><div><span>  </span><span>var</span><span><span> </span><span>draw</span></span><span>=</span><span><span>document</span><span>.</span></span><span>getElementById</span><span>(</span><span>'draw'</span><span>);</span></div></div><div><div><div>3</div></div><div><span>  </span><span>var</span><span><span> </span><span>cvs</span></span><span>=</span><span><span>draw</span><span>.</span></span><span>getContext</span><span>(</span><span>'2d'</span><span>);</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>beginPath</span><span>();</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>lineJoin</span><span>=</span><span>'round'</span><span>;</span><span>//设置圆角</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>moveTo</span><span>(</span><span>200</span><span>,</span><span>100</span><span>);</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>lineTo</span><span>(</span><span>100</span><span>,</span><span>250</span><span>);</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>lineTo</span><span>(</span><span>300</span><span>,</span><span>250</span><span>);</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>closePath</span><span>();</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>lineWidth</span><span>=</span><span>50</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>strokeStyle</span><span>=</span><span>'#896446'</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>stroke</span><span>();</span></div></div><div><div><div>13</div></div><div><span>}</span></div></div><div><div><div>14</div></div><div><span>draw4</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/Canvas%E4%B9%8B2%E7%94%BB%E5%9C%86/</id>
      <title type="text">Canvas之2画圆</title>
      <published>2017-06-08T00:00:00.000Z</published>
      <updated>2017-06-08T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/Canvas%E4%B9%8B2%E7%94%BB%E5%9C%86/"/>
      <summary type="text">Canvas之2画圆</summary>
      <content type="html"><![CDATA[<ul>
<li>
<ol>
<li>cvs.arc(x,y,radius,startAngle,endAngle,anticlokwise);</li>
</ol>
<ul>
<li>x,y 圆心坐标</li>
<li>radius半径r</li>
<li>startAngle 起始角 以弧度计算(钟表的3点钟方向是0度,也就是x轴的正方向是0度,默认是顺时针)</li>
<li>endAngle  结束角</li>
<li>anticlokwise 是否逆时针 默认值false false表示顺时针</li>
</ul>
</li>
</ul>

<ul>
<li>
<ol>
<li>案例</li>
</ol>
</li>
</ul>
<p>案例1&lt;边框半圆&gt;</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>  </span><span>function</span><span> </span><span>draw1</span><span>(){</span><span>//边框圆</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>strokeStyle</span><span>=</span><span>'#ffa50'</span><span>;</span><span>//设置笔触样式(边框样式)颜色</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>beginPath</span><span>();</span><span>//开始一个路径</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>arc</span><span>(</span><span>500</span><span>,</span><span>500</span><span>,</span><span>100</span><span>,</span><span>0</span><span><span>,</span><span>Math</span><span>.</span></span><span>PI</span><span>);</span><span>//圆心坐标是500,500，半径是100px，起始角为0度，结束角为180度</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>closePath</span><span>();</span><span>//结束路径</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>lineWidth</span><span>=</span><span>10</span><span>;</span><span>//边框宽度为10px</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>cvs</span><span>.</span><span>stroke</span><span>();</span><span>//绘制图形以边框样式绘制</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span>  </span><span>draw1</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<p>案例2&lt;同心圆&gt;</p>
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>draw2</span><span>(){</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>fillStyle</span><span>=</span><span>'orange'</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>beginPath</span><span>();</span></div></div><div><div><div>4</div></div><div><span>  </span><span>//开始一个新的路径</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>arc</span><span>(</span><span>200</span><span>,</span><span>200</span><span>,</span><span>60</span><span><span>,</span><span>Math</span><span>.</span></span><span>PI</span><span>/</span><span>2</span><span>,</span><span>2</span><span>*</span><span><span>Math</span><span>.</span></span><span>PI</span><span>);</span></div></div><div><div><div>6</div></div><div><span>  </span><span>//圆心坐标是(200,200),半径为60px,起始角为90度,结束角为360度</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>closePath</span><span>();</span></div></div><div><div><div>8</div></div><div><span>  </span><span>//结束一个路径</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>fill</span><span>();</span></div></div><div><div><div>10</div></div><div><span>  </span><span>//绘制图形以填充样式绘制</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>strokeStyle</span><span>=</span><span>'yellow'</span><span>;</span></div></div><div><div><div>12</div></div><div><span>  </span><span>//设置 笔触样式(边框样式) 为黄色</span></div></div><div><div><div>13</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>lineWidth</span><span>=</span><span>40</span><span>;</span></div></div><div><div><div>14</div></div><div><span>  </span><span>//边框的宽度为40px</span></div></div><div><div><div>15</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>beginPath</span><span>();</span></div></div><div><div><div>16</div></div><div><span>  </span><span>//开始一个新的路径</span></div></div><div><div><div>17</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>arc</span><span>(</span><span>200</span><span>,</span><span>200</span><span>,</span><span>80</span><span>,</span><span>0</span><span>,</span><span>2</span><span>*</span><span><span>Math</span><span>.</span></span><span>PI</span><span>);</span></div></div><div><div><div>18</div></div><div><span>  </span><span>//圆心坐标是(200,200),半径为80px,起始角度为0度,结束角度为360度</span></div></div><div><div><div>19</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>closePath</span><span>();</span><span>//结束一个路径</span></div></div><div><div><div>20</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>stroke</span><span>();</span><span>//绘制图形以边框样式绘制</span></div></div><div><div><div>21</div></div><div><span>}</span></div></div><div><div><div>22</div></div><div><span>draw2</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>
<p>案例3&lt;每次调用fill绘制填充图的时候&gt;，会把当次路径的起始点和结束点分别连接，填充闭合部分(如果想让每个路径互不干扰 一定要记得写结束路径—&gt;关闭路径)</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>draw3</span><span>(){</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>strokeStyle</span><span>=</span><span>'pink'</span><span>;</span><span>//设置笔触样式(边框样式)颜色为粉色</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>beginPath</span><span>();</span><span>//开始一个路径</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>lineWidth</span><span>=</span><span>2</span><span>;</span><span>//边框的宽度为2px</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>arc</span><span>(</span><span>100</span><span>,</span><span>100</span><span>,</span><span>100</span><span>,</span><span>0</span><span><span>,</span><span>Math</span><span>.</span></span><span>PI</span><span>);</span><span>//圆心坐标是100,100,半径为100,起始角度为0度,结束角度为180度</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>closePath</span><span>();</span><span>//结束一个路径</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>stroke</span><span>();</span><span>//绘制图形以边框样式绘制</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>fillStyle</span><span>=</span><span>'gray'</span><span>;</span><span>//设置填充颜色为灰色</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>arc</span><span>(</span><span>300</span><span>,</span><span>300</span><span>,</span><span>80</span><span>,</span><span>0</span><span><span>,</span><span>Math</span><span>.</span></span><span>PI</span><span>/</span><span>2</span><span>);</span><span>//圆心坐标是300,300，半径是80px，起始角度为0，结束角度为90度</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>closePath</span><span>();</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>cvs</span><span>.</span><span>fill</span><span>();</span></div></div><div><div><div>12</div></div><div><span>}</span></div></div><div><div><div>13</div></div><div><span>draw3</span><span>();</span></div></div></code></pre><div><div></div><div></div></div></figure></div>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/Javascript%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E7%9A%84%E5%87%A0%E4%B8%AA%E9%87%8D%E8%A6%81%E6%96%B9%E6%B3%95/</id>
      <title type="text">字符串中的几个重要方法</title>
      <published>2017-06-02T00:00:00.000Z</published>
      <updated>2017-06-02T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/Javascript%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E7%9A%84%E5%87%A0%E4%B8%AA%E9%87%8D%E8%A6%81%E6%96%B9%E6%B3%95/"/>
      <summary type="text">Javascript字符串中的几个重要方法：charAt、charCodeAt、substr、subString、slice、indexOf、lastIndexOf、toUpperCase、toLowerCase、replace、split</summary>
      <content type="html"><![CDATA[<section><h2>1.通过索引查找字符串<a href="#1通过索引查找字符串"><span>#</span></a></h2><section><h3>1.1 <code>charAt</code>(索引) 字符串上的<code>charAt</code>方法里边传索引值，进行搜索指定索引位置的字符，还是字符串格式;原字符串不变。<a href="#11-charat索引-字符串上的charat方法里边传索引值进行搜索指定索引位置的字符还是字符串格式原字符串不变"><span>#</span></a></h3></section><section><h3>1.2 <code>charCodeAt</code>（索引） 返回结果对应的是<code>ASCII</code>码;原字符串不变。<a href="#12-charcodeat索引-返回结果对应的是ascii码原字符串不变"><span>#</span></a></h3><p>例如:</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>str</span><span> </span></span><span>=</span><span> </span><span>'addias'</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>str</span><span>.</span></span><span>charAt</span><span>(</span><span>0</span><span><span>),</span><span>str</span><span>);</span></span></div></div><div><div><div>3</div></div><div><span>//"a" "addias" 原字符串不变</span></div></div><div><div><div>4</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>str</span><span>.</span></span><span>charCodeAt</span><span>(</span><span>0</span><span><span>),</span><span>str</span><span>);</span></span></div></div><div><div><div>5</div></div><div><span>//97 "addias"  原字符串不变</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h2>2.检取字符串<a href="#2检取字符串"><span>#</span></a></h2><section><h3>2.1 <code>substr</code><a href="#21-substr"><span>#</span></a></h3><section><h4>2.1.1 <code>substr(n,m)</code>; 从索引n开始截取m个<a href="#211-substrnm-从索引n开始截取m个"><span>#</span></a></h4><ul>
<li>返回值为截取的字符串</li>
<li>原有字符串不变</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>    </span><span>var</span><span><span> </span><span>str</span><span> </span></span><span>=</span><span> </span><span>'addias'</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>str</span><span>.</span></span><span>substr</span><span>(</span><span>1</span><span>, </span><span>2</span><span><span>),</span><span>str</span><span>);</span></span><span>//"dd" "addias"</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>2.1.2 <code>str.substr()</code> / <code>str.substr(0)</code>  复制字符串<a href="#212-strsubstr--strsubstr0--复制字符串"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>str</span><span> </span></span><span>=</span><span> </span><span>'addias'</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>str</span><span>.</span></span><span>substr</span><span><span>(),</span><span>str</span><span>);</span></span></div></div><div><div><div>3</div></div><div><span>//"addias" "addias" 复制字符串</span></div></div><div><div><div>4</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>str</span><span>.</span></span><span>substr</span><span>(</span><span>0</span><span><span>),</span><span>str</span><span>);</span></span></div></div><div><div><div>5</div></div><div><span>//"addias" "addias" 复制字符串</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>2.2 <code>subString</code><a href="#22-substring"><span>#</span></a></h3><section><h4>2.2.1 <code>subString(n,m)</code> 从索引n找到索引m之前，不包含m处;原字符串不变<a href="#221-substringnm-从索引n找到索引m之前不包含m处原字符串不变"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>str</span><span> </span></span><span>=</span><span> </span><span>'addias'</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>str</span><span>.</span></span><span>substring</span><span>(</span><span>3</span><span>, </span><span>4</span><span><span>),</span><span>str</span><span>);</span></span></div></div><div><div><div>3</div></div><div><span>//"i" "addias"</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>2.2.1 <code>substring()</code> / <code>substring(0)</code> 克隆字符串<a href="#221-substring--substring0-克隆字符串"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>str</span><span> </span></span><span>=</span><span> </span><span>'addias'</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>str</span><span>.</span></span><span>substring</span><span>(</span><span>0</span><span><span>),</span><span>str</span><span>);</span></span></div></div><div><div><div>3</div></div><div><span>//"addias" "addias"</span></div></div><div><div><div>4</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>str</span><span>.</span></span><span>substring</span><span><span>(),</span><span>str</span><span>);</span></span></div></div><div><div><div>5</div></div><div><span>//"addias" "addias"</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>2.3 <code>slice</code><a href="#23-slice"><span>#</span></a></h3><p>字符串也可以使用<code>slice</code></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>str</span><span> </span></span><span>=</span><span> </span><span>'addias'</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>str</span><span>.</span></span><span>slice</span><span>(</span><span>-</span><span>1</span><span>+</span><span><span>str</span><span>.</span></span><span>length</span><span>));</span><span>//s</span></div></div><div><div><div>3</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>str</span><span>.</span></span><span>slice</span><span>(</span><span>-</span><span>1</span><span>)); </span><span>//s 同数组的使用方法一样</span></div></div><div><div><div>4</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>str</span><span>.</span></span><span>slice</span><span>(</span><span>-</span><span>2</span><span>)); </span><span>//as 同数组的使用方法一样</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.4 <code>indexOf</code> / <code>lastIndexOf</code><a href="#24-indexof--lastindexof"><span>#</span></a></h3><p><code>indexOf</code>字符串中当前字符出现的第一个索引;
<code>lastIndexOf</code>字符串中当前字符出现的最后一个索引;</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>str</span><span> </span></span><span>=</span><span> </span><span>'addias'</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>str</span><span>.</span></span><span>indexOf</span><span>(</span><span>'f'</span><span>));</span><span>//-1</span></div></div><div><div><div>3</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>str</span><span>.</span></span><span>lastIndexOf</span><span>(</span><span>'a'</span><span>));</span><span>//4</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.5 <code>toUpperCase</code> / <code>toLowerCase</code><a href="#25-touppercase--tolowercase"><span>#</span></a></h3><p><code>toUpperCase</code>字符串转化成大写;
<code>toLowerCase</code>字符串转化成小写;</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>str</span><span> </span></span><span>=</span><span> </span><span>'addias'</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>str</span><span>.</span></span><span>toUpperCase</span><span><span>(), </span><span>str</span><span>);</span></span></div></div><div><div><div>3</div></div><div><span>// "ADDIAS" "addias" 字符串转化成大写</span></div></div><div><div><div>4</div></div><div><span>var</span><span><span> </span><span>str</span><span> </span></span><span>=</span><span> </span><span>'ADDIAS'</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>str</span><span>.</span></span><span>toLowerCase</span><span><span>(), </span><span>str</span><span>);</span></span></div></div><div><div><div>6</div></div><div><span>//"addias" "ADDIAS" 字符串转化成小写</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.6 <code>replace</code><a href="#26-replace"><span>#</span></a></h3><p>replace 替换字符串中的字符;原字符串不变。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>str1</span><span> </span></span><span>=</span><span> </span><span>'我,爱,中,国'</span><span>;</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>str1</span><span>.</span></span><span>replace</span><span>(</span><span>'我'</span><span>, </span><span>'wo'</span><span><span>), </span><span>str1</span><span>);</span></span></div></div><div><div><div>3</div></div><div><span>// "wo,爱,中,国"    "我,爱,中,国"</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.7 <code>split</code><a href="#27-split"><span>#</span></a></h3><p><code>split</code> 将字符串拆分成数组;将字符串以字符串中存在的指定分隔符拆分成数组</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>str1</span><span> </span></span><span>=</span><span> </span><span>'我,爱,中,国'</span><span>;</span></div></div><div><div><div>2</div></div><div><span>var</span><span><span> </span><span>str2</span><span> </span></span><span>=</span><span> </span><span>'sdasdasdasdasd'</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>str2</span><span>.</span></span><span>split</span><span>(</span><span>'a'</span><span>));</span></div></div><div><div><div>4</div></div><div><span>//(5) ["sd", "sd", "sd", "sd", "sd"]</span></div></div><div><div><div>5</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>str2</span><span>.</span></span><span>split</span><span>());</span></div></div><div><div><div>6</div></div><div><span>//["sdasdasdasdasd"]</span></div></div><div><div><div>7</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>str1</span><span>.</span></span><span>split</span><span>(</span><span>','</span><span>));</span></div></div><div><div><div>8</div></div><div><span>//["我", "爱", "中", "国"]</span></div></div><div><div><div>9</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>str1</span><span>.</span></span><span>split</span><span>(</span><span>''</span><span>));</span></div></div><div><div><div>10</div></div><div><span>//["我", ",", "爱", ",", "中", ",", "国"]</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/JS%E4%B8%AD%E7%9A%84%E4%BD%9C%E7%94%A8%E5%9F%9F/</id>
      <title type="text">JS中的作用域</title>
      <published>2017-04-29T00:00:00.000Z</published>
      <updated>2017-04-29T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/JS%E4%B8%AD%E7%9A%84%E4%BD%9C%E7%94%A8%E5%9F%9F/"/>
      <summary type="text">JS中的作用域</summary>
      <content type="html"><![CDATA[<section><h4>1.内存<a href="#1内存"><span>#</span></a></h4><ol>
<li>
<p>堆内存：来存储东西的，一般来存储引用数据类型</p>
</li>
<li>
<p>栈内存：代码执行空间，作用域</p>
</li>
</ol></section>
<section><h4>2.作用域(两种)<a href="#2作用域两种"><span>#</span></a></h4><ol>
<li>全局作用域：一打开浏览器就会形成</li>
<li>私有作用域：函数执行形成的作用域</li>
</ol></section>
<section><h4>3.函数执行的时候<a href="#3函数执行的时候"><span>#</span></a></h4><ol>
<li>函数一执行，形成一个私有作用域</li>
<li>有形参数的话给形参数赋值，相当于 <code>var</code> 一个变量，<code>function s(a){}</code>,<code>s(1)</code> -&gt; <code>var a=1</code>;</li>
<li>预解释</li>
<li>代码执行</li>
</ol></section>
<section><h4>4.私有变量(两种)<a href="#4私有变量两种"><span>#</span></a></h4><ol>
<li>形参</li>
<li>在私有作用域中声明的变量，<code>var</code>过和<code>function</code>过得</li>
</ol><p><strong>记住：私有变量只能私有作用域自己使用，别人获取不到</strong></p></section>
<section><h4>5.闭包<a href="#5闭包"><span>#</span></a></h4><p>函数执行的时候形参一个私有作用域，来保护里面的私有变量不受外界干扰，这种机制叫做闭包。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/JS%E4%B8%AD%E7%9A%84%E9%A2%84%E8%A7%A3%E9%87%8A/</id>
      <title type="text">JS中的预解释</title>
      <published>2017-04-29T00:00:00.000Z</published>
      <updated>2017-04-29T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/JS%E4%B8%AD%E7%9A%84%E9%A2%84%E8%A7%A3%E9%87%8A/"/>
      <summary type="text">JS中的预解释</summary>
      <content type="html"><![CDATA[<section><h3>预解释的基础知识<a href="#预解释的基础知识"><span>#</span></a></h3><p>例子:</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>d</span><span>);</span></span><span>//--&gt;function d(){};</span></div></div><div><div><div>2</div></div><div><span>d</span><span>=</span><span>1</span><span>;</span><span>//--&gt;d=1</span></div></div><div><div><div>3</div></div><div><span>s</span><span>=</span><span><span>d</span><span>;</span></span><span>//--&gt;s=1</span></div></div><div><div><div>4</div></div><div><span>function</span><span> </span><span>d</span><span>(){</span><span>//--&gt;xxxfff000</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div><span>d</span><span>();</span><span>//--&gt;d is not a function</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p>1.预解释:</p>
<p>是一个过程，作用域形成之后，代码执行之前，把所有带<code>var</code>关键字和<code>function</code>提前声明或定义。</p>
</li>
<li>
<p>2.作用域：</p>
<ol>
<li>全局作用域：<code>window</code>下，一打开浏览器就会形成。</li>
<li>私有作用域：一个函数就是一个私有作用域，函数一执行就会形成私有作用域。</li>
</ol>
</li>
<li>
<p>3.声明:</p>
<p>告诉浏览器这里有个变量，<code>var</code>关键字的只有声明。</p>
</li>
<li>
<p>4.定义:</p>
<p>赋值过程，在预解释的时候<code>function</code>即声明还定义。</p>
</li>
<li>
<p>5.注意:</p>
<p>预解释的时候遇到变量已经声明过了就不用声明了，但是需要重新定义,例如:</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>//变量只声明未定义就是undefined</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>obj1</span><span>);</span></span><span>//--&gt;undefined</span></div></div><div><div><div>3</div></div><div><span>var</span><span><span> </span><span>obj1</span></span><span>=</span><span>{</span><span>name</span><span>:</span><span>"111"</span><span>};</span></div></div><div><div><div>4</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>fn</span><span>);</span></span></div></div><div><div><div>5</div></div><div><span>function</span><span> </span><span>fn</span><span>() {}</span></div></div><div><div><div>6</div></div><div><span>// 1. 全局作用形成</span></div></div><div><div><div>7</div></div><div><span>// 2. 全局作用域下的预解释：var obj1，function fn=xxxfff000</span></div></div><div><div><div>8</div></div><div><span>// 3. 代码执行：</span></div></div><div><div><div>9</div></div><div><span>    </span><span>// 1.console.log(obj1);--&gt;undefined</span></div></div><div><div><div>10</div></div><div><span>    </span><span>// 2.obj1=xxxfff111</span></div></div><div><div><div>11</div></div><div><span>    </span><span>// 3. console.log(fn);--&gt;function fn() {}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul></section>
<section><h3>预解释的几种特殊情况<a href="#预解释的几种特殊情况"><span>#</span></a></h3><blockquote><p>注意: 全局作用域下的变量就是window的一个属性</p></blockquote><section><h4>1.<code>=</code>右边函数不进行预解释<a href="#1右边函数不进行预解释"><span>#</span></a></h4><p>函数作为值的时候,绑定事件的时候,不进行预解释,如下：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span> </span><span>ff</span><span>=</span><span>function</span><span> () {</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>1</span><span>);</span></div></div><div><div><div>3</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>2.<code>return</code>后面的代码不执行但是需要预解释<a href="#2return后面的代码不执行但是需要预解释"><span>#</span></a></h4><p>return出的内容执行但是不进行预解释:</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>fn</span><span>() {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>var</span><span><span> </span><span>a</span></span><span>=</span><span>0</span><span>;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>f</span><span>);</span></span><span>//function f(){}</span></div></div><div><div><div>4</div></div><div><span>    </span><span>return</span><span> </span><span>function</span><span> () {</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>1</span><span>);</span></div></div><div><div><div>6</div></div><div><span>        </span><span>return</span><span> </span><span>1</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>};</span></div></div><div><div><div>8</div></div><div><span>    </span><span>function</span><span> </span><span>f</span><span>() {}</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div><div><div><div>10</div></div><div><span>var</span><span><span> </span><span>d</span></span><span>=</span><span>fn</span><span>();</span></div></div><div><div><div>11</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>d</span><span>());</span></div></div><div><div><div>12</div></div><div><span>fn</span><span>()();</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>3.在条件语句中<a href="#3在条件语句中"><span>#</span></a></h4><ol>
<li>不管条件是否成立都进行预解释</li>
</ol><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>num</span><span>);</span></span></div></div><div><div><div>2</div></div><div><span>    </span><span>if</span><span> (</span><span>0</span><span>){</span></div></div><div><div><div>3</div></div><div><span>        </span><span>//虽然条件不成立 但是需要预解释</span></div></div><div><div><div>4</div></div><div><span>        </span><span>var</span><span><span> </span><span>num</span></span><span>=</span><span>0</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>ss</span><span>=</span><span>0</span><span>;</span><span>//-&gt;window.ss=0</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>"ss"</span><span> </span><span>in</span><span><span> </span><span>window</span><span>);</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>
<p>条件中有函数<code>function</code></p>
<p>在条件中的<code>var</code>和<code>function</code>只声明不定义，声明的时候当遇到变量已经被声明了，就会报错。</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>if</span><span>(</span><span>'a'</span><span> </span><span>in</span><span><span> </span><span>window</span><span>){</span></span></div></div><div><div><div>2</div></div><div><span>var</span><span><span> </span><span>a</span></span><span>=</span><span>1</span><span>;</span></div></div><div><div><div>3</div></div><div><span>function</span><span>(){};</span><span>//--&gt;'a' has already been declared</span></div></div><div><div><div>4</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<p>条件一旦成立，首先给函数赋值</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>a</span><span>);</span></span></div></div><div><div><div>2</div></div><div><span>    </span><span>if</span><span> (</span><span>"a"</span><span> </span><span>in</span><span><span> </span><span>window</span><span>){</span></span></div></div><div><div><div>3</div></div><div><span><span>        </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>a</span><span>);</span></span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>a</span><span>=</span><span>1</span><span>;</span></div></div><div><div><div>5</div></div><div><span>        </span><span>function</span><span> </span><span>a</span><span>() {}</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>console</span><span>.</span><span>log</span><span><span>(</span><span>a</span><span>);</span></span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div><span>    </span><span>//预解释：function a  --&gt;就相当于给window增加一个“a”属性</span></div></div><div><div><div>9</div></div><div><span>    </span><span>//"a" in window 就是true</span></div></div><div><div><div>10</div></div><div><span>    </span><span>//条件成立第一步先给function a赋值=xxxfff000</span></div></div><div><div><div>11</div></div><div><span>    </span><span>//代码执行：console.log(a);xxxfff000-&gt;function a() {}</span></div></div><div><div><div>12</div></div><div><span>    </span><span>// a=1,重新给a赋值</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ol></section><section><h4>4.自执行函数 不进行预解释<a href="#4自执行函数-不进行预解释"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>//console.log(sss)</span></div></div><div><div><div>2</div></div><div><span>;(</span><span>function</span><span>  </span><span>sss</span><span>() {</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>"a"</span><span>)</span></div></div><div><div><div>4</div></div><div><span>})();</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>5.函数作为参数的时候不进行预解释<a href="#5函数作为参数的时候不进行预解释"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[</span><span>1</span><span>,</span><span>2</span><span>,</span><span>3</span><span>].</span><span>sort</span><span>(</span><span>function</span><span><span>(</span><span>a</span><span>,</span><span>b</span><span>){</span></span></div></div><div><div><div>2</div></div><div><span>return</span><span><span> </span><span>a</span></span><span>-</span><span><span>b</span><span>;</span></span></div></div><div><div><div>3</div></div><div><span>});</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>6.预解释的时候遇到已经声明过得变量不需要声明了，但是需要定义<a href="#6预解释的时候遇到已经声明过得变量不需要声明了但是需要定义"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>var</span><span><span> </span><span>s1</span></span><span>=</span><span>1</span><span>;</span></div></div><div><div><div>2</div></div><div><span>function</span><span> </span><span>s1</span><span>() {</span><span>//s1=xxxfff000</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>"s1"</span><span>)</span></div></div><div><div><div>4</div></div><div><span>}</span></div></div><div><div><div>5</div></div><div><span>function</span><span> </span><span>s1</span><span>() {</span><span>//s1=xxxfff111</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>"s11"</span><span>)</span></div></div><div><div><div>7</div></div><div><span>}</span></div></div><div><div><div>8</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>s1</span><span>);</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>]]></content>
    </entry>
    <entry>
      <id>https://gaodaxiu-blog.netlify.app/posts/%E8%87%AA%E5%AE%9A%E4%B9%89%E5%B1%9E%E6%80%A7%E5%92%8C%E5%BC%95%E7%94%A8%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E7%9A%84%E8%B5%8B%E5%80%BC/</id>
      <title type="text">自定义属性和引用数据类型的赋值</title>
      <published>2017-04-29T00:00:00.000Z</published>
      <updated>2017-04-29T00:00:00.000Z</updated>
      <author><name>GaoDaXiu</name></author>
      <link rel="alternate" href="https://gaodaxiu-blog.netlify.app/posts/%E8%87%AA%E5%AE%9A%E4%B9%89%E5%B1%9E%E6%80%A7%E5%92%8C%E5%BC%95%E7%94%A8%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E7%9A%84%E8%B5%8B%E5%80%BC/"/>
      <summary type="text">自定义属性和引用数据类型的赋值</summary>
      <content type="html"><![CDATA[<section><h3>自定义属性<a href="#自定义属性"><span>#</span></a></h3><ul>
<li>一般都是给某些元素增加一个自己起的属性名（不能是内置属性），来存储一些值的。
<ul>
<li>比如说我们在选项卡中用自定义属性来存储他的索引值</li>
<li>不用全局变量的好处：只有自己可以修改  元素.自定义属性名=值</li>
</ul>
</li>
</ul><ul>
<li>只要是引用数据类型都可以加自定义属性</li>
<li>特别注意：函数也可以加</li>
</ul></section>
<section><h3>引用数据类型<a href="#引用数据类型"><span>#</span></a></h3><ul>
<li>
<p>对象:</p>
<ul>
<li>浏览器先看是什么数据类型的，是对象的话，浏览器给对象开辟一个堆内存</li>
<li>把所有的键值对（属性名：属性值）放到这个堆内存里，如果属性值遇到变量名，是把变量代表的值存起来</li>
<li>把这个地址赋给对象</li>
</ul>
</li>
<li>
<p>函数</p>
<ul>
<li>浏览器检测他是什么数据类型，是函数的话就给他开辟一个堆内存</li>
<li>将函数当做字符串存起来</li>
<li>将地址赋给函数名</li>
</ul>
</li>
</ul></section>]]></content>
    </entry>
</feed>
