深圳开思

5月25日

面试部门:某业务部门

一面

面试形式:现场面

面试时长:40分钟

面试感悟:面试开始前,看到面试官在面另一个小哥,隐约听到小哥被面试官怼的好惨...所以面试前内心还有点坎坷。但是当真正去面试的时候,面试官好像没有那么凶了,甚至自我感觉眼神中透露着对我的不怀好意...原来他说他有看过我写的文章,说得想点我不知道的考考我...😅

说一说原型链

(面试官叫我详细描述一下,然后说自己也学习一下...我:"不不不,您太谦虚了。")

null为什么被typeof错误的判断为了'object'

说一说几种this指向

  • 默认绑定(非严格模式下this指向全局对象, 严格模式下this会绑定到undefined)

  • 隐式绑定(当函数引用有上下文对象 时, 如 obj.foo()的调用方式, foo内的this指向obj)

  • 显示绑定(通过call()或者apply()方法直接指定this的绑定对象, 如foo.call(obj))

  • new绑定

  • 箭头函数绑定(this的指向由外层作用域决定的)

使用箭头函数时需要注意什么?

  1. 不能用于构造函数
        let Person = (sex) => {
      this.sex = sex
    }
    console.log(new Person('boy'))

结果为:

        Uncaught TypeError: Person is not a constructor
  1. 不要用于事件绑定

例如:

        const btn = document.getElementById('btn');
    btn.addEventListener('click', function() {
      console.log(this) // window
    })
    
    const btn = document.getElementById('btn');
    btn.addEventListener('click', () => {
      console.log(this) // <button id="btn">按钮</button>
    })

可以看到,使用箭头函数进行事件绑定,会丢失原本的this指向。

  1. 原型链上添加方法也不能用箭头函数

说一下JS内置对象

构造器内置对象

  • Object
  • Boolean
  • String
  • Number
  • Function
  • Array
  • RegExp
  • Date
  • Error

其它对象:

  • Math
  • JSON
  • 全局对象
    • NaN
    • parseInt
    • encodeURIComponent

描述一下作用域链

(答案参考:《面试分享:两年工作经验成功面试阿里P6总结》 (opens new window))

当代码在一个环境中创建时,会创建变量对象的一个作用域链(scope chain)来保证对执行环境有权访问的变量和函数。作用域第一个对象始终是当前执行代码所在环境的变量对象(VO)。如果是函数执行阶段,那么将其activation object(AO)作为作用域链第一个对象,第二个对象是上级函数的执行上下文AO,下一个对象依次类推。

在《JavaScript深入之变量对象》中讲到,当查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,就会从父级(词法层面上的父级)执行上下文的变量对象中查找,一直找到全局上下文的变量对象,也就是全局对象。这样由多个执行上下文的变量对象构成的链表就叫做作用域链。

闭包的使用场景

闭包产生的本质就是,当前环境中存在指向父级作用域的引用。

  • 函数防抖
  • 使用闭包设计实现单例模式
  • 为多个组件独立属性,例如在闭包中进行id的累加
  • 设置私有变量
  • 解决经典问题for循环和setTimeout

具体可以看:闭包实际场景应用 (opens new window)

使用闭包需要注意什么

闭包有三个特性:

  1. 函数嵌套函数;

  2. 内部函数使用外部函数的参数和变量;

  3. 参数和变量不会被垃圾回收机制回收。

所以可以看到它的缺点:

  1. 常驻内存,增加内存使用量;

  2. 使用不当造成内存泄漏。

因此我们在使用时需要注意不用的变量要及时的清理掉。

EventLoop

用过哪些ES6的功能

谈谈你对模块的理解

(答案参考:ES6专题—class与模块化(10) (opens new window))

模块可以理解为函数代码块的功能,是封装对象的属性和方法的javascript代码,它可以是某单个文件、变量或者函数。

模块实质上是对业务逻辑分离实现低耦合高内聚,也便于代码管理而不是所有功能代码堆叠在一起,模块真正的魔力所在是仅导出和导入你需要的绑定,而不是将所有的东西都放到一个文件。

在理想状态下我们只需要完成自己部分的核心业务逻辑代码,其他方面的依赖可以通过直接加载被人已经写好模块进行使用即可。

二面

(项目负责人)

面试官:你好,你可以脱下口罩,我们面对面交流一下。

我:...(难道颜值加分吗?那我明天就可以来上班了...)

都是项目相关的问题,然后:

  • 之前的团队人员分配情况
  • 职业规划
  • 期望薪资
  • 有什么想问的

HR面

常规问题...和上面问的差不多...

开思也算是深圳的一家比较大的汽车金融公司吧,这里面的也是3~5年的岗位,其实从一面之后就有预感对方挺中意我的了,但是在最后HR面的时候他们可能也觉得达不到我的期望薪资,所以也是在我回家之后与我电话沟通,表明如果以后有想继续留在深圳的话可以再考虑一下。应该说虽无缘但也算互相结交了一下吧。

Last Updated:
Contributors: leeguooooo