JavaScript高级面试题总结02

1. 说说你对原型(prototype)理解

JavaScript 中所有都是对象,在 JavaScript 中,原型也是一个对象,通过原型可以实现对象的属性继承,JavaScript 的函数对象中都包含了一个" prototype "内部属性,这个属性所对应的就是该函数对象的原型。

“ prototype ”作为函数对象的内部属性,是不能被直接访问的。所以为了方便查看一个对象的原型,Firefox 和 Chrome 内核的 JavaScript 引擎中提供了“proto”这个非标准的访问器。

原型的主要作用就是为了实现继承与扩展对象。

2. 介绍下原型链

JavaScript 原型: 每个对象都会在其内部初始化一个属性,就是 prototype (原型)

原型链:

当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的proto隐式原型上查找,即它的构造函数的 prototype ,如果还没有找到就会再在构造函数的 prototype 的proto中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链。

特点:

JavaScript 对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于自己的原型副本。当我们修改原型时,与之相关的对象也会继承这一改变。

3. 常见的 js 中的继承方法有哪些

ES5 继承有以下六种方法:

1、原型链继承 JavaScript 实现继承的基本思想:

通过原型将一个引用类型继承另一个引用类型的属性和方法。

2、借用构造函数继承(伪造对象或经典继承) JavaScript 实现继承的基本思想:

在子类构造函数内部调用超类型构造函数。通过使用 apply() 和 call() 方法可以在新创建的子类对象上执行构造函数。

3、组合继承 (原型 + 借用构造) (伪经典继承) JavaScript 实现继承的基本思想:

将原型链和 借用构造函数的技术组合在一块,从而发挥两者之长的一种继承模式,将原型链和借用构造函数的技术组合到一起,从而取长补短发挥两者长处的一种继承模式。

4、型式继承 JavaScript 实现继承的基本思想:

借助原型可以基于已有的对象创建新对象,同时还不必须因此创建自定义的类型。

5、寄生式继承 JavaScript 实现继承的基本思想:

创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再像真正是它做了所有工作一样返回对象。 寄生式继承是原型式继承的加强版。

6、寄生组合式继承 JavaScript 实现继承的基本思想:

通过借用函数来继承属性,通过原型链的混成形式来继承方法。

ES6 的继承:

1、使用 class 构造一个父类

  class Parent {
    constructor(name, age) {
      this.name = name
      this.age = age
    }
    sayName() {
      console.log(this.name);
    }
  }

2、使用 class 构造一个子类,并使用 extends 实现继承,super 指向父类的原型对象

  class Parent {
    constructor(name, age) {
      this.name = name
      this.age = age
    }
    sayName() {
      console.log(this.name);
    }
  }

3、实例化对象

  const ming = new Child('ming', 18, '男')
  ming.sayGender()
  ming.sayName()
  console.log(ming.name);
  console.log(ming.age);

4. 介绍 this 各种情况

1、以函数形式调用时,this 永远都是 window

2、以方法的形式调用时,this 是调用方法的对象

3、以构造函数的形式调用时,this 是新创建的那个对象

4、使用 call 和 apply 调用时,this 是指定的那个对象

5、箭头函数:箭头函数的 this 看外层是否有函数。如果有,外层函数的 this 就是内部箭头函数的 this;如果没有,就是 window

6、特殊情况:通常意义上 this 指针指向为最后调用它的对象。这里需要注意的一点就是如果返回值是一个对象,那么 this 指向的就是那个返回的对象,如果返回值不是一个对象那么 this 还是指向函数的实例

5. 数组中的 forEach 和 map 的异同点?

相同点:

都是循环遍历数组中的每一项。forEach 和 map 方法里每次执行匿名函数都支持 3 个参数,参数分别是 item(当前每一项), index(索引值),arr(原数组)。匿名函数中的 this 都是指向 window ,只能遍历数组,都不会改变原数组。

区别 :

map 方法:

  1. map 方法返回一个新的数组,数组中的元素为原始数组调用函数处理后的值 。

  2. map 方法不会对空数组进行检测,map 方法不会改变原始数组。

  3. 浏览器支持:chrome、Safari1.5+、opera 都支持,IE9+, 若 arr 为空数组,则 map 方法返 回的也是一个空数组。

forEach 方法:

  1. forEach 方法用来调用数组的每个元素,将元素传给回调函数。

  2. forEach 对于空数组是不会调用回调函数的。 无论 arr 是不是空数组,forEach 返回的都是undefined。这个方法只是将数组中的每一项作为 callback 的参数执行一次。

6. for in 和 for of 的区别

1、推荐在循环对象属性的时候使用 for...in,在遍历数组的时候的时候使用 for...of

2、for...in 循环出的是 key,for...of 循环出的是 value

3、注意,for...of 是 ES6 新引入的特性。修复了 ES5 引入的 for...in 的不足

4、for...of 不能循环普通的对象,需要通过和 Object.keys()搭配使用

7. call 和 apply,bind 的异同点

共同点:

1、都是用来改变函数的 this 对象的指向的。

2、第一个参数都是 this 要指向的对象。

3、都可以利用后续参数传参。

call 方法调用一个函数, 其具有一个指定的 this 值和分别地提供的参数(参数的列表)。

区别:

call()方法的作用和 apply() 方法类似,区别就是 call()方法接受的是参数列表,而 apply() 方法接受的是一个参数数组

bind()方法创建一个新的函数,当这个新的函数被调用时,其 this 值为提供的值,其参数列表前几项,置为创建时指定的参数序列

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

端端1023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值