DY专属-前端面试题

基础题
CSS部分

  1. CSS选择器有哪些
    1、标签名选择器:通过标签的名称找到指定标签
    格式:元素名{ }
    2、类选择器:通过标签的class属性值选中指定标签,多个标签可以有相同的class值
    格式:.d1{ }
    3、id选择器:通过id找到标签,一个html文件中id不能重复
    格式: #id{}
    4、派生选择器(后代选择器):类似于路径,找到符合要求的标签,会匹配所有的后代标签
    格式: ul li a{} #id li a{}
    5、子元素选择器:和后代类似,但是只能获得子元素
    格式: ul>li>a{}
    6、分组选择器:可以将多种选择器结合到一起使用,用来统一设定样式
    格式: h1,h2,#abc,.m{ }
    7、伪元素选择器:伪元素选择器选择的是元素的状态,状态分为以下几种:
    link 表示元素未被点击时的状态hover 表示鼠标悬停时的状态active 表示元素被点击时的状态visited 表示元素被点击后的状态格式: #id:hover{ }
  2. 介绍一下!important
    !important为开发者提供了一个增加样式权重的方法。应当注意的是!important是对整条样式的声明,包括这个样式的属性和属性值(感谢Brad Czerniak指出其中的差别)。这里有个简单的代码示例可以清晰地说明!important是如何应用于原本的样式中的:
    #example {
    font-size: 14px !important;
    }

#container #example {
font-size: 10px;
}
在上面的代码示例中,由于使用了!important,id为“example”的元素字号将被设置为14px。

JS部分

  1. js对象转json字符串
    将json对象转化为字符串:dataStr=JSON.stringify(data);
  2. json字符串js对象
    使用eval()函数进行转换
    使用 eval() 转换时需要在 json 字符外包裹一对小括号。
    ie8(兼容模式)、ie7、ie6 不要使用此方法。
    var jsonObj = eval(’(’ + jsonStr + ‘)’);
    alert(jsonObj[0][“key”]);
    使用JSON.parse()方法进行转换
    ie8(兼容模式)、ie7、ie6 不要使用此方法。
    var jsonObj = JSON.parse(jsonStr);
    使用jQuery进行转换
    如果我们项目中有使用 jQuery,那么直接使用 $.parseJSON() 方法即可,而且可以确保各个浏览器的兼容性。
    var jsonObj = $.parseJSON(jsonStr);
    VUE部分
  3. npm和cnpm命令的区别
    一般采用CNPM下载包,因为快,NPM下载会比较慢,
    但是CNPM可能会有没有的包或者错误的包资源,这时候就是用npm下载
    NPM(Node Package Manager,节点包管理器)是NodeJS的包管理器,用于节点插件的管理(包括安装,卸载和管理依赖等)。NPM是随同新版的NodeJS一起安装的包管理工具,所以我们需要安装NodeJS。
    NMP安装插件是从NPM官网下载对应的插件包,该网站的服务器在国外,经常会出现下载缓慢或出现异常,这时便需要找到另外的方法提供稳定的下载,这个方法就是CNPM。阿里巴巴的淘宝团队把NMP官网的插件都同步到了在中国的服务器,提供给我们从这个服务器上稳定下载资源。
  4. 介绍一下环境变量
    作为一名开发工程师,自己搭建开发环境的时候,配置环境变量是绕不过的一关
    环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程。
  5. Vue常用组件
    路由:vue-route
    那么到底什么是route呢?我们抛开服务端。换个说法,你知道什么是响应式吧。响应式布局,通过媒体查询出对方的手机型号和屏幕的分辨率, 为其切换展示的样式。
    route你可以理解它就是url的“媒体查询”。通过在url输入不同的路径,可以响应不同的vue页面。
    异步数据请求:axios
    axios是对javascript中原生ajax方法的一个封装。,只不过它作用于vue中。它的引入方法跟route不太一样,因为它仅仅是一套方法,所以我们直接定义到vue的prototype上即可。
    我们通过npm进行安装:npm install axios -s-d
    vuex 状态管理
    首先使用npm进行安装:
    npm i vuex --save
    在使用vuex的时候,我们需要在src目录下新建一个store文件夹,然后在里面创建我们的状态树js。

协同工作部分
Git提交代码
这个问题,主要是看有没有实际工作经验,一般一天的工作后,提交代码都需要基础的步骤,早上拉取最新的代码,下午,拉取最新代码和自己的代码合并,看看有没有冲突,有冲突就解决冲突.然后再add commit pull.
1、git stash
2、git pull
3、git stash pop
4、git add --xxx
5、git commit -m “msg”
6、git pull -r 或 git pull -rebase
7、git push origin HEAD:refs/for/master

中级题
CSS部分

  1. Css中calc, support, media各自的含义及用法?
    @support主要是用于检测浏览器是否支持CSS的某个属性,其实就是条件判断,如果支持某个属性,你可以写一套样式,如果不支持某个属性,你也可以提供另外一套样式作为替补。
    calc() 函数用于动态计算长度值。 calc()函数支持 “+”, “-”, “*”, “/” 运算;
    @media 查询,你可以针对不同的媒体类型定义不同的样式。
  2. css水平、垂直居中的写法,请至少写出4种?
    水平居中
    行内元素: text-align: center块级元素: margin: 0 autoposition:absolute +left:50%+ transform:translateX(-50%)display:flex + justify-content: center

垂直居中
设置line-height 等于heightposition:absolute +top:50%+ transform:translateY(-50%)display:flex + align-items: centerdisplay:table+display:table-cell + vertical-align: middle;

  1. 1rem、1em、1vh、1px各自代表的含义?
    rem是全部的长度都相对于根元素元素。通常做法是给html元素设置一个字体大小,然后其他元素的长度单位就为rem。
    Em,子元素字体大小的em是相对于父元素字体大小元素的width/height/padding/margin用em的话是相对于该元素的font-size
    vw/vh,全称是 Viewport Width 和 Viewport Height,视窗的宽度和高度,相当于 屏幕宽度和高度的 1%,不过,处理宽度的时候%单位更合适,处理高度的 话 vh 单位更好。
    Px,px像素(Pixel)。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。
    一般电脑的分辨率有{1920*1024}等不同的分辨率

  2. 1920*1024 前者是屏幕宽度总共有1920个像素,后者则是高度为1024个像素,画一条0.5px的直线?
    考查的是css3的transform
    height: 1px;
    transform: scale(0.5);

  3. 说一下盒模型?

盒模型是css中重要的基础知识,也是必考的基础知识
盒模型的组成,由里向外content,padding,border,margin.
在IE盒子模型中,width表示content+padding+border这三个部分的宽度
在标准的盒子模型中,width指content部分的宽度
box-sizing的使用
box-sizing: content-box 是W3C盒子模型
box-sizing: border-box 是IE盒子模型
box-sizing的默认属性是content-box
6. 画一个三角形?

这属于简单的css考查,平时在用组件库的同时,也别忘了原生的css

.a{
width: 0;
height: 0;
border-width: 100px;
border-style: solid;
border-color: transparent #0099CC transparent transparent;
transform: rotate(90deg); /顺时针旋转90°/
}

  1. 清除浮动的几种方式,及原理?
    清除浮动简单,但这题要引出的是BFC,BFC也是必考的基础知识点
    ::after /
    / clear: both创建父级 BFC(overflow:hidden)父级设置高度
    BFC (块级格式化上下文),是一个独立的渲染区域,让处于 BFC 内部的元素与外部的元素相互隔离,使内外元素的定位不会相互影响。
    触发条件:
    根元素position: absolute/fixed display: inline-block / tablefloat 元素ovevflow !== visible
    规则:
    属于同一个 BFC 的两个相邻 Box 垂直排列属于同一个 BFC 的两个相邻 Box 的 margin 会发生重叠BFC 的区域不会与 float 的元素区域重叠计算 BFC 的高度时,浮动子元素也参与计算文字层不会被浮动层覆盖,环绕于周围

Html部分
说一下标签的用法
label标签主要是方便鼠标点击使用,扩大可点击的范围,增强用户操作体验
遍历A节点的父节点下的所有子节点
这题考查原生的js操作dom,属于非常简单的基础题,但长时间使用mvvm框架,可能会忘记

Js部分

  1. 用js递归的方式写1到100求和?

    递归我们经常用到,vue在实现双向绑定进行数据检验的时候用的也是递归,但要我们面试的时候手写一个递归,如果对递归的概念理解不透彻,可能还是会有一些问题。

function add(num1,num2){
var num = num1+num2;
if(num2+1>100){
return num;
}else{
return add(num,num2+1)
}
}
var sum =add(1,2);

  1. 页面渲染html的过程?

浏览器渲染页面的一般过程:
1.浏览器解析html源码,然后创建一个 DOM树。并行请求 css/image/js在DOM树中,每一个HTML标签都有一个对应的节点,并且每一个文本也都会有一个对应的文本节点。DOM树的根节点就是 documentElement,对应的是html标签。

2.浏览器解析CSS代码,计算出最终的样式数据。构建CSSOM树。对CSS代码中非法的语法它会直接忽略掉。解析CSS的时候会按照如下顺序来定义优先级:浏览器默认设置 < 用户设置 < 外链样式 < 内联样式 < html中的style。
3.DOM Tree + CSSOM --> 渲染树(rendering tree)。渲染树和DOM树有点像,但是是有区别的。
DOM树完全和html标签一一对应,但是渲染树会忽略掉不需要渲染的元素,比如head、display:none的元素等。而且一大段文本中的每一个行在渲染树中都是独立的一个节点。渲染树中的每一个节点都存储有对应的css属性。
4.一旦渲染树创建好了,浏览器就可以根据渲染树直接把页面绘制到屏幕上。
以上四个步骤并不是一次性顺序完成的。如果DOM或者CSSOM被修改,以上过程会被重复执行。实际上,CSS和JavaScript往往会多次修改DOM或者CSSOM。
3. 说一下CORS?
CORS是一种新标准,支持同源通信,也支持跨域通信。fetch是实现CORS通信的
如何中断ajax请求?
一种是设置超时时间让ajax自动断开,另一种是手动停止ajax请求,其核心是调用XML对象的abort方法,ajax.abort()
4. 说一下事件代理?
事件委托是指将事件绑定到目标元素的父元素上,利用冒泡机制触发该事件
ulEl.addEventListener(‘click’, function(e){
var target = event.target || event.srcElement;
if(!!target && target.nodeName.toUpperCase() === “LI”){
console.log(target.innerHTML);
}
}, false);
5. target、currentTarget的区别?
currentTarget当前所绑定事件的元素
target当前被点击的元素

  1. 说一下宏任务和微任务?
    宏任务:当前调用栈中执行的任务称为宏任务。(主代码快,定时器等等)。 微任务: 当前(此次事件循环中)宏任务执行完,在下一个宏任务开始之前需要执行的任务为微任务。(可以理解为回调事件,promise.then,proness.nextTick等等)。宏任务中的事件放在callback queue中,由事件触发线程维护;微任务的事件放在微任务队列中,由js引擎线程维护。
  2. 说一下继承的几种方式及优缺点?
    借用构造函数继承,使用call或apply方法,将父对象的构造函数绑定在子对象上原型继承,将子对象的prototype指向父对象的一个实例组合继承

原型链继承的缺点
字面量重写原型会中断关系,使用引用类型的原型,并且子类型还无法给超类型传递参数。
借用构造函数(类式继承)
借用构造函数虽然解决了刚才两种问题,但没有原型,则复用无从谈起。
组合式继承
组合式继承是比较常用的一种继承方法,其背后的思路是使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数复用,又保证每个实例都有它自己的属性。
8. 说一下闭包?

闭包的实质是因为函数嵌套而形成的作用域链

闭包的定义即:函数 A 内部有一个函数 B,函数 B 可以访问到函数 A 中的变量,那么函数 B 就是闭包
export和export default的区别?

使用上的不同

export default xxx
import xxx from ‘./’

export xxx
import {xxx} from ‘./’

  1. 说一下自己常用的es6的功能?

    此题是一道开放题,可以自由回答。但要注意像let这种简单的用法就别说了,说一些经常用到并有一定高度的新功能

  2. 像module、class、promise等,尽量讲的详细一点。
    什么是会话cookie,什么是持久cookie?

cookie是服务器返回的,指定了expire time(有效期)的是持久cookie,没有指定的是会话cookie
11. 数组去重?
var arr=[‘12’,‘32’,‘89’,‘12’,‘12’,‘78’,‘12’,‘32’];
// 最简单数组去重法
function unique1(array){
var n = []; //一个新的临时数组
for(var i = 0; i < array.length; i++){ //遍历当前数组
if (n.indexOf(array[i]) == -1)
n.push(array[i]);
}
return n;
}
arr=unique1(arr);
// 速度最快, 占空间最多(空间换时间)
function unique2(array){
var n = {}, r = [], type;
for (var i = 0; i < array.length; i++) {
type = typeof array[i];
if (!n[array[i]]) {
n[array[i]] = [type];
r.push(array[i]);
} else if (n[array[i]].indexOf(type) < 0) {
n[array[i]].push(type);
r.push(array[i]);
}
}
return r;
}
//数组下标判断法
function unique3(array){
var n = [array[0]]; //结果数组
for(var i = 1; i < array.length; i++) { //从第二项开始遍历
if (array.indexOf(array[i]) == i)
n.push(array[i]);
}
return n;
}

es6

es6方法数组去重
arr=[…new Set(arr)];
es6方法数组去重,第二种方法
function dedupe(array) {
return Array.from(new Set(array)); //Array.from()能把set结构转换为数组
}

12.get、post的区别
1.get传参方式是通过地址栏URL传递,是可以直接看到get传递的参数,post传参方式参数URL不可见,get把请求的数据在URL后通过?连接,通过&进行参数分割。psot将参数存放在HTTP的包体内

2.get传递数据是通过URL进行传递,对传递的数据长度是受到URL大小的限制,URL最大长度是2048个字符。post没有长度限制

3.get后退不会有影响,post后退会重新进行提交

4.get请求可以被缓存,post不可以被缓存

5.get请求只URL编码,post支持多种编码方式

6.get请求的记录会留在历史记录中,post请求不会留在历史记录

7.get只支持ASCII字符,post没有字符类型限制
13. 你所知道的http的响应码及含义?
此题有过开发经验的都知道几个,但还是那句话,一定要回答的详细且全面。

1xx(临时响应)

100: 请求者应当继续提出请求。

101(切换协议) 请求者已要求服务器切换协议,服务器已确认并准备进行切换。

2xx(成功)

200:正确的请求返回正确的结果

201:表示资源被正确的创建。比如说,我们 POST 用户名、密码正确创建了一个用户就可以返回 201。

202:请求是正确的,但是结果正在处理中,这时候客户端可以通过轮询等机制继续请求。

3xx(已重定向)

300:请求成功,但结果有多种选择。

301:请求成功,但是资源被永久转移。

303:使用 GET 来访问新的地址来获取资源。

304:请求的资源并没有被修改过

4xx(请求错误)

400:请求出现错误,比如请求头不对等。

401:没有提供认证信息。请求的时候没有带上 Token 等。

402:为以后需要所保留的状态码。

403:请求的资源不允许访问。就是说没有权限。

404:请求的内容不存在。

5xx(服务器错误)

500:服务器错误。

501:请求还没有被实现。

你可能感兴趣的:(python)