[面试]作答整理一些面试题

一些面试题整理

做作业,整理了一些面试题及答案。感觉到自己有点急躁,虽然差不多每节课差不多都有写博客总结,但是时间赶得很急,心态还是需要调整一下。

  • 写出一个符合 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" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>我的页面</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" type="text/css" media="screen" href="./style.css" />
    <link rel="stylesheet" href="./print.css" media="print">
    <link rel="stylesheet" href="./mobile.css" media="screen and (max-width:500px)">
    <script src="./gbk.js" charset="GBK"></script>
    <script src="./main.js"></script>
</head>
<body>
    <svg width="200" height="200" version="1.1" xmlns="http://www.w3.org/2000/svg">
        <circle cx="100" cy="100" r="50" fill="yellow"/>
    </svg>
</body>
</html>
  • 移动端是怎么做适配的
  1. 设置理想视口meta viewport
<meta name="viewport" content="width=width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  1. 媒体查询

如果设备满足媒体查询中的条件,设置生效。

比如:

<!-- link元素中的CSS媒体查询 -->
<link rel="stylesheet" media="(max-width: 800px)" href="example.css" />

<!-- 样式表中的CSS媒体查询 -->
<style>
@media (max-width: 800px) {
  .facet_sidebar {
    display: none;
  }
}
</style>

如果设备的分辨率在800px一下,则这些CSS文件生效。

  1. 动态rem方案(手机专用自适应方案)

使用 JS 动态调整 REM

<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<script>
    var pageWidth = window.innerWidth
    document.write('<style>html{font-size:'+ pageWidth/10 +'px;}</style>')
</script>

在 SCSS 里使用 PX2REM

@function px( $px ){
  @return $px/$designWidth*10 + rem;
}

$designWidth : 640; // 640 是设计稿的宽度,要根据设计稿的宽度填写。

.child{
  width: px(320);
  height: px(160);
  margin: px(40) px(40);
  border: 1px solid red;
  float: left;
  font-size: 1.2em;
}
  • 实现圆角矩形和阴影

圆角矩形使用border-radius
阴影使用box-shadow
比如:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>我的页面</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" type="text/css" media="screen" href="./style.css" />
    <script src="./main.js"></script>
    <style>
       .xxx {
            width:200px;
            height:100px;
            margin:100px auto;
            background-color: #fff;
            text-align:center;
            line-height: 100px;
            box-shadow: 0px 10px 35px -5px rgba(51,51,51,0.3);
            border-radius: 20px; 
        }
    </style>
</head>
<body>
    <div class="xxx">Shadow</div>
</body>
</html>
  • 什么是闭包,闭包的用途是什么

    • 什么是闭包

    「函数」和「函数内部能访问到的变量」(也叫环境)的总和,就是一个闭包。
    比如:
    javascript var a = 1 function printThis(){ console.log(a) }
    这个函数printThis()和这个变量a就是一个闭包。

    • 闭包的用途

    闭包可以用来「间接访问一个变量」。换句话说,「隐藏一个变量」。
    其实,闭包是 JS 函数作用域的副产品,只要我们正确理解了函数作用域,在生产环境中,我们所写的代码已经符合闭包的定义。

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

function x(a,b){
    console.log(a+b)
    console.log(this.a + this.b)
}
var obj = {a:2,b:3}
x.call(obj,3,4) // 7 5
x.apply(obj,[3,4])  // 7 5
var foo = x.bind(obj,3,4)
foo()   // 7 5

call()、apply()、bind()都可以通过传入第一个参数改变this对象的指向。
call()的arguments传入具体参数,apply()的arguments传入包裹着参数的数组,bind()的arguments传入具体参数。
call()、apply()是立即调用,bind()的返回值是传给一个变量,可以稍后调用。

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

301 : 该状态码表示所请求的URI资源路径已经改变,新的URL会在响应的Location:头字段里找到.
302 : 该状态码表示所请求的URI资源路径临时改变,并且还可能继续改变.因此客户端在以后访问时还得继续使用该URI.新的URL会在响应的Location:头字段里找到.
304 : 告诉客户端,所请求的内容距离上次访问并没有变化. 客户端可以直接从浏览器缓存里获取该资源.
403 : 客户端没有权利访问所请求内容,服务器拒绝本次请求.
404 : 服务器找不到所请求的资源.
500 : 服务器遇到未知的无法解决的问题.
502 : 服务器作为网关且从上游服务器获取到了一个无效的HTTP响应.
505 : 服务器不支持客户端发送的HTTP请求中所使用的HTTP协议版本.

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

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

POST /path HTTP/1.1
Host: localhost:8081
User-Agent: curl/7.54.0
Accept: */*
no1harm: xxx
Content-Length: 10
Content-Type: application/x-www-form-urlencoded

username=ff&password=123
  • 请说出至少三种排序的思路

这三种排序的时间复杂度分别为

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

1.O(n*n)
冒泡排序:比较相邻的元素,如果第一个比第二个大,就交换他们两个,对每一对相邻的元素做同样的工作,从开始第一对到结尾最后一对,这步会让后一位元素就是最大的数,对所有元素重复以上步骤,除了最后一个,直到没有任何一堆数字需要比较
2.O(n log2 n)
快速排序:以一个元素为基准,重新排序数列,比基准值小的元素放左边,大的放右边,然后在对左半边和右半边重复以上操作,直到只有一个数字为止
3.O(n + max)
基数排序:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

感觉这道题对于我来说还是有点头疼的,还是对算法不太熟悉,得加强。

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

1.客户端(浏览器)进行DNS解析,把域名转换成IP地址

2.进行TCP连接(三次握手)

  • 客户端:我要开始连接你了,可以吗
  • 服务端:我准备好了,可以开始了
  • 客户端:那我连接你咯

3.客户端(浏览器)先是通过TCP协议对服务器的指定端口(HTTP协议80/8080, HTTPS协议443)发起请求报文,请求报文包括请求方法、请求路径、HTTP协议、请求报头等。

4.服务器的端口接收到请求报文,开始分析处理报文,查询服务器内是否存在符合请求要求的路径以及文件,返回响应报文;如果不存在此路径或者文件,则返回响应报文,状态码404等消息;如果有,则发送响应报文,包括HTTP协议、状态码200、响应报头、响应内容等;

5.浏览器接收响应内容,并把他渲染到页面上,页面加载完成。

  • 如何实现数组去重

ES5方法:

var array = [1,5,2,3,4,2,3,1,3,4]
function unique(array){
    var n = []
    for(var i = 0;i < array.length; i++){
        if(n.indexOf(array[i]) == -1){
            n.push(array[i]);
        }
    }
    return n;
}
unique(array)   //[1, 5, 2, 3, 4]

ES6方法:

var array = [1,5,2,3,4,2,3,1,3,4]
function unique(arr){
    return [...new Set(arr)]
}
unique(array)   //[1, 5, 2, 3, 4]

只能遍历一次:

var array = [1,5,2,3,4,2,3,1,3,4]
function unique(array) {
    var res = array.filter(function(item, index, array){
        return array.indexOf(item) === index;
    })
    return res;
}
unique(array)   //[1, 5, 2, 3, 4]

猜你喜欢

转载自www.cnblogs.com/No-harm/p/9579740.html