美文网首页
前端练习题

前端练习题

作者: 手劲很大 | 来源:发表于2019-04-09 15:02 被阅读0次

请写出一个符合 W3C 规范的 HTML 文件,要求

页面标题为「我的页面」
页面中引入了一个外部 CSS 文件,文件路径为 /style.css
页面中引入了另一个外部 CSS 文件,路径为 /print.css,该文件仅在打印时生效
页面中引入了另一个外部 CSS 文件,路径为 /mobile.css,该文件仅在设备宽度小于 500 像素时生效
页面中引入了一个外部 JS 文件,路径为 /main.js
页面中引入了一个外部 JS 文件,路径为 /gbk.js,文件编码为 GBK
页面中有一个 SVG 标签,SVG 里面有一个直径为 100 像素的圆圈,颜色随意
注意题目中的路径

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>我的页面</title>
  <link rel="stylesheet" href="./style.css">
  <link rel="stylesheet" media="print" href="./print.css">
  <link rel="stylesheet" media="screen and (max-width: 500px)" href="./mobile.css">
</head>
<body>
  <svg width=  "300px" height= "300px">
    <circle cx= "100px" cy= "100px" r= "50px" fill= "green">
  </svg>
  <script src="./main.js"></script>
  <script src="./gbk.js" charset="GBK"></script>
</body>
</html>

移动端是怎么做适配的?

回答要点:

  1. meta viewport
<meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0">
  1. 媒体查询
<style>
  @media (max-width: 800px){
      body{
        background: red;
      }
   }
</style>
or
<link rel="stylesheet" media="screen and (max-width: 800px)" href="xxx.css">
  1. 动态 rem 方案
    将根元素的font-size设置为页面宽度的大小,当页面变化时,font-size也会做出相应变化。
    知晓1rem = font-size,此时我们就可以利用rem来设置页面的各部分的大小,即使更换到
    不同的设备上,各部分页面也会按比例进行缩放
<script>
  var pageWidth = document.documentElement.clientWidth
  document.write(`<style>html{ font-size: ${pageWidth}px }</style>`)
</script>

用过CSS3吗? 实现圆角矩形和阴影怎么做?

  • 实现圆角矩形:使用border-radius
div {
    width: 100px;
    height: 100px
    border: 1px solid green;
    border-radius: 10px;
}

border-radius 接受px、em、rem、 percentage等等单位的值
border-radius 接受1-4个值:
1个值:四个角都为同一个值
2个值:左上角和右下角使用第一个值,右上角和左下角使用第二个值
3个值:左上角使用第一个值,右上、左下使用第二个值,右下角使用第三个值
4个值:从左上起顺时针使用1-4个值
border-top-left-radiusborder-top-right-radiusborder-bottom-right-radiusborder-bottom-left-radius分别表示四个角,可以单独设置样式

  • 实现阴影:使用box-shadow
/* x偏移量 | y偏移量 | 阴影颜色 */
box-shadow: 60px -16px teal;

/* x偏移量 | y偏移量 | 阴影模糊半径 | 阴影颜色 */
box-shadow: 10px 5px 5px black;

/* x偏移量 | y偏移量 | 阴影模糊半径 | 阴影扩散半径 | 阴影颜色 */
box-shadow: 2px 2px 2px 1px rgba(0, 0, 0, 0.2);

/* 插页(阴影向内) | x偏移量 | y偏移量 | 阴影颜色 */
box-shadow: inset 5em 1em gold;

/* 任意数量的阴影,以逗号分隔 */
box-shadow: 3px 3px red, -1em 0 0.4em olive;

/* 全局关键字 */
box-shadow: inherit;
box-shadow: initial;
box-shadow: unset;

box-shadow 有五个值: inset(阴影默认在边框之外,使用inset则在边框内) 、 <offset-x>/<offset-y> (设置阴影偏移量,x表示水平偏移,y表示垂直偏移,可以有负值)、 <blur-radius> (此值越大,模糊面积越大,阴影越淡)、 <spread-radius> (默认为0,正值时,阴影扩大;负值时,阴影缩小)、 <color> (设置阴影颜色)


什么是闭包,闭包的用途是什么?

阮一峰-JavaScript闭包
JavaScript语言的特殊之处在于函数内部可以直接读取全局变量,函数外部无法读取函数内的局部变量。函数内部声明变量时,一定要使用var命令。如果不用,实际上声明了一个全局变量。

function f1(){
  n = 999
}

f1()

alert(n)  // 999
如何从外部读取局部变量
function f1(){
  var n = 999
  function f2(){
    alert(n)
  }
  return f2
}

var result = f1()

result()   // 999

函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。这就是Javascript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

闭包的概念

阮一峰理解:闭包就是能够读取其他函数内部变量的函数。由于在JavaScript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。所以,在本质上,闭包是将函数内部和函数外部连接起来的一座桥梁。

闭包的用途

闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

使用闭包的注意点

1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。


call、apply、bind 的用法分别是什么?

  • call()方法调用一个函数, 其具有一个指定的this值和逐个提供的参数(参数的列表)。
func.call(thisArg, arg1, arg2, ...)
  • apply()方法调用一个函数, 其具有一个指定的this值,以及作为一个数组(或类似数组的对象)提供的参数。
func.apply(thisArg[, argsArray])
  • bind()方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列。
func.bind(thisArg[, arg1[, arg2[, ...]]])

call()和apply()用法相同,都是调用函数,唯一的不同是call()方法从第二个参数开始一个一个的提供参数,而apply()方法的第二个参数是一个数组,数组内存放需要提供的参数。
bind()方法用于创建函数,bind()方法的第一个参数就是要绑定的函数,当调用 func 时,this就会指向 thisArg 。


请说出至少 8 个 HTTP 状态码,并描述各状态码的意义。

HTTP 状态码就是一个三位数,分成五个类别。

  • 1xx 相关信息
  • 2xx 操作成功
    200 表示请求成功,服务器会返回数据
    204 表示请求成功,但没有返回内容
  • 3xx 代表重定向,需要进一步的操作才能完成请求
    301 表示永久重定向,意味着资源已经搬移到其他地方
    302 表示临时重定向,意味着资源临时搬移到其他地方
    304 服务端已经执行了GET,但文件未变化
  • 4xx 表示客户端错误
    400 Bad Request:服务器不理解客户端的请求,未做任何处理。
    401 Unauthorized:用户未提供身份验证凭据,或者没有通过身份验证。
    403 Forbidden:用户通过了身份验证,但是不具有访问资源所需的权限。
    404 Not Found:所请求的资源不存在,或不可用。
    405 Method Not Allowed:用户已经通过身份验证,但是所用的 HTTP 方法不在他的权限之内。
    410 Gone:所请求的资源已从这个地址转移,不再可用。
    415 Unsupported Media Type:客户端要求的返回格式不支持。比如,API 只能返回 JSON 格式,但是客户端要求返回 XML 格式。
    422 Unprocessable Entity :客户端上传的附件无法处理,导致请求失败。
    429 Too Many Requests:客户端的请求次数超过限额。
  • 5xx表示服务器错误
    500 Internal Server Error:客户端请求有效,服务器处理时发生了意外。
    503 Service Unavailable:服务器无法处理请求,一般用于网站维护状态。

请写出一个 HTTP post 请求的内容,包括四部分。

其中
第四部分的内容是 username=ff&password=123
第二部分必须含有 Content-Type 字段
请求的路径为 /path

POST /path HTTP/1.1
Host: www.baidu.com
User-Agent: curl/7.52.1
Accept: */*
Content-Length: 23
Content-Type: application/x-www-form-urlencoded
 
usrname=ff&password=123

请说出至少三种排序的思路,这三种排序的时间复杂度分别为

O(n*n)
O(n log2 n)
O(n + max)

  1. 冒泡排序
    相邻元素两两比较,较小的放在前面,较大的放在后面,如果两个元素相等,不改变位置。
  2. 快速排序
    设定基准点,将小于基准点的值放在左侧,大于基准点的值放在右侧,然后以此循环给小于基准点和大于基准点的数列排序。
  3. 计数排序
    现有需要排序的数组A,首先新建一个长度为(A中的最大值-A中的最小值+1)的数组B,把数组A中的值减去(A中的最小值)得到此数在数组B中的下标,并置于数组B内,最后将数组B内的元素依次取出放入数组C就得到排序好的数组。

一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?

  1. DNS解析
    DNS解析的过程就是根据域名查找 IP 地址。
  2. TCP连接
    浏览器根据 IP 地址向服务器发起 TCP 连接,与浏览器建立 TCP 三次握手:
    (1)主机向服务器发送一个建立连接的请求(您好,我想认识您);
    (1)服务器接到请求后发送同意连接的信号(好的,很高兴认识您);
    (1)主机接到同意连接的信号后,再次向服务器发送了确认信号(我也很高兴认识您),自此,主机与服务器两者建立了连接。
  3. 发送HTTP请求
    HTTP请求报文是由三部分组成: 请求行, 请求报头和请求正文。
  4. 服务器处理请求并返回HTTP报文
    HTTP响应报文也是由三部分组成: 状态码, 响应报头和响应报文。
  5. 浏览器解析渲染页面
    浏览器是一个边解析边渲染的过程。首先浏览器解析HTML文件构建DOM树,然后解析CSS文件构建渲染树,等到渲染树构建完成后,浏览器开始布局渲染树并将其绘制到屏幕上。
  6. 关闭TCP连接或继续保持连接
    通过四次挥手关闭连接。一端断开连接需要两次挥手(请求和回应),两端断开连接就需要四次挥手。

如何实现数组去重?

假设有数组 array = [1,5,2,3,4,2,3,1,3,4]
你要写一个函数 unique,使得
unique(array) 的值为 [1,5,2,3,4]
也就是把重复的值都去掉,只保留不重复的值。

要求:

不要做多重循环,只能遍历一次
请给出两种方案,一种能在 ES 5 环境中运行,一种能在 ES 6 环境中运行(提示 ES 6 环境多了一个 Set 对象)

ES6 set + 扩展运算符...
var array = [1,5,2,3,4,2,3,1,3,4]

function unique(arr){
  const mySet = [...new Set(arr)]
  return mySet
}

console.log(unique(array)) //(5) [1, 5, 2, 3, 4]
ES6 includes
var array = [1,5,2,3,4,2,3,1,3,4]

function unique(arr){
  var result = []
  arr.forEach(function(e){
    if(!result.includes(e)){
      result.push(e)
    }
  })
  return result
}
console.log( unique(array) ) //(5) [1, 5, 2, 3, 4]
ES5
var array = [1,5,2,3,4,2,3,1,3,4]

function unique(arr){
  var temp = {}
  var result = []
  for(let i=0; i<arr.length; i++){
      if(!temp[arr[i]]){
        temp[arr[i]] = true
        result.push(arr[i])
      }   
  }
  return result
}
console.log(unique(array)) //(5) [1, 5, 2, 3, 4]
var array = [1,5,2,3,4,2,3,1,3,4]

function unique(a){
  var result = a.filter(function(value, index, array){
    return array.indexOf(value) === index
  })
  return result
}

console.log( unique(array) ) //(5) [1, 5, 2, 3, 4]

相关文章

  • 前端练习题

    请写出一个符合 W3C 规范的 HTML 文件,要求 页面标题为「我的页面」页面中引入了一个外部 CSS 文件,文...

  • 好程序员web前端教程分享前端javascript练习题二

    好程序员web前端教程分享前端 javascript 练习题二,创建表格,添加删除操作 介绍:这是用基本的方式,更...

  • 好程序员web前端教程分享前端javascript练习题一

    好程序员web前端教程将会为大家持续分享前端javascript练习题系列。 Math 对象 1.编写一个函数,获...

  • 前端 javascript 练习题

    前端 javascript 练习题 函数 1.编写任意个数字的求和、差、积、商的函数 思路分析:首先求任意个数,因...

  • 前端基础练习题

    /* 变量命名规则: 1.只能由字母、数字、下划线、美元符号组成,并且不能以数字开头。 2.变量命名要...

  • 前端 while循环练习题

    用while循环重写小明的成绩,如果用户输入不合法就反复输入,直到正确为止 假如投资的年利率为5%,试求从1000...

  • python练习题

    1、简单的if判断语句 2、练习题 3、练习题 4、练习题 5、练习题 6、练习题 7、练习题 8、练习题 9、w...

  • 2018-12-01

    练习题1 练习题2 练习题3

  • 2018-10-25 数据库基础

    练习题数据库练习题.png数据库练习题3.png数据库练习题2.png

  • 闭包练习题

    变量提升/作用域链练习题 **原型练习题

网友评论

      本文标题:前端练习题

      本文链接:https://www.haomeiwen.com/subject/gabxiqtx.html