更多课程 选择中心


Web培训

400-996-5531

Web培训

Web前端面试题汇总之JS篇(五)

  • 发布:Web前端培训
  • 来源:小小张 程序员成长指北
  • 时间:2019-05-31 16:33

今天小编要跟大家分享的文章是关于Web前端面试题JS相关知识的文章。在之前的文章中小编也为大家分享过一些相关面试题,如果你想参加Web前端面试,正在做面试准备,就来看一看小编今天为大家准备的文章吧!

Web前端面试题汇总之JS篇(五)

一、怎么判断一个object是否是数组

· 方法一

使用 Object.prototype.toString 来判断是否是数组

function isArray(obj){

return Object.prototype.toString.call( obj ) === '[object Array]';

}

这里使用call来使 toString 中 this 指向 obj。进而完成判断

· 方法二

使用 原型链 来完成判断

function isArray(obj){

return obj.__proto__ === Array.prototype;

}

基本思想: 实例如果是某个构造函数构造出来的那么 它的__proto__是指向构造函数的 prototype属性

· 方法三

利用JQuery, 利用JQuery isArray 的实现其实就是方法1。

function isArray(obj){

return $.isArray(obj)

}

二、继承有哪些方式

· ES6中的class继承

· 原型继承

· 构造继承

· 寄生组合式继承

· 实例继承

简单介绍一下前两种方式, 后面几种继承方式大家可以自行上网查找.

1. ES6中的class继承

class Animal {

constructor(name) {

this.name = name;

};

eat() {

console.log(this.name + '正在吃东西');

};

}

//继承动物类

class Cat extends Animal {

catchMouse(){

console.log(`${this.name}正在捉老鼠`);

}

}

var cat= new Cat('Tom猫');

cat.catchMouse();// Tom猫正在捉老鼠

细心的同学可能会发现, 在Cat 类中没有构造函数, 这里有一个小的知识点,就是ES6的继承方法中如果子类没有写构造函数的话就一般默认添加构造。举个例子。

class Cat extends Animal{

}

// 等同于

class Cat extends Animal{

constructor(name) {

super(name);

//super作为函数调用时,代表父类的构造函数。

}

}

注意:如果我写了构造函数但是没有写super的话,或者super方法的参数不对等等,编译器都会报错。

2. 原型继承

在ES6之前,也有很多继承的方法,其中一个很常用的方法就是使用原型继承。其基本方法就是一个父类的实例赋值给子类的原型。这个继承方式是通过__proto__建立和子类之间的原型链,当子类的实例需要使用父类的属性和方法的时候,可以通过__proto__一级级向上找;

function Animal(name) {

this.name = name;

}

Animal.prototype.eat= function () {

console.log(this.name + '正在吃东西')

};

function Cat(furColor){

this.furColor = furColor ;

};

Cat.prototype = new Animal();

let tom = new Cat('black');

console.log(tom)

缺点: 1. 子类实例时,无法向父类构造函数传参。 2. 父类的私有属性被所有实例共享

三、call、apply、bind之间的关系

这又是一个面试经典问题, 也是ES5中众多坑中的一个,在 ES6 中可能会极大避免 this 产生的错误,但是为了一些老代码的维护,最好还是了解一下 this 的指向和 call、apply、bind 三者的区别.

bind,apply,call三者都可以用来改变this的指向, 下面分别对他们进行比较分析:

apply 和 call

· 二者都是Function对象的方法, 每个函数都能调用

· 二者的第一个参数都是你要指定的执行上下文

· apply 和 call 的区别是: call 方法接受的是若干个参数列表,而 apply 接收的是一个包含多个参数的数组。

var a ={

ame : "Cherry",

fn : function (a,b) {

console.log( a + b)

}

}

var b = a.fn;

b.apply(a,[1,2]) // 3

b.call(a, 4,5,6) // 15

我们常常使用的验证是否是数组(前提是toString()方法没有被重写过):

function isArray(obj){

return Object.prototype.toString.call(obj) === '[object Array]' ;

}

bind 与 apply、call区别

var a ={

ame : "Cherry",

fn : function (a,b) {

console.log( a + b)

}

}

var b = a.fn;

b.bind(a,1,2)(); // 3

我们发现bind()方法还需要调用一次; 是由于 bind()方法创建一个新的函数,我们必须手动去调用。

bind,apply,call的共同和不同点:

· 三者都可以用来改变this的指向

· 三者第一个参数都是this要指向的对象,也就是想指定的上下文,上下文就是指调用函数的那个对象。(点前的那个对象,没有就是全局window)

· 三者都可以传参,但是apply是数组,而call是有顺序的传入

· bind 是返回对应函数,便于稍后调用;apply 、call 则是立即执行

以上就是小编今天为大家分享的关于Web前端面试题汇总之JS篇(五)的文章,希望本篇文章能够对正准备参加Web前端面试的小伙伴们有所帮助。想要了解更多Web前端面试相关知识记得关注达内Web培训官网,小编将继续为大家推荐相关面试题!最后祝愿小伙伴们能够面试成功,顺利找到工作!

【免责声明:本文图片及文字信息均由小编转载自网络,旨在分享提供阅读,版权归原作者所有,如有侵权请联系我们进行删除。】

预约申请免费试听课

填写下面表单即可预约申请免费试听! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:Web前端面试题汇总之JS篇(四)
下一篇:Web前端面试题汇总之JS篇(六)

2022年Web前端面试题目汇总!

Web前端面试题汇总(建议收藏)

2022年Web前端工程师面试题目汇总(附答案详解)

2022年前端常见面试题整理汇总(附答案详解)

Copyright © 2023 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

贵州省

云南省

广西省

海南省