秋招2:太极计算机股份有限公司一面——2020.8.27

Boss直聘上联系到的企业,约了今天面试。今天约了三家。。。下午还有:“万物心选App”和“棒棒糖App”的包子科技(北京)有限公司以及“超级简历”的北京超职科技有限公司。

今天天气挺好的也不是很热,早上六点起来从天津赶过来。约好了十点半面试。

这园区是好大啊,好多骑摩托的。停车场有一片位置都是摩托。帅。(没拍图)

 

扫码预约进去之后,到了约好的楼层。先给了一张卷子,要填写个人信息,还有几道前端笔试题。

 

笔试题:

1、两种方法实现水平、垂直居中

  • 不知道子元素的宽度和高度

    • 容器display:flex; justify-content:center; align-items:center;

  • 知道子元素的宽度和高度

    • 容器position:relative; 子元素position:absolute; top:50%; left:50%; transform: translate(-50%, -50%);

       

2、JS的数据类型都有哪些?基本数据类型有哪些?

  • JavaScript的数据类型,共有六种。分别是undefined、null、boolean、number、string、object(ES6新增第七种Symbol一种数据类型,它的实例是唯一且不可改变的类型的值)。

    • Undefined:Undefined类型只有一个值,即特殊值undefined。在使用var声明变量,但未对其加以初始化时,这个变量值就是undefined。

    • Null:Null类型是第二个只有一个值的数据类型。其特殊值就是Null。从逻辑角度上看,null是一个空的对象指针。而这也正是使用typeof操作符检测null值,会返回“object”的原因。

    • Boolean:即布尔类型,该类型有两个值:true、false。需要注意的是,Boolean类型的字面值true和false是区分大小写的。也就是说,True和False(以及其它的混合大小形式)都不是Boolean值,只是标识符。

    • Number:该类型的表示方法有两种形式,第一种是整数,第二种为浮点数。整数:可以通过十进制,八进制,十六进制的字面值来表示。浮点数:就是该数值中必须包含一个小数点,且小数点后必须有一位数字。

    • String:String类型用于表示由零或多个16位的Unicode字符组成的字符序列,即字符串。至于用单引号,还是双引号,在js中还是没有差别的。记得成对出现。

    • Object:Object数据类型,称为对象,是一组数据和功能(函数)的集合。可以用new操作符后跟要创建的对象类型的名称来创建。也可以用字面量表示法创建。在其中添加不同名(包含空字符串在内的任意字符串)的属性。

  • 基本数据类型不包括Object

     

3、JS数据类型判断的方式

  • 使用typeof

    • typeof可以测试出numberstringbooleanundefinedfunction,而对于null及数组、对象,typeof均检测出为object,不能进一步判断它们的类型。

  • 使用instanceof

    • 不能区别undefined和null

  • 使用constructor

    • 不能判断undefined和null

  • 使用Object.prototype.toString.call

  • 使用jquery中的$.type

    • 原理就是用的Object.prototype.toString.call()

 

4、Vue中数据传递方式

  • 父子组件

    • 父传子props

    • 子传父$emit

  • 同级(事件总线)

    • $on()——监听事件。

    • $emit()——把事件沿着作用域链向上派送。

  • 跨级嵌套

    • Vuex

 

5、数组去重

  • 利用ES6 Set去重

    •  function unique (arr) {
           return Array.from(new Set(arr))
       }
       var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
       console.log(unique(arr))
       //[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]
  • 利用for嵌套for,然后splice去重

    •  function unique(arr){            
           for(var i=0; i<arr.length; i++){
               for(var j=i+1; j<arr.length; j++){
                   if(arr[i]==arr[j]){         //第一个等同于第二个,splice方法删除第二个
                       arr.splice(j,1);
                       j--;
                  }
              }
          }
           return arr;
       }
       var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
       console.log(unique(arr))
       //[1, "true", 15, false, undefined, NaN, NaN, "NaN", "a", {…}, {…}]     //NaN和{}没有去重,两个null直接消失了

 

6、vue的生命周期

  • beforeCreate 数据还没有挂载,只是一个空壳,无法访问数据和dom,一般不做操作 //console.log(this.list) //undefind

  • created 绑定事件,挂载数据 并且在这里更新data 不会触发update函数(数据初始化)

  • beforeMount 将模板编译为虚拟dom,放到render中准备渲染 在这里更新data 不会触发update函数

  • mounted 渲染出真实dom 可操作真实dom//如果组件中有更新,就会触发beforeUpdate

  • beforeUpdate 重新生成dom树 根据diff(本质是调用patch函数)算法,对比上一次dom树

  • updated 数据更新完成 render完成

  • beforeDestroy 一般在这里做一些善后工作,例如清除计时器、清除非指令绑定的事件等

  • destroyed 组件的数据绑定、监听...去掉后只剩下dom空壳

 

7、实现:左边宽度固定,右边宽度自适应

  • html结构

     <div class="outer">
        <div class="left">固定宽度</div>
        <div class="right">自适应宽度</div>
     </div>
     
     12345

    在外层div(类名为outer)的div中,有两个子div,类名分别为left和right,其中left为固定宽度,而right为自适应宽度

  • 方法1:左侧div设置成浮动:float: left,右侧div宽度会自拉升适应

     .outer {
        width: 100%;
        height: 500px;
       
     }
     .left {
        width: 200px;
        height: 200px;
       
        float: left;
     }
     .right {
        height: 200px;
       
     }
  • 方法2:对右侧:div进行绝对定位,然后再设置right=0,即可以实现宽度自适应

    绝对定位元素的第一个高级特性就是其具有自动伸缩的功能,当我们将 width设置为 auto 的时候(或者不设置,默认为 auto ),绝对定位元素会根据其 left 和 right 自动伸缩其大小

     .outer {
        width: 100%;
        height: 500px;
       
        position: relative;
     }
     .left {
        width: 200px;
        height: 200px;
       
     }
     .right {
        height: 200px;
       
        position: absolute;
        left: 200px;
        top:0;          
        right: 0;
     }
     
     1234567891011121314151617181920
  • 方法3:将左侧div进行绝对定位,然后右侧div设置margin-left: 200px

     .outer {
        width: 100%;
        height: 500px;
       
        position: relative;
     }
     .left {
        width: 200px;
        height: 200px;
       
        position: absolute;
     }
     .right {
        height: 200px;
       
        margin-left: 200px;
     }
     
     123456789101112131415161718
  • 方法4:使用flex布局

     .outer {
        width: 100%;
        height: 500px;
       
        display: flex;
        flex-direction: row;
     }
     .left {
        width: 200px;
        height: 200px;
       
     }
     .right {
        height: 200px;
       
        flex: 1;
     }

     

8、Vuex包含哪几个部分?

  • state:是存储的单一状态,是存储的基本数据。

  • getters:是store的计算属性,对state的加工,像computed计算属性一样,getter返回的值会根据它的依赖被缓存起来,且只有当它的依赖值发生改变才会被重新计算。

  • mutations:提交更改数据,使用store.commit方法更改state存储的状态

  • actions:像一个装饰器,提交mutation,而不是直接变更状态。(actions可以包含任何异步操作)

  • Module:是store分割的模块,每个模块拥有自己的state、getters、mutations、actions。

     

9、是一个看程序写结果的题,忘了。。。跟map相关的。

 

之后就是

上机题:

img

实现:点击Group2中的checkbox5,Group1中的checkbox1、checkbox2被选中;

   点击Group2中的checkbox6,Group1中的checkbox3、checkbox4被选中。

 <template>
   <div class="hello">
 
     <h1>Group1</h1>
     <div class="checkBox">
       <div>
         <input type="checkbox" id="checkbox1" name="checkbox1" class="group1">
         <label for="checkbox1">checkbox1</label>
       </div>
       <div>
         <input type="checkbox" id="checkbox2" name="checkbox2" class="group1">
         <label for="checkbox1">checkbox2</label>
       </div>
       <div>
         <input type="checkbox" id="checkbox3" name="checkbox3" class="group1">
         <label for="checkbox1">checkbox3</label>
       </div>
       <div>
         <input type="checkbox" id="checkbox4" name="checkbox4" class="group1">
         <label for="checkbox1">checkbox4</label>
       </div>
     </div>
 
     <h1>Group2</h1>
     <div class="checkBox">
       <div>
         <input type="checkbox" id="checkbox5" name="checkbox5" @click="btn1Click">
         <label for="checkbox5">checkbox5</label>
       </div>
       <div>
         <input type="checkbox" id="checkbox6" name="checkbox6" @click="btn2Click">
         <label for="checkbox6">checkbox6</label>
       </div>
     </div>
   </div>
 </template>
 
 <script>
 export default {
   name: 'HelloWorld',
   props: {
     msg: String
  },
   data() {
     return {
       counter1: 0,
       counter2: 0
    }
  },
   methods: {
     btn1Click() {
       console.log(this)
       const g1 = document.getElementsByClassName("group1");
       if (!this.counter1) {
         g1[0].checked = true
         g1[1].checked = true
         g1[2].checked = false
         g1[3].checked = false
         this.counter1 = 1
      }
       else {
         g1[0].checked = false
         g1[1].checked = false
         this.counter1 = 0
      }
 
    },
     btn2Click() {
       const g1 = document.getElementsByClassName("group1");
       if (!this.counter2) {
         g1[0].checked = false
         g1[1].checked = false
         g1[2].checked = true
         g1[3].checked = true
         this.counter2 = 1
      }
       else {
         g1[2].checked = false
         g1[3].checked = false
         this.counter2 = 0
      }
 
    }
  }
 }
 </script>

 

posted @ 2020-08-30 18:45  骑着小猪看夕阳1221  阅读(399)  评论(0编辑  收藏  举报