首页 > 编程知识 正文

箭头函数面试题,箭头函数有哪些新特性

时间:2023-05-06 20:16:44 阅读:198656 作者:419

文章目录 1.箭头函数与普通函数的区别(1)区别a.外形不同b.箭头函数都是匿名函数c.箭头函数不能用于构造函数,不能使用[new](https://editor.csdn.net/md?not_checkout=1&articleId=120271698#3new_97)d.this的指向不同e.箭头函数的this指向不可变f.箭头函数不绑定auguments,取而代之用rest(...)解决g.箭头函数不能Generator函数,不能使用yield关键字h.箭头函数不具有prototype原型对象i.箭头函数不具有superj.箭头函数不具有new.target 2.new原理(1)原理(2)手写new 3.箭头函数可以new吗?
上一篇关于ES6的函数扩展中,在箭头函数部分提到了箭头函数的一些注意点,涉及到了箭头函数中this的指向,不能new实例等,下面详细记录一下箭头函数和普通函数的区别,以及new原理

1.箭头函数与普通函数的区别 (1)区别 a.外形不同 // 普通函数function fn = function() {}// 箭头函数let fn = () => {} b.箭头函数都是匿名函数 普通函数可以是具名函数,也可以是匿名函数;箭头函数只能是匿名函数。 // 普通函数 - 具名函数function fn() {}// 普通函数 - 匿名函数const fn = function (){}// 箭头函数 - 匿名函数const fn = () => {} c.箭头函数不能用于构造函数,不能使用new 普通函数可以用于构造函数,使用new创建实例。 function P() { console.log('name')}const p = new P() // name d.this的指向不同 普通函数中,this指向调用它的对象。如果用作构造函数,this指向创建的实例对象;箭头函数本身没有this,但它在声明时可以捕获其所在上下文的this供自己使用。也就是说箭头函数的this指向的是函数声明时所在的上下文。 e.箭头函数的this指向不可变 call()、apply()、bind()对箭头函数没有效果。 let obj2 = { a: 10, b: function(n) { let f = (n) => n + this.a; return f(n); }, c: function(n) { let f = (n) => n + this.a; let m = { a: 20 }; return f.call(m,n); }};console.log(obj2.b(1)); // 结果:11console.log(obj2.c(1)); // 结果:11 f.箭头函数不绑定auguments,取而代之用rest(…)解决 每一个普通函数调用后都有arguments对象,用来存储实际传递的参数。 // 普通函数function A(a){ console.log(arguments);}A(1,2,3,4,5,8); // [1, 2, 3, 4, 5, 8, callee: ƒ, Symbol(Symbol.iterator): ƒ]// 箭头函数let B = (b)=>{ console.log(arguments);}B(2,92,32,32); // Uncaught ReferenceError: arguments is not definedlet C = (...c) => { console.log(c);}C(3,82,32,11323); // [3, 82, 32, 11323] g.箭头函数不能Generator函数,不能使用yield关键字 h.箭头函数不具有prototype原型对象 var a = ()=>{ return 1;}function b(){ return 2;}console.log(a.prototype); // undefinedconsole.log(b.prototype); // {constructor: ƒ} i.箭头函数不具有super j.箭头函数不具有new.target

2.箭头函数可以new吗?
不能,因为:
1.箭头函数没有prototype属性,new内部需要调用原函数的prototype属性;
2.new内部有改变this指向的操作,但是call()、bind()、apply()对箭头函数没有作用。

2.new原理 (1)原理 创建一个新对象使新对象的__proto__属性指向原函数的prototype改变this指向(指向新的obj),并执行该函数,执行结果保存到result判断函数执行有没有返回其他对象,如果有就返回其他对象result,如果没有就返回原对象obj (2)手写new function MyNew(fn) { // 创建一个新对象 const obj = {} // 让新对象的隐式属性__proto__指向原函数的显示属性property obj.__proto__ = fn.prototype // 改变this指向,指向obj,保存执行结果 const res = fn.call(obj) // 判断执行结果是否返回其他对象 if (typeof res === 'function' || typeof res === 'object') { return res } return obj} 3.箭头函数可以new吗?

答:不能。 因为:

1.箭头函数没有prototype属性,new内部需要调用原函数的prototype属性;2.new内部有改变this指向的操作,但是call()、bind()、apply()对箭头函数没有作用。

*面试这块的题目都是一层一层问下去的,上面的题目还可以延伸到call、apply、bind的区别,手写call,__proto__和prototype还可以延伸到原型和原型链,由原型链可以考察到instanceof原理……

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。