谈谈你对原型、原型链的理解?
- 每个构造函数一旦创建都有prototype指针指向它的原型对象,而原型对象会默认生成一个constructor指针又指向构造函数。
什么是闭包,在哪里用过闭包,闭包的使用场景是什么?
- 闭包: 闭包就是能够读取其他函数内部变量的函数
- 在哪使用闭包: 需要获取函数内部变量时
- 闭包的使用场景: 闭包可以用在许多地方,他的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中
怎么实现继承?
- 原型链继承: 将父类的实例作为子类的原型,继承父类方法
- 构造函数: 利用call或者apply把父类中通过this指定的属性和方法复制(借用)到子类创建的实例中
- 组合继承: 通过父类构造,继承父类的属性并保留传参的优点,然后在通过父类实例作为子类原型,实现函数复用
你对this的理解?
- 作为纯粹的函数调用,this指向全局对象
- 作为对象的方法调用,this指向调用对象
- 作为构造函数被调用,this指向新的对象(new会改变this的指向)
- apply调用,this指向apply方法的第一参数
改变this的指向?以及call、apply、bind三者的区别
- call (无数个参数):
- 第一个参数 -> 改变this的指向
第二个参数 -> 使用之后自动执行该函数
function fn(a,b,c){
console.log(this,a+b+c); // this指向window
}
fn();
fn.call(document,1,2,3);//call改变之后this指向document
//输出 #document 6 1,2,3是实参 结果相加为6
- apply(两个参数)
- 第一个参数:改变this指向
第二个参数:数组(里面为实参)
使用时候会自动执行函数
function fn(a,b,c){
console.log(this,a+b+c);
}
fn();
fn.apply(document,[1,2,3]);
- bind(无数个参数)
- 第一个参数:改变this指向
第二个参数之后:实参
返回值为一个新的函数
使用的时候需要手动调用下返回 的新函数(不会自动执行)
function fn(a,b,c){
console.log(this,a+b+c); //window
}
let ff = fn.bind('小明',1,2,3); //手动调用一下
JS数据类型有哪些?
- object undefined boolean string namber null
数组常用的方法?
- 在这里可以说一些比较别人不经常说的,比方说:splice,join,map,filter等等,还有es6的find,findIndex
数组方法那些会改变原数组?
- shift:将第一个元素删除并且返回删除元素,空即为undefined
- unshift:向数组开头添加元素,并返回新的长度
- pop:删除最后一个并返回删除的元素
- push:向数组末尾添加元素,并返回新的长度
- reverse:颠倒数组顺序
- sort:对数组排序
- splice:splice(start,length,item)删,增,替换数组元素,返回被删除数组,无删除则不返回
什么是事件委托?
- 事件委托就是利用事件冒泡,只指定一个父类元素绑定事件,就可以管理所有子类元素
事件委托的实际运用场景是什么?
- Ajax局部刷新区域
- 绑定层级比较低的时候,不在body上绑定
- 定次数较少的时候,把多个事件绑定合并到一次事件委托中,由这个事件委托的回调,来进行分发
怎么理解js的单线程问题?
- js本身是单线程的,浏览器有个概念叫执行队列
- js需要先将自己加入到执行队列中由浏览器来解析,但是执行队列时允许部分元素或者说是对象插队的,比如ajax。于是就形成了js的单线程,但是看起来像是多线程的
- 这里一般会出一些同步和异步的面试题
-
console.log(111); setTimeout(function(){ console.log(222) },1000); console.log(333) 这段代码的结果,为什么结果是这样子的,这段代码的结果是,111,333,222.如果要改成按照顺序执行,111,222,333怎么改进,这个思路是Promise()