前端面试必备js知识

2023-12-15 18:19:09

在掘金查看该文章

箭头函数

箭头函数表达式的语法比函数表达式更简洁,并且没有自己的thisargumentssupernew.target。箭头函数表达式更适用于那些本来需要匿名函数的地方,并且它不能用作构造函数。

都说箭头函数不支持 new 运算符。这里实现一个new 运算符来研究下。

function myNew(){
   const obj = {}  // 1.创建一个空对象
   const con = [].shift.call(arguments)// 2.获取当前的构造函数
   if(typeof con !== 'function' || typeof con !== 'Function'){
        throw new TypeError('Type Error')
    }
   obj.__proto__ = con.prototype // 3.链接到构造函数的类型对象
   // 4.将新创建的对象obj作为`this`的上下文
   const res = con.apply(obj,arguments) 
   // 5. 如果有返回对象,原有的会被覆 //盖即下面的判断
  return res instanceof Object ? res : obj 
}

image.png

如我们的实现代码来看,实现中有用到 构造函数,而箭头函数没有构造函数,所以…,另外代码中有用到instanceof运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。也就是我们实现new 运算符中 obj.proto = con.prototype ,那我们来也来实现下。

function myInstanceof(left, right){
   let prototype = right.prototype
   let proto = left.__proto__
   
   // ES5的方法,可以获得对象的原型
   // let proto = Object.getPrototypeOf(left);
   
   while(true){ // 沿着原型链遍历
        if(proto === null || proto === undefined){
          return false
        }
        if(prototype === proto){
            return true
        }
        proto = proto.__proto__
    }
}

new.target

new.target 属性允许你检测函数或构造方法是否是通过new运算符被调用的。在通过new运算符被初始化的函数或构造方法中,new.target返回一个指向构造方法或函数的引用。在普通的函数调用中,new.target 的值是undefined

image.png

arguments.callee

描述

calleearguments 对象的一个属性。它可以用于引用该函数的函数体内当前正在执行的函数。这在函数的名称是未知时很有用,例如在没有名称的函数表达式 (也称为“匿名函数”)内

早期版本的 JavaScript不允许使用命名函数表达式,出于这样的原因, 你不能创建一个递归函数表达式;

ECMAScript 3 通过允许命名函数表达式解决这些问题

function foo(){ 
  console.log(arguments)
}
undefined
foo()

1.  Arguments [callee: ?, Symbol(Symbol.iterator): ?]
1.  1.  callee: ? foo()
    1.  length: 0
    1.  Symbol(Symbol.iterator): ? values()
    1.  [[Prototype]]: Object

image.png

在严格模式下不支持使用arguments.callee,报TypeError错误。

image.png

Function.caller

描述

如果一个函数f是在全局作用域内被调用的,则f.caller为``null,相反,如果一个函数是在另外一个函数作用域内被调用的,则f.caller指向调用它的那个函数.

该属性的常用形式arguments.callee.caller替代了被废弃的 arguments.caller.

Function.caller目前被所有主流浏览器支持: Firefox, Safari, Chrome, Opera 和 IE.

image.png
参考:

https://developer.mozilla.org/zh-CN/docs/web/javascript/reference/functions/arguments/callee

https://juejin.cn/post/7086347680342867976

文章来源:https://blog.csdn.net/Bruce__taotao/article/details/135019811
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。