call和 apply 的区别?哪个性能更好一点?
// 通过 call和applu 抛出 原型 性能 测试 掌握 面试节奏
答:
共性 :都是Function 原型上的方法,每一个函数 作为Function 的实例都可以调用这两个方法,而这两个方法都是用来让函数执行并且改变函数中this 指向的,
异性: call 传参是一个个传递 而apply 把所有需要传递的参数以数组的形式保存起来
拓展 bind ,并没有立即执行,而是预先把函数中的this 做了处理
-
哪个性能更好
- 当指定this 的时候在三个以及三个以内的参数 两种方法差不多 ,当超出三个的时候call 性能要好一点
// jq 的作者也提过这个概念 所以后期开发的时候可以使用call多一点
那么什么时候使用apply呢?
我想把数组中的每一项都传过去的时候
fn.apply(this,arr)
或者 fn.call(this,...arr)
- 当指定this 的时候在三个以及三个以内的参数 两种方法差不多 ,当超出三个的时候call 性能要好一点
// fn.call(this, 10, 20, 30);
// fn.apply(this, [10, 20, 30]);
// fn.bind(this, 10, 20, 30)();
自己实现性能测试,结果仅供参考,因为任何的代码测试,都是和测试的环境有关系的 比如 cpu内存 gpu 等电脑当前性能 ,以及不同的浏览器等等*/
// -同步;
// console.time('a');
// //...执行的代码
// console.timeEnd('a');
实现 (5).add(3).minus(2)使其输出结果为6
// 考察范围 类和实例 以及在原型上构建方法,并且能够实现链式调用
// 每次函数 调用都要返回一个NUMBER类 的实例 也叫链式写法
(function() {
// 容错处理
function check(n) {
n = Number(n);
// 如果结果为true 说明是非有效数字
return isNaN(n) ? 0 : n;
}
function add(n) {
n = check(n);
return this + n;
}
function minus(n) {
return this - n;
}
// jq 作者的做法 就是添加多个原型方法的时候的偷懒写法
// ['add', 'minus'].forEach((item, index) => {
// Number.prototype[item] = eval(item);
// });
// 等同于
Number.prototype.add = add;
Number.prototype.minus = minus;
})();
// 等同于
~(function() {})();