返回

用10道JS面试必考题轻松斩获高薪offer!

前端

1. 谈谈prototype和__proto__区别。
__proto__是用来查找当前对象的原型,而prototpe属性表示构造函数的prototype属性。因此,__proto__的原型是prototype。

2. 请写出call和apply方法的异同?
相通点:

  • call和apply方法都用于在给定的this值下,以对象方法方式来执行某个函数。
  • 在严格模式下,call和apply都接受三个参数:
  • 方法名或函数
  • 设定this值
  • 函数参数列表

不同点:

  • call的参数列表用逗号分隔,而apply方法接受一个参数(该参数必须是一个伪(伪装)),即用作函数参数列表的Array对象。
  • call和apply执行步骤的顺序不同。
  • 某些浏览器call和apply方法不支持。

3. 手写题:写出ES6 class类在对象的原型上增加了什么方法?

  • static方法,用于创建基于类的静态方法。
  • constructor方法,用于为类创建一个构造函数。
  • Symbol.hasInstance方法,用于确定给定的值是否是这个类的实例。
  • *生成器方法,用于生成迭代器对象。

4. 手写题:写出ES6 class类、ES6 类的Symbol.hasInstance方法的作用?
ES6 class类的Symbol.hasInstance方法的作用是:

  • 判断某个实例是否是从指定类派生的。
  • 如果是,则返回true;否则,返回false

ES6 类的Symbol.hasInstance方法的用法:

class Parent {
  constructor() {
    this.name = 'Tom';
  }
}

class Child extends Parent {
  constructor() {
    super();
    this.age = 12;
  }
}

const tom = new Child();
console.log(Child.hasInstance(tom));  // true
console.log(Parent.hasInstance(tom));  // true

5. 谈谈递归和回调函数有什么不同?

  • 递归是函数自己再执行自己。回调函数指在其他代码执行的过程中调用的函数。
  • 递归函数在执行后函数返回的是调用的函数自己,而回调函数是在其他代码执行的过程中执行函数。
  • 递归函数再执行时保留了函数先前执行过程中的信息,回调函数在执行时,退出函数则销毁了调用的信息。

6. 谈谈ES6的class类、ES6 的类的Symbol.hasInstance方法的作用?

  • Symbol.hasInstance方法是ES6中的一个新方法,该方法用于检查一个对象是否是给定类的实例。
  • 这个方法可以用于来检查一个对象是否具有给定类的所有属性和方法。
  • Symbol.hasInstance方法在ES6中非常有用,因为它可以用来确保只有给定类的实例才能被用来作为参数。

7. ES6展开运算符都哪四种?说明使用方法?

  • 扩展运算符...出现在函数声明部分时,可以对参数展开,使用时语法糖:将参数展开成一个真正的元组。
  • 放在函数参数列表后面:。可以将实际参数列表扩展为实参列表,并直接展开。
  • 放在function参数列表前面:。使用时语法糖:
  • 在函数参数列表前面,...号,展开过程是收集剩余参数。
  • 在类成员方法里,...号,可以将参数展开成一个真正的参数列表。
  • 使用模板字符 ...时,为每个迭代的项目创建一个新的值。

8. 手写题:ES6中解构赋值的功能跟之前有什么区别?

  • es6的解构赋值可以把对象或者函数的参数作为组,函数参数可以缺省,但是必须存在;
  • es6的解构赋值可以有默认值,es3的默认值只能通过函数参数来定义。

9. 手写题:正则表达式在js的六种方法和作用分别是什么?

方法 作用
exec 执行正则表达式,并在浏览器中创建一个 Match 对象,储存匹配值。
test 用于检查目标是否符合正则表达式。若匹配,则返回true,否则返回false。
match 用于查询目标的子串,并且将匹配到的结果作为 Match 对象。
search 执行正则表达式,并返回匹配到的第一个子串的位置。
replace 用于检索 Match 对象的内容,并用新内容来取代它。
split 用于将目标分成若干子串,这些子串通过匹配表达式分割,并作为 Match 对象储存。

10. 手写题:es中创建Generator函数方法有哪三种?分别写出三种方法的语法糖。

  • 用function * 声明的函数
  • 用Generator函数的 function * ( [ function body ] ``) { ... }
  • ES6class class { generator_function (* arguments ) { yield ... } } }
  • 用生成器函数类的 ES6 Symbol 遍历
  • [ES7 1.0 ] function * ( arguments ) { ... yield ... } } [ supported in Safari 10.1 ] `
  • function * ( arguments ) { yield ... } } [ still experimental in Safari 13 ]
  • async function * ( arguments ) { yield ... } } [ ES8 1 ] `
  • async function * ( arguments ) { yield ... } }