js高级必问面试题

245 阅读3分钟

new关键字

  1. 创建一个空对象

  2. this指向这个空对象

  3. 给这个空对象赋值

  4. 返回对象

    补充:new构造函数中如果手动return
    return值为值类型 无效 返回new创建的对象
    return值为引入类型 有效 会覆盖new创建的对象

原型对象

  1. 原型对象:任何函数创建的时候,系统会自动创建与之对应的对象,称之为原型对象

  2. 原型对象的作用:解决构造函数 内存浪费+变量污染

  3. 构造函数,原型对象,实例对象三者之间的关系

    • prototype:属于构造函数,指向原型对象
    • proto:属于实例对象,指向原型对象
    • constructor:属于原型对象,指向构造函数

面向对象三大特征

  1. 封装:把代码放入对象的方法中
  2. 继承:子对象拥有父对象所有的成员(js主要用于继承)
  3. 多态:一个对象不同的情况下的不同状态(多态是Java语言特长,js基本不涉及)

原型链

  1. 每一个实例对象都有自己的原型,而原型也是对象,也有自己的原型,以此类推形成链式结构称之为原型链

  2. 对象访问原型链规则:就近原则 对象优先访问自己的属性,如果没有就访问自己的原型,如果原型没有就访问原型的原型,直到原型链的终点null

  3. 经典面试题

    • 原型链的作用:继承
    • js如何实现面向对象继承:原型链

instanceof原理

检测右边构造函数原型在不在左边实例对象的原型中

环境对象this:谁调用我,我指向谁

  1. 普通函数:函数名()this指向window

  2. 对象方法:对象名.方法名()this指向对象

  3. 构造函数:new 函数名()this指向new创建实例对象

    小技巧:没点没new是window,有new是实例,有点是点左边的对象

call apply bind区别

共同点:

都可以修改this指向,第一个参数都是修改的this

不同点:
  1. 传参方式不同:call是逐一传参,apply是数组/伪数组传参
  2. 执行机制不同:call和apply会立即执行函数,bind不会立即执行

闭包是什么

  • 闭包是一个访问其他函数内部变量的函数

  • 闭包=函数+上下文引用

    闭包的作用:解决变量污染

递归函数

  • 一个函数在内部调用自己

    递归函数和循环类似的,也需要有结束条件

深拷贝和浅拷贝

  • 浅拷贝:拷贝地址 ,修改拷贝后的数据对原数据有影响 let newobj = obj
  • 深拷贝:拷贝数据,修改修改后的数据,对原数据没有影响
    1. 先把js对象转换成JSON字符串 let jsonstr = JSON.stringify(obj)
    2. 再把JSON字符串转换成js对象 let newobj = JSON.parse(jsonstr)

箭头函数this:箭头函数没有this

本质通过作用域链,访问上级this

以下几种不能是箭头函数

  • 构造函数
  • call()无法修改箭头函数this
  • 事件处理函数

展开运算符 ...

  • 相当于对象遍历的一种简写
  • 语法: ...对象名