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

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查看日志的命令

全部评论

相关推荐

点赞 评论 收藏
分享
02-17 20:43
西北大学 Java
醉蟀:别浪费时间。老板是一个想入行互联网的新人。去年6 7月boss上面看到的。他把所有人都拉到一个微信群,然后一个一个面,自己也在学技术。公司就是一个小区里面租的两间房。都没有买电脑啥的。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
正在热议
更多
牛客网
牛客企业服务