习题

内容协商

HTTP 可以做的事情之一就是内容协商。 Accept请求头用于告诉服务器,客户端想要获得什么类型的文档。 许多服务器忽略这个协议头,但是当一个服务器知道各种编码资源的方式时,它可以查看这个协议头,并发送客户端首选的格式。

URL eloquentjavascript.net/author配置为响应明文,HTML 或 JSON,具体取决于客户端要求的内容。 这些格式由标准化的媒体类型"text/plain""text/html""application/json"标识。

发送请求来获取此资源的所有三种格式。 使用传递给fetchoptions对象中的headers属性,将名为Accept的协议头设置为所需的媒体类型。

最后,请尝试请求媒体类型"application/rainbows+unicorns",并查看产生的状态码。

  1. // Your code here.

JavaScript 工作台

构建一个接口,允许用户输入和运行一段 JavaScript 代码。

<textarea>字段旁边放置一个按钮,当按下该按钮时,使用我们在第 10 章中看到的Function构造器,将文本包装到一个函数中并调用它。 将函数的返回值或其引发的任何错误转换为字符串,并将其显示在文本字段下。

  1. <textarea id="code">return "hi";</textarea>
  2. <button id="button">Run</button>
  3. <pre id="output"></pre>
  4. <script>
  5. // Your code here.
  6. </script>

Conway 的生命游戏

Conway 的生命游戏是一个简单的在网格中模拟生命的游戏,每一个细胞都可以生存或灭亡。对于每一代(回合),都要遵循以下规则:

  • 任何细胞,周围有少于两个或多于三个的活着的邻居,都会死亡。

  • 任意细胞,拥有两个或三个的活着的邻居,可以生存到下一代。

  • 任何死去的细胞,周围有三个活着的邻居,可以再次复活。

任意一个相连的细胞都可以称为邻居,包括对角相连。

注意这些规则要立刻应用于整个网格,而不是一次一个网格。这表明邻居的数目由开始的一代决定,并且邻居在每一代时发生的变化不应该影响给定细胞新的状态。

使用任何一个你认为合适的数据结构来实现这个游戏。使用Math.random来随机的生成开始状态。将其展示为一个选择框组成的网格和一个生成下一代的按钮。当用户选中或取消选中一个选择框时,其变化应该影响下一代的计算。

  1. <div id="grid"></div>
  2. <button id="next">Next generation</button>
  3. <script>
  4. // Your code here.
  5. </script>