面向面经之我自己的携程一面
4.16面的
面试官似乎在拖时间哈哈哈,强行问了26分钟
下面的问题没有逻辑,我是想到啥写啥
1.css选择器权重
选择器:
内联样式 1000
#id选择器 0100
.类、伪类、属性 0010
通用、子、相邻 0001
继承的属性没有权重
2.vue框架和别的框架有什么区别
3.css水平居中
对于行内元素,父元素设置text-align
对于块级元素(元素定宽)
1.可以直接设置margin-left和margin-right为auto
2.设置绝对定位,left:50%,margin-left:此元素一半宽度;
3.设置绝对定位:左上右下都设为0,margin:auto;
对于块级元素(元素不定宽)
1.flex布局,父元素设置display:flex,flex-direction:column且align-items为center
2.flex布局,父元素设置display:flex,子元素margin:auto
3.设置父元素为inline-block,左50%,子元素relative,右50%;
4.绝对定位,左50%,transform,tranlateX(-50%)
4.项目相关
5.怎么给一个dom元素添加一个类
我回答的是:js用getElementById获取这个dom元素,然后用setAttribute添加一个类
他一直问,还有吗,然而我不知道了
ans:
6.let和var的区别
let在一个块级作用域里,外部不可获取,而var声明在块级作用域里也仍然可以被外部获取
子问题:在函数内部声明一个var的b,在外部访问这个b可以访问到吗
尼玛,可以啊
为什么我会觉得不可以
傻子傻子
let没有变量提升,var有
7.const一个数组,是否能够push一个数据进去
为什么能或不能
可以push
因为const实际保证的不是变量的值不能改变,而是变量指向的那个内存地址不能改动。对于简单类型的数据,值就保存在变量指向的内存地址,所以等同于常量。但是对于复合类型的数据而言,变量指向的内存地址保存的只是一个指针,const只能保证这个指针是固定的。至于它指向的数据结构是不是可变的,这不能控制。
8.vue里的data如果改变了一个数据,是否能在view里显示出来
参考了别人的文章写的笔记,但是忘记了是哪篇文章,如有冒犯,十分抱歉
!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="./lib/vue-2.4.0.js"></script>
</head>
<!-- 在vue中,data数据改变了,视图没有改变的常见情况 -->
<!-- 直接通过等号改变数据 -->
<!-- 直接通过等号改变长度 -->
<body>
<div id="app">
{{arr}}
<div class="demo" ref="refDemo">
方法一:{{arr[2]}}
<button @click="Add">+</button>
方法二:obj:{{obj.test[0].testStr}}
方法三:
<div >{{test}}</div>
<div v-if="test"></div>
</div>
</div>
<script>
// 创建 Vue 实例,得到 ViewModel
var vm = new Vue({
el: '#app',
data: {
arr:[1,2,3,4,5,6],
obj:{
test:[{testStr:3}],
},
test:false
},
methods: {
Add(){
// 第一种方法 this.$forceUpdate()
// this.arr[2]+=this.arr[2]
// console.log('this.arr[2]:'+this.arr[2])
// this.$forceUpdate()
//=============================================
//第二种方法 $set()
// this.$set(this.obj.test[0],'testStr',this.obj.test[0].testStr+3)
//=============================================
// 方法三修改另一个data里面的值主动更新触发渲染
//this.arr[2]+=this.arr[2]
// this.test =!this.test
//=============================================
//方法三优化版
this.arr[2]+=this.arr[2]
this.test=true
this.$nextTick(() => {
this.test = false
})
}
}
});
// 这些操作是不能实时被检测到的,即不是响应式的
vm.arr[2]=1;
vm.arr.length=1;
//数组,索引,要改成的数据
Vue.set(vm.arr,1,0);//这个位置为什么会只有两个值?
console.log(vm.arr);
vm.arr.splice(0,1,2);//添加删除对象
// 已经创建的实例,不能动态添加根级别的响应式属性
// 但是可以用vue.set向嵌套对象添加响应式属性
Vue.set(vm.obj,'age','30');
console.log(vm.obj);
// 为已有对象添加多个新的响应式属性
vm.obj=Object.assign({},vm.obj,{
laji:13,
shagua:'chen'
})
console.log(vm.obj);
</script>
</body>
</html>9.如果一个页面有很多图片,要怎么进行优化
我说的图片懒加载
10.你说当这个页面滑下来再加载,怎么监听这个滑下来
参考链接:https://zhuanlan.zhihu.com/p/55311726
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<!-- <script src="https://cdn.bootcss.com/jquery/2.1.0/jquery.min.js"></script> -->
<style>
img {
display: block;
width: 100%;
height: 300px;
margin-bottom: 20px;
}
</style>
</head>
<body>
<!-- 图片是img标签,图片的来源是src属性,浏览器是否发出请求就是根据是否有src属性决定的
那么在没进入可视区域的时候,我们先不给img标签赋src属性,这样就不会发送请求
-->
<!-- 因为图片需要很多内存,全部加载的话会影响用户体验,且浪费用户的流量 -->
<!-- 效果:这样能防止页面一次性向服务器发送大量请求,导致服务器响应页面卡顿崩溃 -->
<img data-src="./images/dahuangmao-01.png" alt="">
<img data-src="./images/dahuangmao-02.png" alt="">
<img data-src="./images/dahuangmao-03.png" alt="">
<img data-src="./images/dahuangmao-04.png" alt="">
<img data-src="./images/dahuangmao-05.png" alt="">
<img data-src="./images/dahuangmao-06.png" alt="">
<img data-src="./images/dahuangmao-07.png" alt="">
<img data-src="./images/dahuangmao-08.png" alt="">
<img data-src="./images/dahuangmao-09.png" alt="">
<img data-src="./images/dahuangmao-10.png" alt="">
<img data-src="./images/dahuangmao-11.png" alt="">
<script>
// 相关api
// document.documentElement.clienrHeight获取屏幕可视区域的高度
// documentElement就是html元素,也就是文档本身
// clientHeight包括内边距和内容,不包括border和margin
// element.offsetTop获取元素相对于文档顶部的高度
// document.documentElement.scrollTop
// 获取浏览器窗口顶部与文档顶部之间的距离,也就是滚动条滚动的距离
// 所以,当offsetTop==scrollTop+clientHeight时,就即将要显示了
var imgs = document.querySelectorAll('img');
//offsetTop是元素与offsetParent的距离,循环获取直到页面顶部
function getTop(e) {
var T = e.offsetTop;
while (e = e.offsetParent) {
T += e.offsetTop;
}
return T;
}
function lazyLoad(imgs) {
var H = document.documentElement.clientHeight;//获取可视区域高度
var S = document.documentElement.scrollTop || document.body.scrollTop;
for (var i = 0; i < imgs.length; i++) {
if (H + S > getTop(imgs[i])) {
imgs[i].src = imgs[i].getAttribute('data-src');
}
}
}
window.onload = window.onscroll = function () { //onscroll()在滚动条滚动的时候触发
lazyLoad(imgs);
}
</script>
</body>
</html>11.http他的返回里有什么东西
由响应行、响应头、响应体组成
- 响应头里有http协议/版本 状态码 状态
比如 HTTP/1.1 200 OK\n- 响应头里
Server:该响应头是服务器告诉浏览器当前的服务类型和版本
Accept-Ranges:bytes 表明服务器支持range请求,以及服务器只允许使用bytes
ETag被请求变量的实体值
Last-Modified:服务器上文件的最后修改时间
Content-Type服务器告诉浏览器响应的内容是什么类型,以及使用的是什么字符编码
Content-Length服务器告诉浏览器响应实体的大小
Date服务器是在什么时候响应回浏览器
12.http的状态码有哪些
自己查
我累死了
13.同源策略是啥
同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方的源
- 子问题:怎么判断是否同源
协议 域名 端口三者相同 只要有一个不同就不是同源 - 子问题:同源策略的限制
cookie、localStorage、indexdb无法读取
dom无法获得
ajax请求不能发送
14.怎么跨域
我说了一堆就是没说cors
- 1.document.domain\n只针对cookie
只针对父域相同,子域不同 - 2.jsonp
- 3.location.hash
针对完全不同源的页面
父窗口可以把信息传入子窗口的#后面的部分 - 4.window.name
针对同一个窗口的页面,前一个网页设置了这个属性,后一个网页可以读取
将信息写入window.name - 5.postMesaage\n可以读dom和localstorage
开启window之后,用possMessage直接传到信息
但是要通过监听message来看是否变化 - 6.cors
- 7.webSocket
设置origin。
表示该请求的请求源,发自哪个域名
如果该请求源在白名单内,服务器就会有响应。
15.那你知道cors吗
啊 该来的还是会来。。我复习就忘了看这个
绝望
参考链接:http://www.ruanyifeng.com/blog/2016/04/cors.html
跨域资源共享
它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了ajax只能同源使用的限制
整个cors通信过程,都是浏览器自动完成,不需要用户参与。
对于开发者而言cors通信与同源的ajax通信没有差别,浏览器一旦发现ajax请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。
因此,只要服务器实现了cors接口,就可以跨源通信
两种请求
简单请求
请求方法:head、get、post
头信息不超过:accept、content-language,last-event-id,content-type
浏览器直接发出cors请求,在头信息中添加一个origin字段,用来说明本次请求来自哪个源。
服务器根据这个值,决定是否同意这次请求。
如果origin指定的源,不在许可范围内,服务器会返回一个正常的http回应,浏览器发现,这个头信息没有包含Access-Control-Allow-Origin字段就知道错误了。从而抛出一个错误,被XMLHttpRequest的onerror回调函数捕获。无法通过状态码识别,因为可能是200
如果是在许可范围内,返回的响应会多几个头信息字段
cors请求默认不发送cookie和http认证信息,如果要把cookie发送到服务器,一方面要服务器同意,指定Access-Control-Allow-Credentials为true\n另一方面,开发者要在ajax请求中打开withCredentials属性非简单请求
请求方法是put或delete或者content-type为application/json
1.预检请求---使用options,表示这个请求是用来询问的
- 关键字段是origin\n- 会在正式通信前增加一次http查询请求,称为预检请求
- 浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些http动词和头信息字段,得到肯定答复浏览器才会发出正式的XMLHttpRequest请求,否则就报错
- 除了origin字段,预检请求的头信息包括下面两个特殊字符
Access-Control-Request-Method必须,列出会用到的http方法
Access-Control-Request-Headers指定浏览器cors请求会额外发送的头信息字段 - 预检请求的回应\n服务器收到以后,检查了origin,Access-Control-Request-Method和Access-Control-Request-Headers后,确认允许,则会返回
如果否认,则返回正常http回应,但是没有任何cors相关的头信息字段。
2.正常请求和回应
通过了预检,就都跟简单请求一样
16.学了多久前端,为啥想做前端
17.vue的生命周期
初始化啥的都没开始
beforeCreate
初始化事件、开始数据的绑定,所以在created之后就能取到data属性的值
created
判断是否有el选项,判断是否有template,如果有的话就按template的内容编译,如果没有的话,就编译外部的html代码
beforemount
给vue实例对象添加el成员,替换挂载的dom元素,所以在mounted之后整个页面就渲染完成了
mounted
数据改变才会触发
beforeUpdate
updated要离开这个页面才会触发
beforeDestroy
destroyed
18.每个生命周期是有什么用处?一般的应用场景
beforeCreate可以在这加loading
created:初始化完成时的事件写在这,在这里结束loading,异步请求也在这里调用
mounted:挂载元素,获取dom节点
updated:对数据处理
beforeDestroy:可以做一个确认停止事件的确认框
19.jsonp是怎么实现跨域的,他返回的是一个什么东西
只能发get请求
网页通过添加一个script元素,向服务器请求json数据,这种方法不受同源政策的限制,服务器收到请求后,将数据放在一个指定名字的回调函数里传回来。
- 动态插入一个script元素,由它向跨源网址发出请求
- 服务器收到这个请求之后,会将数据放在回调函数的参数位置返回
所以 返回的是 回调函数
20.箭头函数和别的函数有什么区别
- 外形不同:箭头函数使用箭头定义,普通函数不一样
- 箭头函数全都是匿名函数,普通函数可以匿名也可以具名
- 箭头函数不能用于构造函数,不能用new
- 箭头函数中的this的指向不同,捕获上下文的this值
- 箭头函数不具有arguments对象,而用rest参数...解决,每一个普通的函数调用后都具有一个arguments
- 箭头函数通过call()或apply()方法调用一个函数时,只传入一个,对this并没有影响
- 箭头函数没有原型属性
- 箭头函数不能当做generator函数,不能使用yield关键
21.this指针指向有什么情况
- 作为函数进行调用
作为函数进行调用时为了区分函数的其他调用方式
函数通常()操作符进行调用,此时函数内的this指针指向的是window对象
默认this指针指向调用函数的对象,此时函数实际上是window对象的一个方法。
2.作为方法进行调用
一个方法所属的对象在该方法 体内可以以this的形式进行引用,因此当一个函数以方法的形式被调用时,this指针指向该方法的所有者
3.作为构造器进行调用
当函数作为构造函数进行调用,this指针的指向解释就略复杂。
在js中,构造函数被用来构造对象
构造函数的调用,返回值即为一个对象,而这个对象即为构造函数作用域内this指针的引用对象,即“函数上下文”
22.html的语义化标签
header
nav
aside
footer
article
23.forEach和map有什么
1.相同点: 1.都是循环遍历数组中的每一项 2.每次执行匿名函数都支持三个参数,参数分别为item(当前每一项),index(索引值),arr(原数组) 3.匿名函数中的this都是指向window 4.只能遍历数组
2.不同点 1.map()会分配内存空间存储新数组并返回,forEach()不会返回数据。 2.forEach()允许callback更改原始数组的元素。map()返回新的数组。
24.js的数据类型
值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol。
引用数据类型:对象(Object)、数组(Array)、函数(Function)
25.typeof和instanceof
typeof(null)输出什么
26.你的项目有什么难点
27.inline和inline-block的区别
inline:
- 和其他元素都在一行上
- 元素的高度、宽度及顶部和底部边距不可设置
- 元素的宽度就是它包含的文字或图片的宽度,不可改变
inline-block
有内联元素、块块元素的特点:
和其他元素都在一行上
元素的高度、宽度、行高以及顶和底边距都可设置
28.有使用过promise吗?promise有哪几种状态?
3中状态 Pending进行中 Fulfilled完成 rejected已失败
29.promise一般用来做什么
用于异步编程 保存着某个未来才会结束的事件
针对:腾讯 前端实习一面面经
1 自我介绍
2 前端安全(xss csrf)
xss-
csrf-
map和普通对象的区别
箭头函数
原型链
js原型继承
class继承和js继承的区别
http缓存
http缓存更新静态文件的方式
etag的算法
https和http的区别
http状态码 302 504分别代表什么意思
tcp和udp的区别
跨域方法
postmessage
Nodejs下载文件
electron网络捕获
electron组件通信
vue生命周期
vue组件通信
diff算法
vue和react的核心区别
vue3的新特性
webpack的打包流程
webpack的打包时间优化
koa的底层原理
pm2查看日志的命令