前端|每天5道面试题(3)

3,325 阅读3分钟

每天背5道,务必背熟记住,希望能对找工作的小前端有点帮助

1、JS有几种数据类型,其中基本数据类型有哪些!

七种数据类型

  • Boolean
  • Null
  • Undefined
  • Number
  • String
  • Symbol (ECMAScript 6 新定义)
  • Object

(ES6之前)其中5种为基本类型:string,number,boolean,null,undefined,

ES6出来的Symbol也是原始数据类型 ,表示独一无二的值

Object 为引用类型(范围挺大),也包括数组、函数

ES2020(即 ES11),又增加了新类型:**BigInt。**这里能答出来8种类型更加加分

2、原型和原型链

创建一个函数就会为其创建一个prototype属性,指向这个函数的原型对象,原型对象会自动获得constructor属性,指向prototype属性所在函数。

当一个对象调用某个方法或者属性的时候,先在自身查找,如果找到就调用,如果没有就顺着__proto__到原型对象中查找,如果还没有就继续去原型的原型中查找,一直到null,这样形成一条链叫做原型链。如果还没有找到就返回undefined。

3、继承

(1)原型链继承

(2)构造函数继承

(3)组合继承

4、作用域和闭包

作用域其实可理解为该上下文中声明的 变量和声明的作用范围

闭包属于一种特殊的作用域,称为 静态作用域。它的定义可以理解为: 父函数被销毁 的情况下,返回出的子函数仍然可以继续访问到父级的变量对象,这样的函数称为闭包。

  • 闭包会产生一个很经典的问题:

    • 多个子函数的[[scope]]都是同时指向父级,是完全共享的。因此当父级的变量对象被修改时,所有子函数都受到影响。
  • 解决:

    • 变量可以通过 函数参数的形式 传入,避免使用默认的[[scope]]向上查找
    • 使用setTimeout包裹,通过第三个参数传入
    • 使用 块级作用域,让变量成为自己上下文的属性,避免共享

5、call和apply、bind

首先要了解this的指向问题:

(1)this的指向不是在函数定义时确定的,而是在函数调用时确定,this默认情况下指向window,严格模式下为undefined

(2)使用new 调用构造函数时,构造函数内的this 指向新创建的对象

(3)通过 出call/apply/bind方法显式调用函数时,函数内this 指向指定的对象(第一个参数)

(4)通过上下文对象A调用函数时,函数内this指向对象A

var obj = {
  name: '橘子君',
  fn: function () {
    console.log(this);
  }
}
obj.fn();// 输出:{name: "橘子君", fn: ƒ}

(5)箭头函数本身并不存在this箭头函数的this的指向由它的外层作用域来决定的(指向外层作用域的this)

再来看call和apply、bind

作用:在函数调用时改变函数的执行上下文也就是this的值指向

区别:call采用不定长的参数列表,而apply使用一个参数数组。

  • call: fn.call(target, 1, 2)

  • apply: fn.apply(target, [1, 2])

  • bind: fn.bind(target)(1,2)

本着能为找工作中的前端帮一点小忙的初衷,借鉴了掘金里面很多大佬的文章,如有侵权请告知