1:call和apply区别 调用一个对象的一个方法,用另一个对象替换当前对象 例如:B.apply(A, arguments); 即A对象应用B对象的方法。 而不同之处在于传递的参数, apply最多只能有两个参数——新this对象和一个数组argArray,如果arg不是数组则会报错TypeError; call则可以传递多个参数,第一个参数和apply一样,是用来替换的对象,后边是参数列表。 https://www.w3school.com.cn/js/js_function_apply.asp 2. 闭包是什么,有什么特性,对页面有什么影响 答案:闭包就是能够读取其他函数内部变量的函数,使得函数不被回收,如果过多使用闭包,容易导致内存泄露 function a () { var ddd = 1 function b () { ddd+= 1 log(ddd) } return b; } var c = a(); c() c() c() 3:深拷贝 浅拷贝 只针对对象和数组的 浅拷贝 相互影响 Object.assign() 只有源对象,没有目标对象时为浅拷贝 深拷贝 相互不影响 JSON.parse(JSON.stringify()) for in 遍历,然后递归赋值 Object.assign() 只有源对象,没有目标对象时为浅拷贝 4:原型链 prototype 被定义为:给其它对象提供共享属性的对象。 既然 prototype 只是恰好作为另一个对象的隐式引用的普通对象。那么,它也是对象,也符合一个对象的基本特征。 也就是说,prototype 对象也有自己的隐式引用,有自己的 prototype 对象。 如此,构成了对象的原型的原型的原型的链条,直到某个对象为 null,整个链条终止。 在js中每个对象都有个 prototype 原型属性,原型属性是为其它对象提供共享属性的对象。而 prototype 本身也是个 对象,所以也有自己的 prototype 原型,如此构成了对象的原型的原型的原型的链条,直到某个对象为 null,整个链条终止。 5:数组去重 1:定义一个新数组,使用indexOf(或者 includes) 判断是否没有,如果没有就保存到新数组 2:使用es6 的set,因为set(或者 Map)是不允许重复的,然后使用 Arrar.from 转换为数组 或者 使用object 3:使用 splice ,依次判断前一位和后一位是否相等,然后从后向前删除 如何中断ajax请求 原生: ajax.abort() Axios: cancelToken