面向面经之我自己的携程一面

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.箭头函数和别的函数有什么区别

  1. 外形不同:箭头函数使用箭头定义,普通函数不一样
  2. 箭头函数全都是匿名函数,普通函数可以匿名也可以具名
  3. 箭头函数不能用于构造函数,不能用new
  4. 箭头函数中的this的指向不同,捕获上下文的this值
  5. 箭头函数不具有arguments对象,而用rest参数...解决,每一个普通的函数调用后都具有一个arguments
  6. 箭头函数通过call()或apply()方法调用一个函数时,只传入一个,对this并没有影响
  7. 箭头函数没有原型属性
  8. 箭头函数不能当做generator函数,不能使用yield关键

21.this指针指向有什么情况

  1. 作为函数进行调用
    作为函数进行调用时为了区分函数的其他调用方式
    函数通常()操作符进行调用,此时函数内的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查看日志的命令

全部评论

相关推荐

黑皮白袜臭脚体育生:春节刚过就开卷吗?哈基馆,你这家伙......
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务